array.hpp Source File

array.hpp Source File#

Composable Kernel: array.hpp Source File
tile/core/container/array.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved.
3
4#pragma once
5
6#include <initializer_list>
7#include <vector>
8
14
15namespace ck_tile {
16
17// use aggregate initialization for this type
18// e.g. array<index_t, 4> buf {0}; => {0, 0, 0, 0}, clean
19// array<index_t, 4> buf {3, 2}; => {3, 2, 2, 2} (not {3,2,0,0})
20// use make_array_with({...}) to construct an array with compatible behavior as old ck
21// TODO: manually added constructor same as old ck
41template <typename T_, index_t N_>
42struct array
43{
44 using value_type = T_;
45 static constexpr index_t N = N_;
46 // TODO: do we need this?
47 // using bulk_type = uint8_t __attribute__((ext_vector_type(N * sizeof(value_type))));
48 // union {
50 // bulk_type __content;
51 //};
52 CK_TILE_HOST_DEVICE constexpr array() : data{} {}
53 // TODO: will initialize the data[] with the last value repeatedly
54 // behavior different from std
55 CK_TILE_HOST_DEVICE constexpr array(std::initializer_list<value_type> ilist)
56 {
57 constexpr index_t list_size = std::initializer_list<value_type>{}.size();
58 static_assert(list_size <= N, "out of bound");
59
60 index_t i = 0;
61 value_type vlast = value_type{};
62
63 for(const value_type& val : ilist)
64 {
65 data[i] = val;
66 vlast = val;
67 ++i;
68 }
69 for(; i < N; ++i)
70 {
71 data[i] = vlast;
72 }
73 }
74
75 template <typename Y,
76 typename = std::enable_if_t<std::is_convertible_v<Y, value_type> ||
77 std::is_constructible_v<Y, value_type>>>
78 CK_TILE_HOST_DEVICE explicit constexpr array(Y c)
79 {
80 for(auto i = 0; i < size(); i++)
81 data[i] = static_cast<value_type>(c);
82 }
83
84 // template <typename Y>
85 // CK_TILE_HOST_DEVICE constexpr array(const array& o)
86 // {
87 // // static_assert(ArrayType::size() == size(), "wrong! size not the same");
88 // __content = o.__content;
89 // }
90 // CK_TILE_HOST_DEVICE constexpr array& operator=(const array& o)
91 // {
92 // // static_assert(ArrayType::size() == size(), "wrong! size not the same");
93 // __content = o.__content;
94 // return *this;
95 // }
96
97 CK_TILE_HOST_DEVICE static constexpr auto size() { return N; }
98 CK_TILE_HOST_DEVICE static constexpr bool is_static() { return is_static_v<value_type>; }
99
100 // clang-format off
101 CK_TILE_HOST_DEVICE constexpr auto& get() { return data; }
102 CK_TILE_HOST_DEVICE constexpr const auto& get() const { return data; }
103 CK_TILE_HOST_DEVICE constexpr auto& get(index_t i) { return data[i]; }
104 CK_TILE_HOST_DEVICE constexpr const auto& get(index_t i) const { return data[i]; }
105 template <index_t I> CK_TILE_HOST_DEVICE constexpr auto& get() { return data[I]; }
106 template <index_t I> CK_TILE_HOST_DEVICE constexpr const auto& get() const { return data[I]; }
107 template <index_t I> CK_TILE_HOST_DEVICE constexpr auto& get(number<I>) { return data[I]; }
108 template <index_t I> CK_TILE_HOST_DEVICE constexpr const auto& get(number<I>) const { return data[I]; }
109
110 CK_TILE_HOST_DEVICE constexpr auto& at(index_t i) { return get(i); }
111 CK_TILE_HOST_DEVICE constexpr const auto& at(index_t i) const { return get(i); }
112 template <index_t I> CK_TILE_HOST_DEVICE constexpr auto& at() { return get(I); }
113 template <index_t I> CK_TILE_HOST_DEVICE constexpr const auto& at() const { return get(I); }
114 template <index_t I> CK_TILE_HOST_DEVICE constexpr auto& at(number<I>) { return get(I); }
115 template <index_t I> CK_TILE_HOST_DEVICE constexpr const auto& at(number<I>) const { return get(I); }
116
117 CK_TILE_HOST_DEVICE constexpr const value_type& operator[](index_t i) const { return get(i); }
119 CK_TILE_HOST_DEVICE constexpr value_type& operator()(index_t i) { return get(i); } // TODO: compatible
120#if 0
121 template <typename ArrayLike>
122 CK_TILE_HOST_DEVICE constexpr auto operator=(const ArrayLike& arr)
123 {
124 static_assert(ArrayLike::size() == size(), "wrong! size not the same");
125 for(index_t i = 0; i < size(); ++i)
126 {
127 data[i] = arr[i];
128 }
129 return *this;
130 }
131#endif
132 // type punning (strict aliasing) member functions for read/write
133 // aliasing this array of type "T", "N" elements
134 // as array of type "Tx", sizeof(T)*N/sizeof(Tx) elements
135#define AR_AS_COM_() \
136 static_assert(sizeof(value_type) * N % sizeof(Tx) == 0); \
137 constexpr int vx = sizeof(value_type) * N / sizeof(Tx)
138
139 template <typename Tx> CK_TILE_HOST_DEVICE constexpr auto& get_as()
140 { AR_AS_COM_(); return reinterpret_cast<array<Tx, vx>&>(data); }
141 template <typename Tx> CK_TILE_HOST_DEVICE constexpr const auto& get_as() const
142 { AR_AS_COM_(); return reinterpret_cast<const array<Tx, vx>&>(data); }
143
144 // below index is for index *AFTER* type convert, not before
145 template <typename Tx> CK_TILE_HOST_DEVICE constexpr auto& get_as(index_t i)
146 { AR_AS_COM_(); return reinterpret_cast<array<Tx, vx>&>(data).at(i); }
147 template <typename Tx> CK_TILE_HOST_DEVICE constexpr const auto& get_as(index_t i) const
148 { AR_AS_COM_(); return reinterpret_cast<const array<Tx, vx>&>(data).at(i); }
149 template <typename Tx, index_t I> CK_TILE_HOST_DEVICE constexpr auto& get_as(number<I>)
150 { AR_AS_COM_(); return reinterpret_cast<array<Tx, vx>&>(data).at(number<I>{}); }
151 template <typename Tx, index_t I> CK_TILE_HOST_DEVICE constexpr const auto& get_as(number<I>) const
152 { AR_AS_COM_(); return reinterpret_cast<const array<Tx, vx>&>(data).at(number<I>{}); }
153
154 template <typename Tx> CK_TILE_HOST_DEVICE constexpr void set_as(index_t i, const Tx & x)
155 { AR_AS_COM_(); reinterpret_cast<array<Tx, vx>&>(data).at(i) = x; }
156 template <typename Tx, index_t I> CK_TILE_HOST_DEVICE constexpr void set_as(number<I>, const Tx & x)
157 { AR_AS_COM_(); reinterpret_cast<array<Tx, vx>&>(data).at(number<I>{}) = x; }
158#undef AR_AS_COM_
159 // clang-format on
160};
161
162// empty Array
163
172template <typename T>
173struct array<T, 0>
174{
175 using value_type = T;
176
178 CK_TILE_HOST_DEVICE static constexpr index_t size() { return 0; }
179 CK_TILE_HOST_DEVICE static constexpr bool is_static() { return is_static_v<T>; };
180};
181
182template <typename T, index_t N>
183CK_TILE_HOST_DEVICE static void print(const array<T, N>& a)
184{
185 printf("array{size: %ld, data: [", static_cast<long>(N));
186 for(index_t i = 0; i < N; ++i)
187 {
188 if(i > 0)
189 printf(", ");
190 print(a[i]);
191 }
192 printf("]}");
193}
194
195template <typename T>
196CK_TILE_HOST_DEVICE static void print(const array<T, 0>&)
197{
198 printf("array{size: 0, data: []}");
199}
200
201template <typename, typename>
202struct vector_traits;
203
204// specialization for array
205template <typename T, index_t N>
206struct vector_traits<array<T, N>, void>
207{
208 using scalar_type = T;
209 static constexpr index_t vector_size = N;
210};
211
212namespace details {
213template <class>
214struct is_ref_wrapper : std::false_type
215{
216};
217template <class T>
218struct is_ref_wrapper<std::reference_wrapper<T>> : std::true_type
219{
220};
221
222template <class T>
223using not_ref_wrapper = std::negation<is_ref_wrapper<std::decay_t<T>>>;
224
225template <class D, class...>
227{
228 using type = D;
229};
230template <class... Ts>
231struct return_type_helper<void, Ts...> : std::common_type<Ts...>
232{
233 static_assert(std::conjunction_v<not_ref_wrapper<Ts>...>,
234 "Ts cannot contain reference_wrappers when D is void");
235};
236
237template <class D, class... Ts>
238using return_type = array<typename return_type_helper<D, Ts...>::type, sizeof...(Ts)>;
239} // namespace details
240
241template <typename D = void, typename... Ts>
243{
244 return {std::forward<Ts>(ts)...};
245}
246
247// // make empty array
248// template <typename T>
249// CK_TILE_HOST_DEVICE constexpr auto make_array()
250// {
251// return array<T, 0>{};
252// }
253
254// compatible with old ck's initializer, make an array and fill it withe the last element from
255// initializer_list
256template <typename T, index_t Size>
257CK_TILE_HOST_DEVICE constexpr auto make_array_with(std::initializer_list<T> ilist)
258{
259 return array<T, Size>(ilist);
260}
261
262template <typename T, index_t Size>
264{
265 bool same = true;
266
267 for(index_t i = 0; i < Size; ++i)
268 {
269 if(a[i] != b[i])
270 {
271 same = false;
272 break;
273 }
274 }
275
276 return same;
277}
278
279template <typename T, index_t Size>
281{
282 return !(a == b);
283}
284
285template <typename T, index_t N, typename X>
286CK_TILE_HOST_DEVICE constexpr auto to_array(const std::vector<X>& x)
287{
288 array<T, N> arr;
289
290 static_for<0, N, 1>{}([&x, &arr](auto i) { arr(i) = x[i]; });
291
292 return arr;
293}
294
295template <typename T, index_t N, typename X>
296CK_TILE_HOST_DEVICE constexpr auto to_array(const X& x)
297{
298 static_assert(N <= X::size(), "");
299
300 array<T, N> arr;
301
302 static_for<0, N, 1>{}([&x, &arr](auto i) { arr(i) = x[i]; });
303
304 return arr;
305}
306
307} // namespace ck_tile
#define CK_TILE_HOST_DEVICE
Definition config.hpp:42
Definition tile/core/container/array.hpp:212
std::negation< is_ref_wrapper< std::decay_t< T > > > not_ref_wrapper
Definition tile/core/container/array.hpp:223
array< typename return_type_helper< D, Ts... >::type, sizeof...(Ts)> return_type
Definition tile/core/container/array.hpp:238
Definition tile/core/algorithm/cluster_descriptor.hpp:13
CK_TILE_HOST_DEVICE constexpr auto make_array_with(std::initializer_list< T > ilist)
Definition tile/core/container/array.hpp:257
constant< v > number
Definition tile/core/numeric/integral_constant.hpp:37
CK_TILE_HOST_DEVICE constexpr auto to_array(const std::vector< X > &x)
Definition tile/core/container/array.hpp:286
constexpr bool is_static_v
Definition type_traits.hpp:90
int32_t index_t
Definition integer.hpp:9
CK_TILE_HOST_DEVICE constexpr bool operator==(const array< T, Size > &a, const array< T, Size > &b)
Definition tile/core/container/array.hpp:263
CK_TILE_HOST_DEVICE constexpr details::return_type< D, Ts... > make_array(Ts &&... ts)
Definition tile/core/container/array.hpp:242
CK_TILE_HOST_DEVICE constexpr bool operator!=(const array< T, Size > &a, const array< T, Size > &b)
Definition tile/core/container/array.hpp:280
STL namespace.
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition pointer.h:1517
static CK_TILE_HOST_DEVICE constexpr index_t size()
Definition tile/core/container/array.hpp:178
CK_TILE_HOST_DEVICE constexpr array()
Definition tile/core/container/array.hpp:177
static CK_TILE_HOST_DEVICE constexpr bool is_static()
Definition tile/core/container/array.hpp:179
T value_type
Definition tile/core/container/array.hpp:175
A fixed-size array container similar to std::array with additional utilities.
Definition tile/core/container/array.hpp:43
CK_TILE_HOST_DEVICE constexpr auto & get(number< I >)
Definition tile/core/container/array.hpp:107
CK_TILE_HOST_DEVICE constexpr array(std::initializer_list< value_type > ilist)
Definition tile/core/container/array.hpp:55
CK_TILE_HOST_DEVICE constexpr auto & get_as(number< I >)
Definition tile/core/container/array.hpp:149
CK_TILE_HOST_DEVICE constexpr void set_as(number< I >, const Tx &x)
Definition tile/core/container/array.hpp:156
static constexpr index_t N
Definition tile/core/container/array.hpp:45
static CK_TILE_HOST_DEVICE constexpr bool is_static()
Definition tile/core/container/array.hpp:98
CK_TILE_HOST_DEVICE constexpr auto & get_as()
Definition tile/core/container/array.hpp:139
value_type data[N]
Definition tile/core/container/array.hpp:49
CK_TILE_HOST_DEVICE constexpr const auto & at(number< I >) const
Definition tile/core/container/array.hpp:115
CK_TILE_HOST_DEVICE constexpr const auto & get(number< I >) const
Definition tile/core/container/array.hpp:108
CK_TILE_HOST_DEVICE constexpr auto & at(index_t i)
Definition tile/core/container/array.hpp:110
CK_TILE_HOST_DEVICE constexpr value_type & operator()(index_t i)
Definition tile/core/container/array.hpp:119
CK_TILE_HOST_DEVICE constexpr const auto & get() const
Definition tile/core/container/array.hpp:106
CK_TILE_HOST_DEVICE constexpr const auto & get_as(index_t i) const
Definition tile/core/container/array.hpp:147
CK_TILE_HOST_DEVICE constexpr auto & get_as(index_t i)
Definition tile/core/container/array.hpp:145
T_ value_type
Definition tile/core/container/array.hpp:44
CK_TILE_HOST_DEVICE constexpr array()
Definition tile/core/container/array.hpp:52
CK_TILE_HOST_DEVICE constexpr auto & at()
Definition tile/core/container/array.hpp:112
CK_TILE_HOST_DEVICE constexpr auto & get()
Definition tile/core/container/array.hpp:101
CK_TILE_HOST_DEVICE constexpr const auto & at(index_t i) const
Definition tile/core/container/array.hpp:111
CK_TILE_HOST_DEVICE constexpr auto & get()
Definition tile/core/container/array.hpp:105
CK_TILE_HOST_DEVICE constexpr const auto & get(index_t i) const
Definition tile/core/container/array.hpp:104
static CK_TILE_HOST_DEVICE constexpr auto size()
Definition tile/core/container/array.hpp:97
CK_TILE_HOST_DEVICE constexpr const auto & get_as() const
Definition tile/core/container/array.hpp:141
CK_TILE_HOST_DEVICE constexpr const auto & at() const
Definition tile/core/container/array.hpp:113
CK_TILE_HOST_DEVICE constexpr auto & at(number< I >)
Definition tile/core/container/array.hpp:114
CK_TILE_HOST_DEVICE constexpr const auto & get_as(number< I >) const
Definition tile/core/container/array.hpp:151
CK_TILE_HOST_DEVICE constexpr const value_type & operator[](index_t i) const
Definition tile/core/container/array.hpp:117
CK_TILE_HOST_DEVICE constexpr void set_as(index_t i, const Tx &x)
Definition tile/core/container/array.hpp:154
CK_TILE_HOST_DEVICE constexpr value_type & operator[](index_t i)
Definition tile/core/container/array.hpp:118
CK_TILE_HOST_DEVICE constexpr array(Y c)
Definition tile/core/container/array.hpp:78
CK_TILE_HOST_DEVICE constexpr const auto & get() const
Definition tile/core/container/array.hpp:102
CK_TILE_HOST_DEVICE constexpr auto & get(index_t i)
Definition tile/core/container/array.hpp:103
Definition tile/core/container/array.hpp:215
Definition tile/core/container/array.hpp:227
D type
Definition tile/core/container/array.hpp:228
Definition tile/core/utility/functional.hpp:43
static constexpr index_t vector_size
Definition tile/core/container/array.hpp:209
T scalar_type
Definition tile/core/container/array.hpp:208
Definition vector_type.hpp:90
#define AR_AS_COM_()
Definition tile/core/container/array.hpp:135