/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/ops/batched_contraction/utils/tensor_descriptor_utils.hpp Source File

/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/ops/batched_contraction/utils/tensor_descriptor_utils.hpp Source File#

Composable Kernel: /home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/ops/batched_contraction/utils/tensor_descriptor_utils.hpp Source File
tensor_descriptor_utils.hpp
Go to the documentation of this file.
1 // Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
2 // SPDX-License-Identifier: MIT
3 
4 #pragma once
5 
6 #include "ck_tile/core.hpp"
7 
20 namespace ck_tile {
21 
30 template <ck_tile::index_t NumDimG,
31  ck_tile::index_t NumDimM,
32  ck_tile::index_t NumDimN,
33  ck_tile::index_t NumDimK,
34  ck_tile::index_t VectorSizeA,
35  ck_tile::index_t VectorSizeB,
36  ck_tile::index_t VectorSizeE>
38 {
45  CK_TILE_HOST static constexpr auto
46  Make_A_GridDescriptor_M_K(const std::vector<ck_tile::index_t>& A_dims = {},
47  const std::vector<ck_tile::index_t>& A_strides = {})
48  {
49  const auto to_tuple = [&](auto& vec, auto start, auto end) {
50  return generate_tuple([&](auto i) { return vec[start + i]; }, number<end - start>{});
51  };
52 
53  // Remove G Dimensions
54  const auto A_dims_M_K =
55  to_tuple(A_dims, number<NumDimG>{}, number<NumDimG + NumDimM + NumDimK>{});
56  const auto A_strides_M_K =
57  to_tuple(A_strides, number<NumDimG>{}, number<NumDimG + NumDimM + NumDimK>{});
58 
59  // dimension Ids for M and K
60  constexpr auto A_dims_M_ids = typename arithmetic_sequence_gen<0, NumDimM, 1>::type{};
61  constexpr auto A_dims_K_ids =
63 
64  // Dimensions for M [M0, M1, ...] and K [K0, K1, ...]
65  const auto dims_M = get_container_subset(A_dims_M_K, A_dims_M_ids);
66  const auto dims_K = get_container_subset(A_dims_M_K, A_dims_K_ids);
67 
68  // naive tensor A[M0, M1, M2, ..., K0, K1, K2...] Descriptor with vector size
69  const auto A_grid_desc_Ms_Ks = ck_tile::make_naive_tensor_descriptor(
70  A_dims_M_K, A_strides_M_K, number<VectorSizeA>{}, number<1>{});
71 
72  // transformed tensor to flatten M and K dimensions [M_total = M0 * M1 * M2 * ... , K_total
73  // = K0 * K1 * K2 * ...]
74  const auto A_grid_desc_Mflat_Kflat = ck_tile::transform_tensor_descriptor(
75  A_grid_desc_Ms_Ks,
77  make_tuple(A_dims_M_ids, A_dims_K_ids),
78  make_tuple(sequence<0>{}, sequence<1>{}));
79 
80  return A_grid_desc_Mflat_Kflat;
81  }
82 
89  CK_TILE_HOST static constexpr auto
90  Make_B_GridDescriptor_N_K(const std::vector<ck_tile::index_t>& B_dims = {},
91  const std::vector<ck_tile::index_t>& B_strides = {})
92  {
93  const auto to_tuple = [&](auto& vec, auto start, auto end) {
94  return generate_tuple([&](auto i) { return vec[start + i]; }, number<end - start>{});
95  };
96 
97  // Remove G Dimensions
98  const auto B_dims_N_K =
99  to_tuple(B_dims, number<NumDimG>{}, number<NumDimG + NumDimN + NumDimK>{});
100  const auto B_strides_N_K =
101  to_tuple(B_strides, number<NumDimG>{}, number<NumDimG + NumDimN + NumDimK>{});
102 
103  // dimension Ids for N and K
104  constexpr auto B_dims_N_ids = typename arithmetic_sequence_gen<0, NumDimN, 1>::type{};
105  constexpr auto B_dims_K_ids =
107 
108  // Dimensions for N [N0, N1, ...] and K [K0, K1, ...]
109  const auto dims_N = get_container_subset(B_dims_N_K, B_dims_N_ids);
110  const auto dims_K = get_container_subset(B_dims_N_K, B_dims_K_ids);
111 
112  // naive tensor B[N0, N1, N2, ..., K0, K1, K2...] Descriptor with vector size
113  const auto B_grid_desc_Ns_Ks = ck_tile::make_naive_tensor_descriptor(
114  B_dims_N_K, B_strides_N_K, number<VectorSizeB>{}, number<1>{});
115 
116  // transformed tensor to flatten N and K dimensions [N_total = N0 * N1 * N2 * ... , K_total
117  // = K0 * K1 * K2 * ...]
118  const auto B_grid_desc_Nflat_Kflat = ck_tile::transform_tensor_descriptor(
119  B_grid_desc_Ns_Ks,
121  make_tuple(B_dims_N_ids, B_dims_K_ids),
122  make_tuple(sequence<0>{}, sequence<1>{}));
123 
124  return B_grid_desc_Nflat_Kflat;
125  }
126 
133  CK_TILE_HOST static constexpr auto
134  Make_E_GridDescriptor_M_N(const std::vector<ck_tile::index_t>& E_dims = {},
135  const std::vector<ck_tile::index_t>& E_strides = {})
136  {
137  const auto to_tuple = [&](auto& vec, auto start, auto end) {
138  return generate_tuple([&](auto i) { return vec[start + i]; }, number<end - start>{});
139  };
140 
141  // Remove G dimensions
142  const auto E_dims_M_N =
143  to_tuple(E_dims, number<NumDimG>{}, number<NumDimG + NumDimM + NumDimN>{});
144  const auto E_strides_M_N =
145  to_tuple(E_strides, number<NumDimG>{}, number<NumDimG + NumDimM + NumDimN>{});
146 
147  // dimension Ids for M and N
148  constexpr auto E_dims_M_ids = typename arithmetic_sequence_gen<0, NumDimM, 1>::type{};
149  constexpr auto E_dims_N_ids =
151 
152  // Dimensions for M and N
153  const auto dims_M = get_container_subset(E_dims_M_N, E_dims_M_ids);
154  const auto dims_N = get_container_subset(E_dims_M_N, E_dims_N_ids);
155 
156  // naive tensor E[M0, M1, M2, ..., N0, N1, N2...] Descriptor with vector size
157  const auto E_grid_desc_Ms_Ns = ck_tile::make_naive_tensor_descriptor(
158  E_dims_M_N, E_strides_M_N, number<VectorSizeE>{}, number<1>{});
159 
160  // transformed tensor to flatten M and N dimensions [M_total = M0 * M1 * M2 * ... ,
161  // N_total = N0 * N1 * N2 * ...]
162  const auto E_grid_desc_Mflat_Nflat = ck_tile::transform_tensor_descriptor(
163  E_grid_desc_Ms_Ns,
165  make_tuple(E_dims_M_ids, E_dims_N_ids),
166  make_tuple(sequence<0>{}, sequence<1>{}));
167 
168  return E_grid_desc_Mflat_Nflat;
169  }
170 };
171 
172 } // namespace ck_tile
#define CK_TILE_HOST
Definition: config.hpp:44
Definition: cluster_descriptor.hpp:13
constexpr CK_TILE_HOST_DEVICE auto make_naive_tensor_descriptor(const tuple< Lengths... > &lengths, const tuple< Strides... > &strides, number< GuaranteedLastDimensionVectorLength >=number<-1 >{}, number< GuaranteedLastDimensionVectorStride >=number<-1 >{})
Definition: tensor_descriptor.hpp:274
constexpr CK_TILE_HOST_DEVICE auto make_merge_transform(const LowLengths &low_lengths)
Definition: coordinate_transform.hpp:1615
int32_t index_t
Definition: integer.hpp:9
constant< v > number
Definition: integral_constant.hpp:37
constexpr CK_TILE_HOST_DEVICE auto transform_tensor_descriptor(const OldTensorDescriptor &old_tensor_desc, const NewTransforms &new_transforms, NewLowerDimensionOldTopIdss, NewUpperDimensionNewTopIdss)
Definition: tensor_descriptor.hpp:203
constexpr CK_TILE_HOST_DEVICE auto generate_tuple(F &&f, number< N >)
Definition: tuple.hpp:429
constexpr CK_TILE_HOST_DEVICE auto make_tuple(Xs &&... xs)
Definition: tuple.hpp:360
constexpr CK_TILE_HOST_DEVICE auto get_container_subset(const array< T, N > &arr, sequence< Is... >)
Definition: container_helper.hpp:389
Utility class for creating tensor descriptors in batched contraction operations.
Definition: tensor_descriptor_utils.hpp:38
static constexpr CK_TILE_HOST auto Make_A_GridDescriptor_M_K(const std::vector< ck_tile::index_t > &A_dims={}, const std::vector< ck_tile::index_t > &A_strides={})
Creates a tensor descriptor for input tensor A with batch dimensions removed.
Definition: tensor_descriptor_utils.hpp:46
static constexpr CK_TILE_HOST auto Make_B_GridDescriptor_N_K(const std::vector< ck_tile::index_t > &B_dims={}, const std::vector< ck_tile::index_t > &B_strides={})
Creates a tensor descriptor for input tensor B with batch dimensions removed.
Definition: tensor_descriptor_utils.hpp:90
static constexpr CK_TILE_HOST auto Make_E_GridDescriptor_M_N(const std::vector< ck_tile::index_t > &E_dims={}, const std::vector< ck_tile::index_t > &E_strides={})
Creates a tensor descriptor for output tensor E with batch dimensions removed.
Definition: tensor_descriptor_utils.hpp:134
typename std::conditional< kHasContent, type0, type1 >::type type
Definition: sequence.hpp:313