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
Αυτή η υποβολή περιλαμβάνεται σε:
@@ -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;
|
||||
|
||||
Αναφορά σε νέο ζήτημα
Block a user