SWDEV-539805, SWDEV-553860 - Resolve GCC clang ABI mismatch and check vector alignment (#909)

* SWDEV-539805 - Add checks for vector alignment and size

* SWDEV-553860 - Alter alignment for gcc

* SWDEV-553860 - Align fallback method

* SWDEV-553860 - Alter alignment requirement
Αυτή η υποβολή περιλαμβάνεται σε:
AidanBeltonS
2025-09-16 17:10:14 +01:00
υποβλήθηκε από GitHub
γονέας 857e5ef3ce
υποβολή bf662640ee
2 αρχεία άλλαξαν με 196 προσθήκες και 13 διαγραφές
@@ -41,7 +41,7 @@ THE SOFTWARE.
#define __HIP_USE_NATIVE_VECTOR__ 1
#define __NATIVE_VECTOR__(n, T) T __attribute__((ext_vector_type(n)))
#else
#define __NATIVE_VECTOR__(n, T) alignas(__hip_vec_align_v<T, n>()) T[n]
#define __NATIVE_VECTOR__(n, T) alignas(n * sizeof(T)) T[n]
#endif
#if defined(__cplusplus)
@@ -51,10 +51,6 @@ THE SOFTWARE.
#include <type_traits>
#endif // defined(__HIPCC_RTC__)
template <class T, int _hip_N> constexpr __hip_internal::size_t __hip_vec_align_v() {
return (_hip_N == 4 && alignof(T) == 8) ? 16 : _hip_N * alignof(T);
}
template <typename T, unsigned int n> struct HIP_vector_base;
template <typename T, unsigned int rank> struct HIP_vector_type;
@@ -63,8 +59,9 @@ template <typename T, unsigned int n> __attribute__((always_inline)) __HOST_DEVI
typename HIP_vector_base<T, n>::Native_vec_*
get_native_pointer(HIP_vector_base<T, n>& base_vec) {
static_assert(sizeof(base_vec) == sizeof(typename HIP_vector_base<T, n>::Native_vec_));
static_assert(__hip_internal::alignment_of<HIP_vector_base<T, n>>::value ==
__hip_internal::alignment_of<typename HIP_vector_base<T, n>::Native_vec_>::value);
static_assert(
(__hip_internal::alignment_of<HIP_vector_base<T, n>>::value %
__hip_internal::alignment_of<typename HIP_vector_base<T, n>::Native_vec_>::value) == 0);
return reinterpret_cast<typename HIP_vector_base<T, n>::Native_vec_*>(&base_vec);
};
@@ -72,8 +69,9 @@ template <typename T, unsigned int n>
__attribute__((always_inline)) __HOST_DEVICE__ const typename HIP_vector_base<T, n>::Native_vec_*
get_native_pointer(const HIP_vector_base<T, n>& base_vec) {
static_assert(sizeof(base_vec) == sizeof(typename HIP_vector_base<T, n>::Native_vec_));
static_assert(__hip_internal::alignment_of<HIP_vector_base<T, n>>::value ==
__hip_internal::alignment_of<typename HIP_vector_base<T, n>::Native_vec_>::value);
static_assert(
(__hip_internal::alignment_of<HIP_vector_base<T, n>>::value %
__hip_internal::alignment_of<typename HIP_vector_base<T, n>::Native_vec_>::value) == 0);
return reinterpret_cast<const typename HIP_vector_base<T, n>::Native_vec_*>(&base_vec);
};
} // Namespace hip_impl.
@@ -111,7 +109,7 @@ template <typename T> struct HIP_vector_base<T, 1> {
HIP_vector_base& operator=(const HIP_vector_base&) = default;
};
template <typename T> struct alignas(alignof(__NATIVE_VECTOR__(2, T))) HIP_vector_base<T, 2> {
template <typename T> struct alignas(2 * sizeof(T)) HIP_vector_base<T, 2> {
using Native_vec_ = __NATIVE_VECTOR__(2, T);
T x, y;
@@ -268,7 +266,7 @@ template <typename T> struct HIP_vector_base<T, 3> {
HIP_vector_base& operator=(HIP_vector_base&&) = default;
};
template <typename T> struct alignas(__NATIVE_VECTOR__(4, T)) HIP_vector_base<T, 4> {
template <typename T> struct alignas(4 * sizeof(T)) HIP_vector_base<T, 4> {
using Native_vec_ = __NATIVE_VECTOR__(4, T);
T x, y, z, w;