12 #if CK_TILE_THREAD_BUFFER_DEFAULT == CK_TILE_THREAD_BUFFER_USE_TUPLE
13 template <
typename T, index_t N>
16 template <
typename... Ts>
24 template <
typename T, index_t N>
27 template <
typename... Ts>
36 template<
typename T_, index_t N_>
38 using value_type = remove_cvref_t<T_>;
39 static constexpr
index_t N = N_;
58 template <index_t I>
CK_TILE_HOST_DEVICE constexpr
const auto& at()
const {
return get(I); }
60 template <index_t I>
CK_TILE_HOST_DEVICE constexpr
const auto& at(number<I>)
const {
return get(I); }
62 template <
typename X_,
63 typename std::enable_if<has_same_scalar_type<value_type, X_>::value,
bool>::type =
false>
66 using X = remove_cvref_t<X_>;
69 static_assert(N % kSPerX == 0);
74 value_type sub_data[N];
76 static_for<0, N, 1>{}(
77 [&](
auto j) { vx.sub_data[j] = data[j]; });
81 template <
typename X_,
83 typename std::enable_if<has_same_scalar_type<value_type, X_>::value,
bool>::type =
false>
86 using X = remove_cvref_t<X_>;
92 tuple_array<value_type, kSPerX> sub_data;
94 static_for<0, kSPerX, 1>{}(
95 [&](
auto j) { vx.sub_data(j) = operator[]((is *
number<
sizeof(X_)/
sizeof(value_type)>{}) + j); });
100 template <
typename X_,
102 typename std::enable_if<has_same_scalar_type<value_type, X_>::value,
bool>::type =
false>
105 using X = remove_cvref_t<X_>;
111 tuple_array<value_type, kSPerX> sub_data;
114 static_for<0, kSPerX, 1>{}(
115 [&](
auto j) { operator()((is *
number<
sizeof(X_)/
sizeof(value_type)>{}) + j) = vx.sub_data[j]; });
120 #define TB_COMMON_AS() \
121 static_assert(sizeof(value_type) * N % sizeof(Tx) == 0); \
122 constexpr int vx = sizeof(value_type) * N / sizeof(Tx)
124 template<
typename Tx>
126 return reinterpret_cast<thread_buffer<Tx, vx>&
>(data);}
127 template<
typename Tx>
129 if constexpr(
sizeof(value_type) <= 1 )
130 return _get_as<Tx>();
132 return reinterpret_cast<const
thread_buffer<Tx, vx>&>(data);}
133 template<typename Tx,
index_t I>
135 return reinterpret_cast<thread_buffer<Tx, vx>&
>(data).get(number<I>{});}
136 template<
typename Tx, index_t I>
138 if constexpr(
sizeof(value_type) <= 1 )
139 return _get_as<Tx>(
number<I>{});
141 return reinterpret_cast<const thread_buffer<Tx, vx>&
>(data).get(number<I>{});}
144 { TB_COMMON_AS();
reinterpret_cast<thread_buffer<Tx, vx>&
>(data).at(i) = x; }
145 template <
typename Tx, index_t I>
CK_TILE_HOST_DEVICE constexpr
void set_as(number<I>,
const Tx & x)
146 { TB_COMMON_AS();
reinterpret_cast<thread_buffer<Tx, vx>&
>(data).at(number<I>{}) = x; }
153 struct vector_traits;
156 template <
typename T, index_t N>
159 using scalar_type = T;
160 static constexpr
index_t vector_size = N;
#define CK_TILE_HOST_DEVICE
Definition: config.hpp:41
Definition: cluster_descriptor.hpp:13
tuple_array< T, N > thread_buffer
Definition: thread_buffer.hpp:14
typename impl::tuple_array_impl< T, N >::type tuple_array
Definition: tuple.hpp:28
int32_t index_t
Definition: integer.hpp:9
constexpr CK_TILE_HOST_DEVICE details::return_type< D, Ts... > make_array(Ts &&... ts)
Definition: array.hpp:197
constant< v > number
Definition: integral_constant.hpp:33
constexpr CK_TILE_HOST_DEVICE auto make_thread_buffer(Ts &&... ts)
Definition: thread_buffer.hpp:17
constexpr CK_TILE_HOST_DEVICE auto make_tuple(Xs &&... xs)
Definition: tuple.hpp:337
static constexpr index_t vector_size
Definition: vector_type.hpp:62