@@ -51,31 +51,45 @@ THE SOFTWARE.
51
51
#include < type_traits>
52
52
#endif // defined(__HIPCC_RTC__)
53
53
54
- namespace hip_impl {
55
- inline
56
- constexpr
57
- unsigned int next_pot (unsigned int x) {
58
- // Precondition: x > 1.
59
- return 1u << (32u - __builtin_clz (x - 1u ));
60
- }
61
- } // Namespace hip_impl.
54
+ template <typename T, unsigned int n> struct HIP_vector_base ;
55
+ template <typename T, unsigned int rank> struct HIP_vector_type ;
56
+
57
+ namespace hip_impl {
58
+ inline constexpr unsigned int next_pot (unsigned int x) {
59
+ // Precondition: x > 1.
60
+ return 1u << (32u - __builtin_clz (x - 1u ));
61
+ }
62
+
63
+ template <typename T, unsigned int n>
64
+ __attribute__ ((always_inline)) __HOST_DEVICE__ typename HIP_vector_base<T, n>::Native_vec_*
65
+ get_native_pointer (HIP_vector_base<T, n>& base_vec) {
66
+ static_assert (sizeof (base_vec) == sizeof (typename HIP_vector_base<T, n>::Native_vec_));
67
+ static_assert (std::alignment_of<HIP_vector_base<T, n>>::value ==
68
+ std::alignment_of<typename HIP_vector_base<T, n>::Native_vec_>::value);
69
+ return reinterpret_cast <typename HIP_vector_base<T, n>::Native_vec_*>(&base_vec.x );
70
+ };
62
71
63
- template <typename T, unsigned int n> struct HIP_vector_base ;
64
- template <typename T, unsigned int rank> struct HIP_vector_type ;
72
+ template <typename T, unsigned int n>
73
+ __attribute__ ((always_inline)) __HOST_DEVICE__ const typename HIP_vector_base<T, n>::Native_vec_*
74
+ get_native_pointer (const HIP_vector_base<T, n>& base_vec) {
75
+ static_assert (sizeof (base_vec) == sizeof (typename HIP_vector_base<T, n>::Native_vec_));
76
+ static_assert (std::alignment_of<HIP_vector_base<T, n>>::value ==
77
+ std::alignment_of<typename HIP_vector_base<T, n>::Native_vec_>::value);
78
+ return reinterpret_cast <const typename HIP_vector_base<T, n>::Native_vec_*>(&base_vec.x );
79
+ };
80
+ } // Namespace hip_impl.
65
81
66
82
template <typename T, unsigned int n>
67
83
__attribute__ ((always_inline)) __HOST_DEVICE__ typename HIP_vector_base<T, n>::Native_vec_&
68
84
get_native_vector(HIP_vector_base<T, n>& base_vec) {
69
- static_assert (sizeof (base_vec) == sizeof (typename HIP_vector_base<T, n>::Native_vec_));
70
- return *reinterpret_cast <typename HIP_vector_base<T, n>::Native_vec_*>(&base_vec.x );
85
+ return *hip_impl::get_native_pointer (base_vec);
71
86
};
72
87
73
88
template <typename T, unsigned int n>
74
89
__attribute__ ((
75
90
always_inline)) __HOST_DEVICE__ const typename HIP_vector_base<T, n>::Native_vec_&
76
91
get_native_vector(const HIP_vector_base<T, n>& base_vec) {
77
- static_assert (sizeof (base_vec) == sizeof (typename HIP_vector_base<T, n>::Native_vec_));
78
- return *reinterpret_cast <const typename HIP_vector_base<T, n>::Native_vec_*>(&base_vec.x );
92
+ return *hip_impl::get_native_pointer (base_vec);
79
93
};
80
94
81
95
template <typename T>
@@ -349,6 +363,13 @@ THE SOFTWARE.
349
363
HIP_vector_type& operator =(HIP_vector_type&&) = default ;
350
364
351
365
// Operators
366
+ __HOST_DEVICE__
367
+ T& operator [](size_t idx) noexcept { return (*hip_impl::get_native_pointer (*this ))[idx]; }
368
+ __HOST_DEVICE__
369
+ const T& operator [](size_t idx) const noexcept {
370
+ return (*hip_impl::get_native_pointer (*this ))[idx];
371
+ }
372
+
352
373
__HOST_DEVICE__
353
374
HIP_vector_type& operator ++() noexcept {
354
375
HIP_vector_type unity = make_vector_type<T, rank>(1 );
0 commit comments