22template <
typename Transforms,
23 typename LowerDimensionHiddenIdss,
24 typename UpperDimensionHiddenIdss,
25 typename BottomDimensionHiddenIds,
26 typename TopDimensionHiddenIds>
31 return Transforms::size();
38 return LowerDimensionHiddenIdss{};
43 return UpperDimensionHiddenIdss{};
48 return BottomDimensionHiddenIds{};
53 return TopDimensionHiddenIds{};
60 constexpr index_t idim_hidden = TopDimensionHiddenIds::at(idim_top);
68 static_assert(found ==
true,
69 "wrong! not found matching transformation and upper-dimension");
82 template <index_t IDimH
idden>
88 static_assert(IDimHidden >=
ndim_bottom_,
"wrong! not implemented");
95 constexpr auto up_dim_ids = UpperDimensionHiddenIdss{}[itran];
97 static_for<0, up_dim_ids.size(), 1>{}([&](
auto idim_up) {
98 if constexpr(up_dim_ids[idim_up] == IDimHidden)
101 idim_up_found = idim_up;
107 return make_tuple(itran_found, idim_up_found, found);
112 return BottomDimensionHiddenIds::size();
117 return TopDimensionHiddenIds::size();
122 constexpr auto all_low_dim_ids =
124 LowerDimensionHiddenIdss{});
126 constexpr auto all_up_dim_ids =
128 UpperDimensionHiddenIdss{});
130 constexpr auto all_dim_ids =
merge_sequences(all_low_dim_ids, all_up_dim_ids);
136 return unique_sort_all_dim_ids::size();
160 "wrong! inconsistent # of transformations");
168 template <index_t IDimH
idden>
171 static_assert(IDimHidden >= 0 && IDimHidden <
ndim_hidden_,
"wrong! out of range");
179 static_assert(found ==
true,
180 "wrong! not found matching transformation and upper-dimension");
185 template <index_t IDimTop>
193 template <index_t IDimBottom>
211 return generate_tuple([&](
auto i) {
return get_bottom_dimension_length(i); },
216 template <
typename TopIdx>
219 static_assert(TopIdx::size() == TopDimensionHiddenIds::size(),
220 "wrong! # of dimension inconsistent");
231 static_for<ntransform, 0, -1>{}([&](
auto itran_p1) {
241 tran.calculate_lower_index(idx_low, idx_up);
251 bool is_known =
true;
253 static_for<0, Transforms::size(), 1>{}([&](
auto i) {
262 template <index_t Internal = 0>
267 auto vector_lengths = guaranteed_vector_lengths;
268 auto vector_strides = guaranteed_vector_strides;
272 1>{}([&](
auto itran) {
276 const auto up_guaranteed_vector_lengths =
278 const auto up_guaranteed_vector_strides =
282 auto [up_vector_lengths, up_vector_strides] =
283 Transforms{}.at(itran).calculate_upper_dimension_safe_vector_length_strides(
287 if constexpr(up_dims.size() > 0)
289 for(
index_t i = 0; i < up_dims.size(); ++i)
291 up_vector_lengths(i) = (up_guaranteed_vector_lengths[i] != -1)
292 ? up_guaranteed_vector_lengths[i]
293 : up_vector_lengths[i];
295 up_vector_strides(i) = (up_guaranteed_vector_strides[i] != -1)
296 ? up_guaranteed_vector_strides[i]
297 : up_vector_strides[i];
304 if constexpr(Internal > 0)
306 return make_tuple(vector_lengths, vector_strides);
310 constexpr auto top_dims = TopDimensionHiddenIds{};
317 Transforms transforms_;
321template <
typename Transforms,
322 typename LowerDimensionHiddenIdss,
323 typename UpperDimensionHiddenIdss,
324 typename BottomDimensionHiddenIds,
325 typename TopDimensionHiddenIds>
327 LowerDimensionHiddenIdss,
328 UpperDimensionHiddenIdss,
329 BottomDimensionHiddenIds,
330 TopDimensionHiddenIds>& adaptor)
332 printf(
"tensor_adaptor{\n");
333 printf(
" transforms: [");
334 print(adaptor.get_transforms());
337 printf(
" LowerDimensionHiddenIds: [");
338 print(LowerDimensionHiddenIdss{});
341 printf(
" UpperDimensionHiddenIds: [");
342 print(UpperDimensionHiddenIdss{});
345 printf(
" BottomDimensionHiddenIds: [");
346 print(BottomDimensionHiddenIds{});
350 printf(
" TopDimensionHiddenIds: [");
351 print(TopDimensionHiddenIds{});
358template <
typename Transforms,
typename LowerDimensionOldTopIdss,
typename UpperDimensionNewTopIdss>
360 LowerDimensionOldTopIdss,
361 UpperDimensionNewTopIdss)
363 constexpr index_t ntransform = Transforms::size();
365 static_assert(LowerDimensionOldTopIdss::size() == ntransform &&
366 UpperDimensionNewTopIdss::size() == ntransform,
370 constexpr auto all_low_dim_old_top_ids =
unpack(
371 [](
auto&&... xs)
constexpr {
return merge_sequences(xs...); }, LowerDimensionOldTopIdss{});
373 constexpr auto all_up_dim_new_top_ids =
unpack(
374 [](
auto&&... xs)
constexpr {
return merge_sequences(xs...); }, UpperDimensionNewTopIdss{});
380 constexpr index_t ndim_old_top = all_low_dim_old_top_ids.size();
381 constexpr index_t ndim_new_top = all_up_dim_new_top_ids.size();
384 constexpr auto low_dim_hidden_idss = LowerDimensionOldTopIdss{};
392 constexpr auto bottom_dim_hidden_ids =
396 constexpr auto top_dim_hidden_ids =
410template <
typename NewTransforms>
413 template <
typename I>
417 return number<Tran::get_num_of_upper_dimension()>{};
421template <
typename OldTensorAdaptor,
422 typename NewTransforms,
423 typename NewLowerDimensionOldTopIdss,
424 typename NewUpperDimensionNewTopIdss>
427 const NewTransforms& new_transforms,
428 NewLowerDimensionOldTopIdss,
429 NewUpperDimensionNewTopIdss)
433 static_assert(NewTransforms::size() == NewLowerDimensionOldTopIdss::size() &&
434 NewTransforms::size() == NewUpperDimensionNewTopIdss::size(),
435 "wrong! inconsitent number of transform");
438 NewLowerDimensionOldTopIdss{});
441 NewUpperDimensionNewTopIdss{});
453 [](
auto low_dim_top_ids)
constexpr {
456 [](
auto low_dim_top_id)
constexpr {
457 return OldTensorAdaptor::get_top_dimension_hidden_ids()[low_dim_top_id];
461 NewLowerDimensionOldTopIdss{});
463 constexpr index_t num_new_transform = NewTransforms::size();
466 constexpr index_t old_hidden_dim_number = OldTensorAdaptor::get_num_of_hidden_dimension();
468 constexpr auto up_dim_numbers =
475 [old_hidden_dim_number, up_dim_numbers_scan](
auto i)
constexpr {
478 old_hidden_dim_number + up_dim_numbers_scan[i + 1],
484 constexpr auto unordered_new_top_dim_hidden_ids =
487 constexpr auto new_top_dim_unordered2ordered =
unpack(
488 [](
auto... xs)
constexpr {
return merge_sequences(xs...); }, NewUpperDimensionNewTopIdss{});
490 constexpr auto new_top_dim_hidden_ids =
491 unordered_new_top_dim_hidden_ids.reorder_old_to_new(new_top_dim_unordered2ordered);
494 const auto all_transforms =
497 constexpr auto all_low_dim_hidden_idss =
498 container_concat(OldTensorAdaptor::get_lower_dimension_hidden_idss(), low_dim_hidden_idss);
500 constexpr auto all_up_dim_hidden_idss =
501 container_concat(OldTensorAdaptor::get_upper_dimension_hidden_idss(), up_dim_hidden_idss);
507 remove_cvref_t<
decltype(OldTensorAdaptor::get_bottom_dimension_hidden_ids())>,
508 remove_cvref_t<
decltype(new_top_dim_hidden_ids)>>{all_transforms};
511template <
typename TensorAdaptor0,
typename TensorAdaptor1>
513 const TensorAdaptor1& adaptor1)
515 static_assert(TensorAdaptor0::get_num_of_top_dimension() ==
516 TensorAdaptor1::get_num_of_bottom_dimension(),
520 const auto all_transforms =
524 constexpr index_t adaptor0_max_hidden_id = [&]() {
527 static_for<0, TensorAdaptor0::get_num_of_transform(), 1>{}([&](
auto itran) {
529 TensorAdaptor0{}.get_transforms()[itran].get_num_of_lower_dimension();
532 adaptor0_max_hidden_id_ =
533 max(adaptor0_max_hidden_id_,
534 TensorAdaptor0::get_lower_dimension_hidden_idss()[itran][idim_low].
value);
538 TensorAdaptor0{}.get_transforms()[itran].get_num_of_upper_dimension();
541 adaptor0_max_hidden_id_ =
542 max(adaptor0_max_hidden_id_,
543 TensorAdaptor0::get_upper_dimension_hidden_idss()[itran][idim_up].
value);
547 return adaptor0_max_hidden_id_;
550 constexpr index_t adaptor1_min_hidden_id = [&]() {
553 static_for<0, TensorAdaptor1::get_num_of_transform(), 1>{}([&](
auto itran) {
555 TensorAdaptor1{}.get_transforms()[itran].get_num_of_lower_dimension();
560 constexpr index_t low_dim_hidden_id =
561 TensorAdaptor1::get_lower_dimension_hidden_idss()[itran][idim_low].value;
563 bool is_bottom_dim =
false;
564 static_for<0, TensorAdaptor1::get_num_of_bottom_dimension(), 1>{}([&](
auto i) {
565 if constexpr(low_dim_hidden_id ==
566 TensorAdaptor1::get_bottom_dimension_hidden_ids()[i])
568 is_bottom_dim =
true;
574 adaptor1_min_hidden_id_ =
min(adaptor1_min_hidden_id_, low_dim_hidden_id);
579 TensorAdaptor1{}.get_transforms()[itran].get_num_of_upper_dimension();
583 adaptor1_min_hidden_id_ =
584 min(adaptor1_min_hidden_id_,
585 TensorAdaptor1::get_upper_dimension_hidden_idss()[itran][idim_up].
value);
589 return adaptor1_min_hidden_id_;
592 constexpr index_t adaptor1_hidden_id_shift =
593 adaptor0_max_hidden_id + 1 - adaptor1_min_hidden_id;
595 constexpr index_t ndim_bottom_1 = TensorAdaptor1::get_num_of_bottom_dimension();
602 constexpr auto ndim_low_1 =
603 TensorAdaptor1::get_lower_dimension_hidden_idss()[itran].size();
605 constexpr auto low_dim_hidden_ids_1 =
606 TensorAdaptor1::get_lower_dimension_hidden_idss()[itran];
609 constexpr auto low_dim_hidden_ids_1_mod = [&]()
constexpr {
610 auto low_dim_hidden_ids_1_mod_ =
to_multi_index(low_dim_hidden_ids_1);
614 low_dim_hidden_ids_1_mod_(idim_low_1) += adaptor1_hidden_id_shift;
621 if constexpr(low_dim_hidden_ids_1[idim_low_1] ==
622 TensorAdaptor1::get_bottom_dimension_hidden_ids()
625 low_dim_hidden_ids_1_mod_(idim_low_1) =
626 TensorAdaptor0::get_top_dimension_hidden_ids()[idim_bottom_1];
631 return low_dim_hidden_ids_1_mod_;
638 number<TensorAdaptor1::get_num_of_transform()>{});
640 constexpr auto all_low_dim_hidden_idss =
641 container_concat(TensorAdaptor0::get_lower_dimension_hidden_idss(), low_dim_hidden_idss_1);
648 constexpr auto ndim_up_1 =
649 TensorAdaptor1::get_upper_dimension_hidden_idss()[itran].size();
651 constexpr auto up_dim_hidden_ids_1 =
652 TensorAdaptor1::get_upper_dimension_hidden_idss()[itran];
655 constexpr auto up_dim_hidden_ids_1_mod = [&]()
constexpr {
656 auto up_dim_hidden_ids_1_mod_ =
to_multi_index(up_dim_hidden_ids_1);
660 up_dim_hidden_ids_1_mod_(idim_up_1) += adaptor1_hidden_id_shift;
663 return up_dim_hidden_ids_1_mod_;
671 number<TensorAdaptor1::get_num_of_transform()>{});
673 constexpr auto all_up_dim_hidden_idss =
674 container_concat(TensorAdaptor0::get_upper_dimension_hidden_idss(), up_dim_hidden_idss_1);
677 constexpr auto bottom_dim_hidden_ids = TensorAdaptor0::get_bottom_dimension_hidden_ids();
680 constexpr auto top_dim_hidden_ids =
693 typename std::enable_if<
sizeof...(Xs) >= 2,
bool>::type =
false>
716#define CONSTRUCT_TENSOR_ADAPTOR_FROM_ENCODING(encoded_tensor_adaptor) \
717 [encoded_tensor_adaptor]() { \
718 using namespace ck_tile; \
720 constexpr auto encoded_transforms = encoded_tensor_adaptor.template at<0>(); \
721 constexpr index_t num_transform = encoded_tensor_adaptor.template at<1>(); \
722 constexpr auto encoded_bottom_dims = encoded_tensor_adaptor.template at<2>(); \
723 constexpr index_t num_bottom_dim = encoded_tensor_adaptor.template at<3>(); \
724 constexpr auto encoded_top_dims = encoded_tensor_adaptor.template at<4>(); \
725 constexpr index_t num_top_dim = encoded_tensor_adaptor.template at<5>(); \
727 constexpr auto trans = [&encoded_transforms]() { \
728 return generate_tuple( \
729 [&encoded_transforms](auto i) constexpr { \
730 constexpr auto name = encoded_transforms[i].template at<0>(); \
731 constexpr auto meta_data = encoded_transforms[i].template at<1>(); \
732 constexpr auto num_low_dim = encoded_transforms[i].template at<2>(); \
733 constexpr auto num_up_dim = encoded_transforms[i].template at<4>(); \
735 static_assert(name == coord_transform_enum::pass_through || \
736 name == coord_transform_enum::pad || \
737 name == coord_transform_enum::embed || \
738 name == coord_transform_enum::merge || \
739 name == coord_transform_enum::unmerge || \
740 name == coord_transform_enum::replicate, \
743 if constexpr(name == coord_transform_enum::pass_through) \
746 auto low_len = meta_data.template pop<index_t>(pos); \
748 return make_pass_through_transform(low_len); \
750 else if constexpr(name == coord_transform_enum::pad) \
753 auto low_len = meta_data.template pop<index_t>(pos); \
754 auto left_pad = meta_data.template pop<index_t>(pos); \
755 auto right_pad = meta_data.template pop<index_t>(pos); \
757 return make_pad_transform(low_len, left_pad, right_pad); \
759 else if constexpr(name == coord_transform_enum::embed) \
762 auto up_lens = meta_data.template pop<array<index_t, num_up_dim>>(pos); \
763 auto coefficients = \
764 meta_data.template pop<array<index_t, num_up_dim>>(pos); \
766 return make_embed_transform(up_lens, coefficients); \
768 else if constexpr(name == coord_transform_enum::merge) \
771 auto low_lens = meta_data.template pop<array<index_t, num_low_dim>>(pos); \
773 return make_merge_transform(low_lens); \
775 else if constexpr(name == coord_transform_enum::unmerge) \
778 auto up_lens = meta_data.template pop<array<index_t, num_up_dim>>(pos); \
780 return make_unmerge_transform(up_lens); \
782 else if constexpr(name == coord_transform_enum::replicate) \
785 auto up_lens = meta_data.template pop<array<index_t, num_up_dim>>(pos); \
787 return make_replicate_transform(up_lens); \
790 number<num_transform>{}); \
793 constexpr auto low_dim_idss = [&encoded_transforms, &num_transform]() { \
794 return generate_tuple( \
795 [&encoded_transforms](auto i) { \
796 constexpr auto num_low_dim = encoded_transforms[i].template at<2>(); \
797 constexpr auto low_dims = encoded_transforms[i].template at<3>(); \
799 return TO_SEQUENCE(low_dims, num_low_dim); \
801 number<num_transform>()); \
804 constexpr auto up_dim_idss = [&encoded_transforms, &num_transform] { \
805 return generate_tuple( \
806 [&encoded_transforms](auto i) { \
807 constexpr auto num_up_dim = encoded_transforms[i].template at<4>(); \
808 constexpr auto up_dims = encoded_transforms[i].template at<5>(); \
810 return TO_SEQUENCE(up_dims, num_up_dim); \
812 number<num_transform>()); \
815 constexpr auto bottom_dim_ids = TO_SEQUENCE(encoded_bottom_dims, num_bottom_dim); \
816 constexpr auto top_dim_ids = TO_SEQUENCE(encoded_top_dims, num_top_dim); \
818 return tensor_adaptor<remove_cvref_t<decltype(trans)>, \
819 remove_cvref_t<decltype(low_dim_idss)>, \
820 remove_cvref_t<decltype(up_dim_idss)>, \
821 remove_cvref_t<decltype(bottom_dim_ids)>, \
822 remove_cvref_t<decltype(top_dim_ids)>>{trans}; \
840#define CONSTRUCT_STATIC_TENSOR_ADAPTOR_FROM_ENCODING(encoded_tensor_adaptor) \
841 [encoded_tensor_adaptor]() { \
842 using namespace ck_tile; \
844 constexpr auto encoded_transforms = encoded_tensor_adaptor.template at<0>(); \
845 constexpr index_t num_transform = encoded_tensor_adaptor.template at<1>(); \
846 constexpr auto encoded_bottom_dims = encoded_tensor_adaptor.template at<2>(); \
847 constexpr index_t num_bottom_dim = encoded_tensor_adaptor.template at<3>(); \
848 constexpr auto encoded_top_dims = encoded_tensor_adaptor.template at<4>(); \
849 constexpr index_t num_top_dim = encoded_tensor_adaptor.template at<5>(); \
851 constexpr auto trans = [&encoded_transforms]() { \
852 return generate_tuple( \
853 [&encoded_transforms](auto i) constexpr { \
854 constexpr auto name = encoded_transforms[i].template at<0>(); \
855 constexpr auto meta_data = encoded_transforms[i].template at<1>(); \
856 constexpr auto num_low_dim = encoded_transforms[i].template at<2>(); \
857 constexpr auto num_up_dim = encoded_transforms[i].template at<4>(); \
859 static_assert(name == coord_transform_enum::pass_through || \
860 name == coord_transform_enum::pad || \
861 name == coord_transform_enum::embed || \
862 name == coord_transform_enum::merge || \
863 name == coord_transform_enum::unmerge || \
864 name == coord_transform_enum::replicate, \
867 if constexpr(name == coord_transform_enum::pass_through) \
869 constexpr index_t low_len = meta_data.template get<index_t>(0); \
871 return make_pass_through_transform(number<low_len>{}); \
873 else if constexpr(name == coord_transform_enum::pad) \
875 constexpr index_t low_len = meta_data.template get<index_t>(0); \
877 constexpr index_t left_pad = \
878 meta_data.template get<index_t>(sizeof(low_len)); \
880 constexpr index_t right_pad = \
881 meta_data.template pop<index_t>(sizeof(low_len) + sizeof(left_pad)); \
883 return make_pad_transform( \
884 number<low_len>{}, number<left_pad>{}, number<right_pad>{}); \
886 else if constexpr(name == coord_transform_enum::embed) \
888 constexpr auto up_lens = \
889 meta_data.template get<array<index_t, num_up_dim>>(0); \
891 constexpr auto coefficients = \
892 meta_data.template get<array<index_t, num_up_dim>>(sizeof(up_lens)); \
894 return make_embed_transform(TO_TUPLE_OF_NUMBER(up_lens, num_up_dim), \
895 TO_TUPLE_OF_NUMBER(coefficients, num_up_dim)); \
897 else if constexpr(name == coord_transform_enum::merge) \
899 constexpr auto low_lens = \
900 meta_data.template get<array<index_t, num_low_dim>>(0); \
902 return make_merge_transform(TO_TUPLE_OF_NUMBER(low_lens, num_low_dim)); \
904 else if constexpr(name == coord_transform_enum::unmerge) \
906 constexpr auto up_lens = \
907 meta_data.template get<array<index_t, num_up_dim>>(0); \
909 return make_unmerge_transform(TO_TUPLE_OF_NUMBER(up_lens, num_up_dim)); \
911 else if constexpr(name == coord_transform_enum::replicate) \
913 constexpr auto up_lens = \
914 meta_data.template get<array<index_t, num_up_dim>>(0); \
916 return make_replicate_transform(TO_TUPLE_OF_NUMBER(up_lens, num_up_dim)); \
919 number<num_transform>{}); \
922 constexpr auto low_dim_idss = [&encoded_transforms]() { \
923 return generate_tuple( \
924 [&encoded_transforms](auto i) { \
925 constexpr auto num_low_dim = encoded_transforms[i].template at<2>(); \
926 constexpr auto low_dims = encoded_transforms[i].template at<3>(); \
928 return TO_SEQUENCE(low_dims, num_low_dim); \
930 number<num_transform>()); \
933 constexpr auto up_dim_idss = [&encoded_transforms] { \
934 return generate_tuple( \
935 [&encoded_transforms](auto i) { \
936 constexpr auto num_up_dim = encoded_transforms[i].template at<4>(); \
937 constexpr auto up_dims = encoded_transforms[i].template at<5>(); \
939 return TO_SEQUENCE(up_dims, num_up_dim); \
941 number<num_transform>()); \
944 constexpr auto bottom_dim_ids = TO_SEQUENCE(encoded_bottom_dims, num_bottom_dim); \
945 constexpr auto top_dim_ids = TO_SEQUENCE(encoded_top_dims, num_top_dim); \
947 return tensor_adaptor<remove_cvref_t<decltype(trans)>, \
948 remove_cvref_t<decltype(low_dim_idss)>, \
949 remove_cvref_t<decltype(up_dim_idss)>, \
950 remove_cvref_t<decltype(bottom_dim_ids)>, \
951 remove_cvref_t<decltype(top_dim_ids)>>{trans}; \
#define CK_TILE_HOST_DEVICE
Definition config.hpp:42
Definition tile/core/algorithm/cluster_descriptor.hpp:13
remove_cv_t< std::remove_reference_t< T > > remove_cvref_t
Definition type_traits.hpp:21
typename std::remove_reference< T >::type remove_reference_t
Definition type_traits.hpp:15
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
CK_TILE_HOST_DEVICE constexpr auto generate_sequence_v2(F &&f, number< N >)
Definition tile/core/container/sequence.hpp:1045
CK_TILE_HOST_DEVICE constexpr auto transform_sequences(F f, sequence< Xs... >)
Definition tile/core/container/sequence.hpp:832
CK_TILE_HOST_DEVICE constexpr auto to_multi_index(const T &x)
Definition tile/core/container/multi_index.hpp:33
CK_TILE_HOST_DEVICE constexpr auto container_concat(const X &x, const Ys &... ys)
Definition tile/core/container/container_helper.hpp:363
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 transform_tuples(F f, const X &x)
Definition tile/core/container/tuple.hpp:505
CK_TILE_HOST_DEVICE constexpr auto make_single_stage_tensor_adaptor(const Transforms &transforms, LowerDimensionOldTopIdss, UpperDimensionNewTopIdss)
Definition tile/core/tensor/tensor_adaptor.hpp:359
CK_TILE_HOST_DEVICE constexpr void set_container_subset(array< T, N > &y, sequence< Is... > picks, const array< T, sizeof...(Is)> &x)
Definition tile/core/container/container_helper.hpp:420
CK_TILE_HOST_DEVICE constexpr auto merge_sequences(Seqs...)
Definition tile/core/container/sequence.hpp:826
constant< v > number
Definition tile/core/numeric/integral_constant.hpp:37
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 generate_sequence(F, number< N >)
Definition tile/core/container/sequence.hpp:1037
CK_TILE_HOST_DEVICE constexpr auto get_container_subset(const array< T, N > &arr, sequence< Is... >)
Definition tile/core/container/container_helper.hpp:389
CK_TILE_HOST_DEVICE constexpr auto unpack(F &&f, X &&x)
Definition tile/core/utility/functional.hpp:200
typename std::remove_cv< T >::type remove_cv_t
Definition type_traits.hpp:18
CK_TILE_HOST_DEVICE constexpr auto inclusive_scan_sequence(Seq, Reduce, number< Init >)
Definition tile/core/container/sequence.hpp:870
CK_TILE_HOST_DEVICE constexpr T max(T x)
Definition tile/core/numeric/math.hpp:161
CK_TILE_HOST_DEVICE constexpr T min(T x)
Definition tile/core/numeric/math.hpp:210
int32_t index_t
Definition integer.hpp:9
CK_TILE_HOST_DEVICE constexpr auto chain_tensor_adaptors(const TensorAdaptor0 &adaptor0, const TensorAdaptor1 &adaptor1)
Definition tile/core/tensor/tensor_adaptor.hpp:512
CK_TILE_HOST_DEVICE constexpr auto make_tuple(Xs &&... xs)
Definition tile/core/container/tuple.hpp:360
const GenericPointer< typename T::ValueType > T2 value
Definition pointer.h:1697
Definition tile/core/container/sequence.hpp:287
typename std::conditional< kHasContent, type0, type1 >::type type
Definition tile/core/container/sequence.hpp:302
A fixed-size array container similar to std::array with additional utilities.
Definition tile/core/container/array.hpp:43
Definition tile/core/numeric/math.hpp:329
static constexpr bool value
Definition type_traits.hpp:77
Definition tile/core/container/sequence.hpp:670
Definition tile/core/tensor/tensor_adaptor.hpp:412
CK_TILE_HOST_DEVICE constexpr auto operator()(I) const
Definition tile/core/tensor/tensor_adaptor.hpp:414
Definition tile/core/numeric/math.hpp:371
Definition tile/core/numeric/math.hpp:98
static CK_TILE_HOST_DEVICE constexpr T max()
Definition tile/core/numeric/numeric.hpp:26
static CK_TILE_HOST_DEVICE constexpr T min()
Definition tile/core/numeric/numeric.hpp:20
Definition tile/core/numeric/math.hpp:50
Definition tile/core/container/sequence.hpp:593
Definition tile/core/container/sequence.hpp:49
Definition tile/core/utility/functional.hpp:43
Definition tile/core/tensor/tensor_adaptor.hpp:28
static constexpr index_t ndim_hidden_
Definition tile/core/tensor/tensor_adaptor.hpp:140
static CK_TILE_HOST_DEVICE constexpr auto get_top_dimension_safe_vector_length_strides(const array< index_t, ndim_hidden_ > &guaranteed_vector_lengths, const array< index_t, ndim_hidden_ > &guaranteed_vector_strides)
Definition tile/core/tensor/tensor_adaptor.hpp:263
static CK_TILE_HOST_DEVICE constexpr bool is_known_at_compile_time()
Definition tile/core/tensor/tensor_adaptor.hpp:260
multi_index< ndim_hidden_ > HiddenIndex
Definition tile/core/tensor/tensor_adaptor.hpp:144
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_bottom_dimension_hidden_ids()
Definition tile/core/tensor/tensor_adaptor.hpp:46
static constexpr index_t ndim_bottom_
Definition tile/core/tensor/tensor_adaptor.hpp:141
static CK_TILE_HOST_DEVICE constexpr bool is_static()
Definition tile/core/tensor/tensor_adaptor.hpp:249
static CK_TILE_HOST_DEVICE constexpr auto get_upper_dimension_hidden_idss()
Definition tile/core/tensor/tensor_adaptor.hpp:41
CK_TILE_HOST_DEVICE constexpr auto get_hidden_dimension_length(number< IDimHidden >) const
Definition tile/core/tensor/tensor_adaptor.hpp:169
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_element_size() const
Definition tile/core/tensor/tensor_adaptor.hpp:165
static constexpr index_t ndim_top_
Definition tile/core/tensor/tensor_adaptor.hpp:142
multi_index< ndim_bottom_ > BottomIndex
Definition tile/core/tensor/tensor_adaptor.hpp:145
static CK_TILE_HOST_DEVICE constexpr auto initialize_element_size(const Transforms &transforms)
Definition tile/core/tensor/tensor_adaptor.hpp:56
static CK_TILE_HOST_DEVICE constexpr auto get_transform_and_its_upper_dimension(number< IDimHidden >)
Definition tile/core/tensor/tensor_adaptor.hpp:84
CK_TILE_HOST_DEVICE constexpr auto get_top_dimension_length(number< IDimTop > idim_top) const
Definition tile/core/tensor/tensor_adaptor.hpp:186
remove_cv_t< decltype(initialize_element_size(Transforms{}))> ElementSize
Definition tile/core/tensor/tensor_adaptor.hpp:149
CK_TILE_HOST_DEVICE constexpr tensor_adaptor(const Transforms &transforms)
Definition tile/core/tensor/tensor_adaptor.hpp:154
static constexpr index_t ntransform_
Definition tile/core/tensor/tensor_adaptor.hpp:139
static CK_TILE_HOST_DEVICE constexpr auto get_top_dimension_hidden_ids()
Definition tile/core/tensor/tensor_adaptor.hpp:51
multi_index< ndim_top_ > TopIndex
Definition tile/core/tensor/tensor_adaptor.hpp:146
CK_TILE_HOST_DEVICE constexpr tensor_adaptor()=default
static CK_TILE_HOST_DEVICE constexpr index_t get_num_of_bottom_dimension()
Definition tile/core/tensor/tensor_adaptor.hpp:110