tensor_descriptor.hpp Source File

tensor_descriptor.hpp Source File#

Composable Kernel: tensor_descriptor.hpp Source File
tile/core/tensor/tensor_descriptor.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
15
16namespace ck_tile {
17
18// Transforms: Tuple<transforms...>
19// LowerDimensionHiddenIdss : Tuple<sequence<...>, ...>
20// UpperDimensionHiddenIdss : Tuple<sequence<...>, ...>
21// TopDimensionHiddenIds> : sequence<...>
22template <typename Transforms,
23 typename LowerDimensionHiddenIdss,
24 typename UpperDimensionHiddenIdss,
25 typename TopDimensionHiddenIds,
26 typename ElementSpaceSize,
27 typename GuaranteedVectorLengths_,
28 typename GuaranteedVectorSrides_>
29struct tensor_descriptor : public tensor_adaptor<Transforms,
30 LowerDimensionHiddenIdss,
31 UpperDimensionHiddenIdss,
32 sequence<0>,
33 TopDimensionHiddenIds>
34{
35 using Base = tensor_adaptor<Transforms,
36 LowerDimensionHiddenIdss,
37 UpperDimensionHiddenIdss,
39 TopDimensionHiddenIds>;
40
41 using ElementSpaceSizeType = ElementSpaceSize;
42
46
47 using GuaranteedVectorLengths = GuaranteedVectorLengths_;
48 using GuaranteedVectorStrides = GuaranteedVectorSrides_;
49
50 static_assert(GuaranteedVectorLengths::size() == ndim_hidden_ &&
51 GuaranteedVectorStrides::size() == ndim_hidden_,
52 "wrong! inconsistent # of hidden dimensions");
53
56
57 public:
59
60 CK_TILE_HOST_DEVICE constexpr tensor_descriptor(const Transforms& transforms,
61 ElementSpaceSize element_space_size)
62 : Base{transforms}, element_space_size_{element_space_size}
63
64 {
65 static_assert(Transforms::size() == ntransform_ &&
66 LowerDimensionHiddenIdss::size() == ntransform_ &&
67 UpperDimensionHiddenIdss::size() == ntransform_,
68 "wrong! inconsistent # of transformations");
69
70 // TODO check dependency of dimensions is valid
71 }
72
73 // construct from tensor_adaptor base class
74 CK_TILE_HOST_DEVICE constexpr tensor_descriptor(const Base& adaptor,
75 ElementSpaceSize element_space_size)
76 : Base{adaptor}, element_space_size_{element_space_size}
77 {
78 }
79
84
85 template <index_t IDim>
86 CK_TILE_HOST_DEVICE constexpr auto get_length(number<IDim> idim) const
87 {
89 }
90
91 CK_TILE_HOST_DEVICE constexpr auto get_lengths() const
92 {
94 }
95
97 {
99 }
100
101 template <typename Idx>
102 CK_TILE_HOST_DEVICE constexpr index_t calculate_offset(const Idx& idx) const
103 {
105 }
106
107 // TODO make these private
108 CK_TILE_HOST_DEVICE constexpr const auto& get_transforms() const
109 {
110 return Base::get_transforms();
111 }
112
117
122
127
133
134 CK_TILE_HOST_DEVICE static constexpr bool is_known_at_compile_time() { return is_static(); }
135
136 template <index_t Internal = 0>
143
144 // TODO make these private
145 ElementSpaceSize element_space_size_;
146};
147
148template <typename Transforms,
149 typename LowerDimensionHiddenIdss,
150 typename UpperDimensionHiddenIdss,
151 typename TopDimensionHiddenIds,
152 typename ElementSpaceSize,
153 typename GuaranteedVectorLengths,
154 typename GuaranteedVectorStrides>
155CK_TILE_HOST_DEVICE static void print(const tensor_descriptor<Transforms,
156 LowerDimensionHiddenIdss,
157 UpperDimensionHiddenIdss,
158 TopDimensionHiddenIds,
159 ElementSpaceSize,
160 GuaranteedVectorLengths,
161 GuaranteedVectorStrides>& descriptor)
162{
163 printf("tensor_descriptor{\n");
164 // first print the tensor adaptor part of the descriptor using the base class print
165 using Base = typename tensor_descriptor<Transforms,
166 LowerDimensionHiddenIdss,
167 UpperDimensionHiddenIdss,
168 TopDimensionHiddenIds,
169 ElementSpaceSize,
170 GuaranteedVectorLengths,
171 GuaranteedVectorStrides>::Base;
172 print(static_cast<const Base&>(descriptor));
173 printf("element_space_size_: %ld,\n", static_cast<long>(descriptor.get_element_space_size()));
174 printf("guaranteed_vector_lengths: ");
175 print(GuaranteedVectorLengths{});
176 printf(",\nguaranteed_vector_strides: ");
177 print(GuaranteedVectorStrides{});
178 printf("}\n}\n");
179}
180
181template <typename Adaptor, typename ElementSpaceSize>
182CK_TILE_HOST_DEVICE constexpr auto
184 const ElementSpaceSize& element_space_size)
185{
186 constexpr index_t NDimHidden = Adaptor::get_num_of_hidden_dimension();
187
188 return tensor_descriptor<remove_cvref_t<decltype(adaptor.get_transforms())>,
189 remove_cvref_t<decltype(adaptor.get_lower_dimension_hidden_idss())>,
190 remove_cvref_t<decltype(adaptor.get_upper_dimension_hidden_idss())>,
191 remove_cvref_t<decltype(adaptor.get_top_dimension_hidden_ids())>,
192 remove_cvref_t<decltype(element_space_size)>,
195 adaptor, element_space_size};
196}
197
198template <typename OldTensorDescriptor,
199 typename NewTransforms,
200 typename NewLowerDimensionOldTopIdss,
201 typename NewUpperDimensionNewTopIdss>
202CK_TILE_HOST_DEVICE constexpr auto
203transform_tensor_descriptor(const OldTensorDescriptor& old_tensor_desc,
204 const NewTransforms& new_transforms,
205 NewLowerDimensionOldTopIdss,
206 NewUpperDimensionNewTopIdss)
207{
208 const auto element_space_size = old_tensor_desc.get_element_space_size();
209
210 const auto new_tensor_adaptor = transform_tensor_adaptor(old_tensor_desc,
211 new_transforms,
212 NewLowerDimensionOldTopIdss{},
213 NewUpperDimensionNewTopIdss{});
214
215 constexpr index_t NDimHiddenOld = OldTensorDescriptor::get_num_of_hidden_dimension();
216 constexpr index_t NDimHiddenNew = decltype(new_tensor_adaptor)::get_num_of_hidden_dimension();
217
218 using NewGuaranteedVectorLengths = typename sequence_merge<
219 typename OldTensorDescriptor::GuaranteedVectorLengths,
220 typename uniform_sequence_gen<NDimHiddenNew - NDimHiddenOld, -1>::type>::type;
221
222 using NewGuaranteedVectorStrides = typename sequence_merge<
223 typename OldTensorDescriptor::GuaranteedVectorStrides,
224 typename uniform_sequence_gen<NDimHiddenNew - NDimHiddenOld, -1>::type>::type;
225
226 return tensor_descriptor<
227 remove_cvref_t<decltype(new_tensor_adaptor.get_transforms())>,
228 remove_cvref_t<decltype(new_tensor_adaptor.get_lower_dimension_hidden_idss())>,
229 remove_cvref_t<decltype(new_tensor_adaptor.get_upper_dimension_hidden_idss())>,
230 remove_cvref_t<decltype(new_tensor_adaptor.get_top_dimension_hidden_ids())>,
231 remove_cvref_t<decltype(element_space_size)>,
232 NewGuaranteedVectorLengths,
233 NewGuaranteedVectorStrides>{new_tensor_adaptor, element_space_size};
234}
235
236namespace detail {
237
238template <typename Lengths, typename Strides, index_t I, typename AccOld>
239CK_TILE_HOST_DEVICE constexpr auto calculate_element_space_size_impl(const Lengths& lengths,
240 const Strides& strides,
241 number<I> i,
242 AccOld acc_old)
243{
244 auto acc_new = acc_old + (lengths[i] - number<1>{}) * strides[i];
245
246 if constexpr(i.value < Lengths::size() - 1)
247 {
248 return calculate_element_space_size_impl(lengths, strides, i + number<1>{}, acc_new);
249 }
250 else
251 {
252 return acc_new;
253 }
254}
255
256} // namespace detail
257
258/*
259 * These functions create naive tensor descriptor
260 */
261
262// Lengths..., Strides... could be:
263// 1) index_t, which is known at run-time, or
264// 2) number<>, which is known at compile-time
265// element_space_size could be:
266// 1) long_index_t, or
267// 2) long_number<>
268template <typename... Lengths,
269 typename... Strides,
270 index_t GuaranteedLastDimensionVectorLength = -1,
271 index_t GuaranteedLastDimensionVectorStride = -1,
272 typename std::enable_if<sizeof...(Lengths) == sizeof...(Strides), bool>::type = false>
273CK_TILE_HOST_DEVICE constexpr auto
275 const tuple<Strides...>& strides,
278{
279 constexpr index_t N = sizeof...(Lengths);
280
281 const auto transforms = make_tuple(make_embed_transform(lengths, strides));
282
283 constexpr auto low_dim_hidden_idss = make_tuple(sequence<0>{});
284
285 constexpr auto up_dim_hidden_idss =
287
288 constexpr auto visible_dim_hidden_ids = typename arithmetic_sequence_gen<1, N + 1, 1>::type{};
289
290 const auto element_space_size =
292
293 using GuaranteedVectorLengths =
294 typename sequence_merge<typename uniform_sequence_gen<N, -1>::type,
296
297 using GuaranteedVectorStrides =
298 typename sequence_merge<typename uniform_sequence_gen<N, -1>::type,
300
301 return tensor_descriptor<remove_cv_t<decltype(transforms)>,
302 remove_cv_t<decltype(low_dim_hidden_idss)>,
303 remove_cv_t<decltype(up_dim_hidden_idss)>,
304 remove_cv_t<decltype(visible_dim_hidden_ids)>,
305 remove_cv_t<decltype(element_space_size)>,
306 GuaranteedVectorLengths,
307 GuaranteedVectorStrides>{transforms, element_space_size};
308}
309
310// tensor descriptor with offset, the offset will not be added into element space size
311// only have an information of the starting offset, and will impact on offset calculation
312template <typename... Lengths,
313 typename... Strides,
314 typename offset,
315 index_t GuaranteedLastDimensionVectorLength = -1,
316 index_t GuaranteedLastDimensionVectorStride = -1,
317 typename std::enable_if<sizeof...(Lengths) == sizeof...(Strides), bool>::type = false>
318CK_TILE_HOST_DEVICE constexpr auto
320 const tuple<Strides...>& strides,
321 const offset& os,
324{
325 const auto desc_0 = [&]() {
326 const auto element_space_size = detail::calculate_element_space_size_impl(
327 lengths, strides, number<0>{}, long_number<1>{});
328
329 const auto transforms = make_tuple(make_offset_transform(element_space_size, os));
330
331 constexpr auto low_dim_hidden_idss = make_tuple(sequence<0>{});
332
333 constexpr auto up_dim_hidden_idss = make_tuple(sequence<1>{});
334
335 constexpr auto visible_dim_hidden_ids = sequence<1>{};
336
337 using GuaranteedVectorLengths =
338 typename sequence_merge<typename uniform_sequence_gen<1, -1>::type,
340
341 using GuaranteedVectorStrides =
342 typename sequence_merge<typename uniform_sequence_gen<1, -1>::type,
344
345 return tensor_descriptor<remove_cv_t<decltype(transforms)>,
346 remove_cv_t<decltype(low_dim_hidden_idss)>,
347 remove_cv_t<decltype(up_dim_hidden_idss)>,
348 remove_cv_t<decltype(visible_dim_hidden_ids)>,
349 remove_cv_t<decltype(element_space_size)>,
350 GuaranteedVectorLengths,
351 GuaranteedVectorStrides>{transforms, element_space_size};
352 }();
353
354 constexpr index_t N = sizeof...(Lengths);
355
357 desc_0,
358 make_tuple(make_embed_transform(lengths, strides)),
361}
362
363// Lengths... could be:
364// 1) index_t, which is known at run-time, or
365// 2) number<>, which is known at compile-time
366// element_space_size could be:
367// 1) long_index_t, or
368// 2) long_number<>
369template <typename... Lengths, index_t GuaranteedLastDimensionVectorLength = -1>
370CK_TILE_HOST_DEVICE constexpr auto
373{
374 constexpr index_t N = sizeof...(Lengths);
375
376 const auto transforms = make_tuple(make_unmerge_transform(lengths));
377
378 constexpr auto low_dim_hidden_idss = make_tuple(sequence<0>{});
379
380 constexpr auto up_dim_hidden_idss =
382
383 constexpr auto visible_dim_hidden_ids = typename arithmetic_sequence_gen<1, N + 1, 1>::type{};
384
385 const auto element_space_size = container_reduce(lengths, multiplies{}, long_number<1>{});
386
387 constexpr index_t first_dim_length = []() {
388 if constexpr(is_constant_v<remove_cvref_t<decltype(element_space_size)>>)
389 return decltype(element_space_size)::value;
390 else
391 return -1;
392 }();
393 using last_t = remove_cvref_t<decltype(lengths.template get<N - 1>())>;
394 constexpr index_t last_dim_length = []() {
395 if constexpr(is_constant_v<last_t>)
396 return std::max(last_t::value, GuaranteedLastDimensionVectorLength);
397 else
398 return -1;
399 }();
400
401 using GuaranteedVectorLengths =
403 typename uniform_sequence_gen<N - 1, -1>::type,
405
406 using GuaranteedVectorStrides =
408 typename uniform_sequence_gen<N - 1, -1>::type,
409 sequence<1>>::type;
410
411 return tensor_descriptor<remove_cv_t<decltype(transforms)>,
412 remove_cv_t<decltype(low_dim_hidden_idss)>,
413 remove_cv_t<decltype(up_dim_hidden_idss)>,
414 remove_cv_t<decltype(visible_dim_hidden_ids)>,
415 remove_cv_t<decltype(element_space_size)>,
416 GuaranteedVectorLengths,
417 GuaranteedVectorStrides>{transforms, element_space_size};
418}
419
420template <typename... Lengths,
421 typename... Strides,
422 typename Offset,
423 index_t GuaranteedLastDimensionVectorLength = -1,
424 typename std::enable_if<sizeof...(Lengths) == sizeof...(Strides), bool>::type = false>
426 const tuple<Lengths...>& lengths,
427 const Offset& offset,
429{
430 const auto desc_0 = [&]() {
431 const auto element_space_size = container_reduce(lengths, multiplies{}, long_number<1>{});
432
433 const auto transforms = make_tuple(make_offset_transform(element_space_size, offset));
434
435 constexpr auto low_dim_hidden_idss = make_tuple(sequence<0>{});
436
437 constexpr auto up_dim_hidden_idss = make_tuple(sequence<1>{});
438
439 constexpr auto visible_dim_hidden_ids = sequence<1>{};
440
441 using GuaranteedVectorLengths =
442 typename sequence_merge<typename uniform_sequence_gen<1, -1>::type,
444
445 using GuaranteedVectorStrides =
446 typename sequence_merge<typename uniform_sequence_gen<1, -1>::type, sequence<1>>::type;
447
448 return tensor_descriptor<remove_cv_t<decltype(transforms)>,
449 remove_cv_t<decltype(low_dim_hidden_idss)>,
450 remove_cv_t<decltype(up_dim_hidden_idss)>,
451 remove_cv_t<decltype(visible_dim_hidden_ids)>,
452 remove_cv_t<decltype(element_space_size)>,
453 GuaranteedVectorLengths,
454 GuaranteedVectorStrides>{transforms, element_space_size};
455 }();
456
457 constexpr index_t N = sizeof...(Lengths);
458
460 desc_0,
464}
465
466// Lengths... could be:
467// 1) index_t, which is known at run-time, or
468// 2) number<>, which is known at compile-time
469// align could be:
470// 1) index_t, or
471// 2) number<>
472template <typename... Lengths, typename Align>
473CK_TILE_HOST_DEVICE constexpr auto
475{
476 constexpr auto I1 = number<1>{};
477
478 constexpr index_t N = sizeof...(Lengths);
479
480 const auto stride_n_minus_2 = integer_least_multiple(lengths[number<N - 1>{}], align);
481
482 auto strides = generate_tuple(
483 [&](auto i) {
484 if constexpr(i.value == N - 1)
485 {
486 return I1;
487 }
488 else if constexpr(i.value == N - 2)
489 {
491 }
492 else
493 {
494 return container_reduce(
495 lengths, multiplies{}, number<stride_n_minus_2>{}, i + I1, number<N - 1>{}, I1);
496 }
497 },
498 number<N>{});
499
500 return make_naive_tensor_descriptor(lengths, strides);
501}
502
503} // namespace ck_tile
#define CK_TILE_HOST_DEVICE
Definition config.hpp:42
CK_TILE_HOST_DEVICE constexpr auto calculate_element_space_size_impl(const Lengths &lengths, const Strides &strides, number< I > i, AccOld acc_old)
Definition tile/core/tensor/tensor_descriptor.hpp:239
Definition tile/core/algorithm/cluster_descriptor.hpp:13
CK_TILE_HOST_DEVICE constexpr auto make_naive_tensor_descriptor_packed(const tuple< Lengths... > &lengths, number< GuaranteedLastDimensionVectorLength >=number<-1 >{})
Definition tile/core/tensor/tensor_descriptor.hpp:371
remove_cv_t< std::remove_reference_t< T > > remove_cvref_t
Definition type_traits.hpp:21
__host__ __device__ multiplies() -> multiplies< void, void >
FIXME: create macro to replace 'host device' and nothing more.
CK_TILE_HOST_DEVICE constexpr auto container_reduce(const Container &x, Reduce reduce, Init init, number< IBegin >=number< 0 >{}, number< IEnd >=number< Container::size()>{}, number< IStep >=number< 1 >{})
Definition tile/core/container/container_helper.hpp:198
constexpr bool is_constant_v
Definition tile/core/numeric/integral_constant.hpp:95
CK_TILE_HOST_DEVICE constexpr auto make_naive_tensor_descriptor_with_offset(const tuple< Lengths... > &lengths, const tuple< Strides... > &strides, const offset &os, number< GuaranteedLastDimensionVectorLength >=number<-1 >{}, number< GuaranteedLastDimensionVectorStride >=number<-1 >{})
Definition tile/core/tensor/tensor_descriptor.hpp:319
CK_TILE_HOST_DEVICE constexpr auto make_naive_tensor_descriptor(const tuple< Lengths... > &lengths, const tuple< Strides... > &strides, number< GuaranteedLastDimensionVectorLength >=number<-1 >{}, number< GuaranteedLastDimensionVectorStride >=number<-1 >{})
Definition tile/core/tensor/tensor_descriptor.hpp:274
CK_TILE_HOST_DEVICE constexpr auto transform_tensor_descriptor(const OldTensorDescriptor &old_tensor_desc, const NewTransforms &new_transforms, NewLowerDimensionOldTopIdss, NewUpperDimensionNewTopIdss)
Definition tile/core/tensor/tensor_descriptor.hpp:203
CK_TILE_HOST_DEVICE constexpr auto make_naive_tensor_descriptor_aligned(const tuple< Lengths... > &lengths, Align align)
Definition tile/core/tensor/tensor_descriptor.hpp:474
CK_TILE_HOST_DEVICE constexpr auto make_unmerge_transform(const UpLengths &up_lengths, bool_constant< Use24BitIntegerCalculation >=bool_constant< false >{})
Definition coordinate_transform.hpp:1622
CK_TILE_HOST_DEVICE constexpr auto transform_tensor_adaptor(const OldTensorAdaptor &old_tensor_adaptor, const NewTransforms &new_transforms, NewLowerDimensionOldTopIdss, NewUpperDimensionNewTopIdss)
Definition tile/core/tensor/tensor_adaptor.hpp:426
CK_TILE_HOST_DEVICE constexpr auto make_tensor_descriptor_from_adaptor(const Adaptor &adaptor, const ElementSpaceSize &element_space_size)
Definition tile/core/tensor/tensor_descriptor.hpp:183
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
CK_TILE_HOST_DEVICE constexpr auto generate_tuple(F &&f, number< N >)
Definition tile/core/container/tuple.hpp:429
array< index_t, N > multi_index
Definition tile/core/container/multi_index.hpp:17
CK_TILE_HOST_DEVICE constexpr auto integer_least_multiple(X x, Y y)
Definition tile/core/numeric/math.hpp:155
typename std::remove_cv< T >::type remove_cv_t
Definition type_traits.hpp:18
CK_TILE_HOST_DEVICE constexpr auto make_offset_transform(const LowLength &low_length, const OffsetLength &offset_length)
Definition coordinate_transform.hpp:1668
int32_t index_t
Definition integer.hpp:9
CK_TILE_HOST_DEVICE constexpr auto make_naive_tensor_descriptor_packed_with_offset(const tuple< Lengths... > &lengths, const Offset &offset, number< GuaranteedLastDimensionVectorLength >=number<-1 >{})
Definition tile/core/tensor/tensor_descriptor.hpp:425
constant< v > long_number
Definition tile/core/numeric/integral_constant.hpp:40
CK_TILE_HOST_DEVICE constexpr auto make_tuple(Xs &&... xs)
Definition tile/core/container/tuple.hpp:360
CK_TILE_HOST_DEVICE constexpr auto make_embed_transform(const UpLengths &up_lengths, const Coefficients &coefficients)
Definition coordinate_transform.hpp:1594
const GenericPointer< typename T::ValueType > T2 value
Definition pointer.h:1697
typename std::conditional< kHasContent, type0, type1 >::type type
Definition tile/core/container/sequence.hpp:302
static constexpr value_type value
Definition tile/core/numeric/integral_constant.hpp:16
static constexpr bool value
Definition type_traits.hpp:77
Definition tile/core/numeric/math.hpp:98
Definition coordinate_transform.hpp:1392
Definition tile/core/container/sequence.hpp:236
Definition tile/core/container/sequence.hpp:49
static CK_TILE_HOST_DEVICE constexpr bool is_known_at_compile_time()
Definition tile/core/tensor/tensor_adaptor.hpp:260
CK_TILE_HOST_DEVICE constexpr auto get_top_dimension_lengths() const
Definition tile/core/tensor/tensor_adaptor.hpp:201
static CK_TILE_HOST_DEVICE constexpr auto get_upper_dimension_hidden_idss()
Definition tile/core/tensor/tensor_adaptor.hpp:41
static CK_TILE_HOST_DEVICE constexpr auto get_lower_dimension_hidden_idss()
Definition tile/core/tensor/tensor_adaptor.hpp:36
static CK_TILE_HOST_DEVICE constexpr index_t get_num_of_hidden_dimension()
Definition tile/core/tensor/tensor_adaptor.hpp:120
static CK_TILE_HOST_DEVICE constexpr index_t get_num_of_top_dimension()
Definition tile/core/tensor/tensor_adaptor.hpp:115
static CK_TILE_HOST_DEVICE constexpr index_t get_num_of_transform()
Definition tile/core/tensor/tensor_adaptor.hpp:29
CK_TILE_HOST_DEVICE constexpr auto calculate_bottom_index(const TopIdx &idx_top) const
Definition tile/core/tensor/tensor_adaptor.hpp:217
CK_TILE_HOST_DEVICE constexpr const auto & get_transforms() const
Definition tile/core/tensor/tensor_adaptor.hpp:34
CK_TILE_HOST_DEVICE constexpr auto get_top_dimension_length(number< IDimTop > idim_top) const
Definition tile/core/tensor/tensor_adaptor.hpp:186
static CK_TILE_HOST_DEVICE constexpr auto get_top_dimension_hidden_ids()
Definition tile/core/tensor/tensor_adaptor.hpp:51
Definition tile/core/tensor/tensor_descriptor.hpp:34
tensor_adaptor< Transforms, LowerDimensionHiddenIdss, UpperDimensionHiddenIdss, sequence< 0 >, TopDimensionHiddenIds > Base
Definition tile/core/tensor/tensor_descriptor.hpp:35
static CK_TILE_HOST_DEVICE constexpr bool is_known_at_compile_time()
Definition tile/core/tensor/tensor_descriptor.hpp:134
static CK_TILE_HOST_DEVICE constexpr auto get_lower_dimension_hidden_idss()
Definition tile/core/tensor/tensor_descriptor.hpp:113
CK_TILE_HOST_DEVICE constexpr auto get_element_space_size() const
Definition tile/core/tensor/tensor_descriptor.hpp:96
GuaranteedVectorSrides_ GuaranteedVectorStrides
Definition tile/core/tensor/tensor_descriptor.hpp:48
static CK_TILE_HOST_DEVICE constexpr auto get_top_dimension_safe_vector_length_strides()
Definition tile/core/tensor/tensor_descriptor.hpp:137
ElementSpaceSize element_space_size_
Definition tile/core/tensor/tensor_descriptor.hpp:145
CK_TILE_HOST_DEVICE constexpr auto get_length(number< IDim > idim) const
Definition tile/core/tensor/tensor_descriptor.hpp:86
CK_TILE_HOST_DEVICE constexpr const auto & get_transforms() const
Definition tile/core/tensor/tensor_descriptor.hpp:108
multi_index< ndim_top_ > TopIndex
Definition tile/core/tensor/tensor_descriptor.hpp:54
CK_TILE_HOST_DEVICE constexpr auto get_lengths() const
Definition tile/core/tensor/tensor_descriptor.hpp:91
CK_TILE_HOST_DEVICE constexpr tensor_descriptor()=default
static CK_TILE_HOST_DEVICE constexpr index_t get_num_of_dimension()
Definition tile/core/tensor/tensor_descriptor.hpp:80
GuaranteedVectorLengths_ GuaranteedVectorLengths
Definition tile/core/tensor/tensor_descriptor.hpp:47
CK_TILE_HOST_DEVICE constexpr index_t calculate_offset(const Idx &idx) const
Definition tile/core/tensor/tensor_descriptor.hpp:102
static constexpr index_t ndim_top_
Definition tile/core/tensor/tensor_descriptor.hpp:45
static CK_TILE_HOST_DEVICE constexpr auto get_top_dimension_hidden_ids()
Definition tile/core/tensor/tensor_descriptor.hpp:123
static CK_TILE_HOST_DEVICE constexpr bool is_static()
Definition tile/core/tensor/tensor_descriptor.hpp:128
static constexpr index_t ntransform_
Definition tile/core/tensor/tensor_descriptor.hpp:43
static constexpr index_t ndim_hidden_
Definition tile/core/tensor/tensor_descriptor.hpp:44
CK_TILE_HOST_DEVICE constexpr tensor_descriptor(const Base &adaptor, ElementSpaceSize element_space_size)
Definition tile/core/tensor/tensor_descriptor.hpp:74
ElementSpaceSize ElementSpaceSizeType
Definition tile/core/tensor/tensor_descriptor.hpp:41
static CK_TILE_HOST_DEVICE constexpr auto get_upper_dimension_hidden_idss()
Definition tile/core/tensor/tensor_descriptor.hpp:118
CK_TILE_HOST_DEVICE constexpr tensor_descriptor(const Transforms &transforms, ElementSpaceSize element_space_size)
Definition tile/core/tensor/tensor_descriptor.hpp:60
multi_index< ndim_hidden_ > HiddenIndex
Definition tile/core/tensor/tensor_descriptor.hpp:55
Definition tile/core/container/tuple.hpp:192
Definition tile/core/container/sequence.hpp:314
typename sequence_gen< NSize, F >::type type
Definition tile/core/container/sequence.hpp:320