include/ck_tile/core/tensor/tensor_view.hpp Source File

include/ck_tile/core/tensor/tensor_view.hpp Source File#

Composable Kernel: include/ck_tile/core/tensor/tensor_view.hpp Source File
tensor_view.hpp
Go to the documentation of this file.
1 // SPDX-License-Identifier: MIT
2 // Copyright (c) 2018-2023, Advanced Micro Devices, Inc. All rights reserved.
3 
4 #pragma once
5 
16 
17 namespace ck_tile {
18 
19 /*
20  * tensor_view
21  * abstract the underneath memory buffer(global, LDS, etc...)
22  * and provide a unified get/set function for access
23  *
24  * For addressing into the buffer we use 2 variable to control:
25  * coord : ND tensor coordinate, will calculate the actual offset inside
26  * linear_offset : 1D offset, will be used in the immediate field of
27  * the buffer instruction to help reduce register usage
28  *
29  * User can use either of the field, or both to indexing into the tensor
30  *
31  * We usually provide 2 set of API for buffer get/set, e.g.
32  * get_vectorized_elements()/get_vectorized_elements_raw()
33  * the former usually will call intrinsic or normal C function, the later
34  * usually will call inline-asm function
35  *
36  */
37 template <typename BufferView_,
38  typename TensorDesc_,
41 {
43  using DataType = typename buffer_view::type;
45  using TensorIndex = array<index_t, TensorDesc::get_num_of_top_dimension()>;
47  static constexpr auto DstInMemOp = DstInMemOp_;
48 
49  CK_TILE_HOST_DEVICE constexpr tensor_view() = default;
50 
52  const TensorDesc& desc)
53  : buf_{buffer_view}, desc_{desc}
54  {
55  }
56 
57  CK_TILE_HOST_DEVICE void init_raw() { buf_.init_raw(); }
58 
59  CK_TILE_HOST_DEVICE constexpr auto& get_tensor_descriptor() const { return desc_; }
60 
62  {
63  return TensorDesc::get_num_of_top_dimension();
64  }
65 
66  CK_TILE_HOST_DEVICE constexpr const auto& get_buffer_view() const { return buf_; }
67 
68  CK_TILE_HOST_DEVICE constexpr auto& get_buffer_view() { return buf_; }
69 
70  // X is vector of DataType.
71  // "coord" is coordinate of DataType, not X. "coord" should be aligned to X
72  template <typename X,
73  bool oob_conditional_check = true,
74  typename std::enable_if<
75  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
76  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
77  bool>::type = false>
80  index_t linear_offset,
82  {
83  return buf_.template get<X>(
84  coord.get_offset(),
85  linear_offset,
88  }
89 
90  template <typename X,
91  bool oob_conditional_check = true,
92  typename std::enable_if<
93  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
94  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
95  bool>::type = false>
96  CK_TILE_HOST_DEVICE constexpr remove_cvref_t<X>
98  index_t linear_offset,
99  bool is_valid_element, // flag
101  {
102  return buf_.template get<X>(coord.get_offset(),
103  linear_offset,
104  is_valid_element,
106  }
107 
108  // X is vector of DataType.
109  // "coord" is coordinate of DataType, not X. "coord" should be aligned to X
110  template <typename X,
111  bool oob_conditional_check = true,
112  bool pre_nop = false,
113  typename std::enable_if<
114  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
115  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
116  bool>::type = false>
118  const TensorCoord& coord,
119  index_t linear_offset,
121  bool_constant<pre_nop> = {}) const
122  {
123  return buf_.template get_raw<X, oob_conditional_check, pre_nop>(
124  dst,
125  coord.get_offset(),
126  linear_offset,
128  bool_constant<pre_nop>{});
129  }
130 
131  template <typename X,
132  bool oob_conditional_check = true,
133  bool pre_nop = false,
134  typename std::enable_if<
135  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
136  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
137  bool>::type = false>
139  const TensorCoord& coord,
140  index_t linear_offset,
141  bool is_valid_element,
143  bool_constant<pre_nop> = {}) const
144  {
145  return buf_.template get_raw<X, oob_conditional_check, pre_nop>(
146  dst, coord.get_offset(), linear_offset, is_valid_element, bool_constant<pre_nop>{});
147  }
148 
149  template <typename X,
150  bool oob_conditional_check = true,
151  typename std::enable_if<
152  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
153  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
154  bool>::type = false>
155  CK_TILE_HOST_DEVICE constexpr void
157  const TensorCoord& coord,
158  index_t linear_offset) const
159  {
160  return buf_.template async_get<X>(
161  smem,
162  coord.get_offset(),
163  linear_offset,
166  }
167 
168  template <typename X,
169  bool oob_conditional_check = true,
170  typename std::enable_if<
171  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
172  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
173  bool>::type = false>
174  CK_TILE_HOST_DEVICE constexpr void
176  const TensorCoord& coord,
177  index_t linear_offset,
178  bool is_valid_element) const
179  {
180  return buf_.template async_get<X>(smem,
181  coord.get_offset(),
182  linear_offset,
183  is_valid_element,
185  }
186 
187  template <typename X,
188  bool pre_nop = false,
189  typename std::enable_if<
190  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
191  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
192  bool>::type = false>
193  CK_TILE_HOST_DEVICE constexpr void
195  const TensorCoord& coord,
196  index_t linear_offset,
197  bool_constant<pre_nop> = {}) const
198  {
199  return buf_.template async_get_raw<X>(
200  smem,
201  coord.get_offset(),
202  linear_offset,
205  }
206 
207  template <typename X,
208  bool pre_nop = false,
209  typename std::enable_if<
210  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
211  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
212  bool>::type = false>
213  CK_TILE_HOST_DEVICE constexpr void
215  const TensorCoord& coord,
216  index_t linear_offset,
217  bool is_valid_element,
218  bool_constant<pre_nop> = {}) const
219  {
220  return buf_.template async_get_raw<X>(
221  smem, coord.get_offset(), linear_offset, is_valid_element, bool_constant<pre_nop>{});
222  }
223 
224  // X is vector of DataType.
225  // "coord" is coordinate of DataType, not X. "coord" should be aligned to X
226  template <typename X,
227  bool oob_conditional_check = true,
228  typename std::enable_if<
229  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
230  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
231  bool>::type = false>
232  CK_TILE_HOST_DEVICE constexpr void
234  index_t linear_offset,
235  const X& x,
237  {
238  buf_.template set<X, oob_conditional_check>(
239  coord.get_offset(),
240  linear_offset,
242  x);
243  }
244 
245  template <typename X,
246  bool oob_conditional_check = true,
247  typename std::enable_if<
248  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
249  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
250  bool>::type = false>
251  CK_TILE_HOST_DEVICE constexpr void
253  index_t linear_offset,
254  bool is_valid_element,
255  const X& x,
257  {
258  buf_.template set<X, oob_conditional_check>(
259  coord.get_offset(), linear_offset, is_valid_element, x);
260  }
261 
262  template <typename X,
263  bool oob_conditional_check = true,
264  typename std::enable_if<
265  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
266  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
267  bool>::type = false>
268  CK_TILE_HOST_DEVICE constexpr void
270  index_t linear_offset,
271  const X& x,
273  {
274  buf_.template set_raw<X, oob_conditional_check>(
275  coord.get_offset(),
276  linear_offset,
278  x);
279  }
280 
281  template <typename X,
282  bool oob_conditional_check = true,
283  typename std::enable_if<
284  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
285  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
286  bool>::type = false>
287  CK_TILE_HOST_DEVICE constexpr void
289  index_t linear_offset,
290  bool is_valid_element,
291  const X& x,
293  {
294  buf_.template set_raw<X, oob_conditional_check>(
295  coord.get_offset(), linear_offset, is_valid_element, x);
296  }
297 
298  // X is vector of DataType.
299  // "coord" is coordinate of DataType, not X. "coord" should be aligned to X
300  template <typename X,
301  bool oob_conditional_check = true,
302  typename std::enable_if<
303  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
304  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
305  bool>::type = false>
306  CK_TILE_HOST_DEVICE constexpr void
308  index_t linear_offset,
309  const X& x,
311  {
312  buf_.template update<DstInMemOp, X, oob_conditional_check>(
313  coord.get_offset(),
314  linear_offset,
316  x);
317  }
318 
319  template <typename X,
320  bool oob_conditional_check = true,
321  typename std::enable_if<
322  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
323  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
324  bool>::type = false>
325  CK_TILE_HOST_DEVICE constexpr void
327  index_t linear_offset,
328  bool is_valid_element,
329  const X& x,
331  {
332  buf_.template update<DstInMemOp, X, oob_conditional_check>(
333  coord.get_offset(), linear_offset, is_valid_element, x);
334  }
335 
336  // X is vector of DataType.
337  // "coord" is coordinate of DataType, not X. "coord" should be aligned to X
338  template <typename X,
339  bool oob_conditional_check = true,
340  bool pre_nop = false,
341  typename std::enable_if<
342  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
343  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
344  bool>::type = false>
345  CK_TILE_HOST_DEVICE constexpr void
347  index_t linear_offset,
348  const X& x,
351  {
352  buf_.template update_raw<DstInMemOp, X, oob_conditional_check, pre_nop>(
353  coord.get_offset(),
354  linear_offset,
356  x);
357  }
358 
359  template <typename X,
360  bool oob_conditional_check = true,
361  bool pre_nop = false,
362  typename std::enable_if<
363  std::is_same_v<typename vector_traits<remove_cvref_t<X>>::scalar_type,
364  typename vector_traits<remove_cvref_t<DataType>>::scalar_type>,
365  bool>::type = false>
366  CK_TILE_HOST_DEVICE constexpr void
368  index_t linear_offset,
369  bool is_valid_element,
370  const X& x,
373  {
374  buf_.template update_raw<DstInMemOp, X, oob_conditional_check, pre_nop>(
375  coord.get_offset(), linear_offset, is_valid_element, x);
376  }
377 
379  {
380  printf("tensor_view{");
381 
382  // buf_
383  printf("buf_: ");
384  print(buf_);
385  printf(", ");
386 
387  // desc_
388  printf("desc_: ");
389  print(desc_);
390 
391  printf("}");
392  }
393 
394  // member
397 };
398 
399 // placeholder type if we want to opt-out a tile view parameter
401 {
402 };
403 
404 template <address_space_enum BufferAddressSpace = address_space_enum::generic,
405  typename DataType,
406  typename... Ts>
407 CK_TILE_HOST_DEVICE constexpr auto make_tensor_view(DataType* p,
408  const tensor_descriptor<Ts...>& desc)
409 {
410  auto buffer_view = make_buffer_view<BufferAddressSpace>(p, desc.get_element_space_size());
411 
412  return tensor_view<decltype(buffer_view), decltype(desc)>{buffer_view, desc};
413 }
414 
415 template <address_space_enum BufferAddressSpace = address_space_enum::generic,
417  typename DataType,
418  typename... Lengths,
419  typename... Strides,
420  index_t GuaranteedLastDimensionVectorLength = -1,
421  index_t GuaranteedLastDimensionVectorStride = -1,
422  typename std::enable_if<sizeof...(Lengths) == sizeof...(Strides), bool>::type = false>
423 CK_TILE_HOST_DEVICE constexpr auto
425  const tuple<Lengths...>& lengths,
426  const tuple<Strides...>& strides,
428  number<GuaranteedLastDimensionVectorStride> = number<-1>{})
429 {
430  auto desc = make_naive_tensor_descriptor(lengths,
431  strides,
432  number<GuaranteedLastDimensionVectorLength>{},
433  number<GuaranteedLastDimensionVectorStride>{});
434 
435  auto buffer_view = make_buffer_view<BufferAddressSpace>(p, desc.get_element_space_size());
436 
437  return tensor_view<decltype(buffer_view), decltype(desc), DstInMemOp>{buffer_view, desc};
438 }
439 
440 template <address_space_enum BufferAddressSpace = address_space_enum::generic,
441  typename DataType,
442  typename... Lengths,
443  index_t GuaranteedLastDimensionVectorLength = -1>
444 CK_TILE_HOST_DEVICE constexpr auto
446  const tuple<Lengths...>& lengths,
448 {
449  auto desc =
450  make_naive_tensor_descriptor_packed(lengths, number<GuaranteedLastDimensionVectorLength>{});
451 
452  auto buffer_view = make_buffer_view<BufferAddressSpace>(p, desc.get_element_space_size());
453 
454  return tensor_view<decltype(buffer_view), decltype(desc)>{buffer_view, desc};
455 }
456 
457 template <typename OldTensorView,
458  typename NewTransforms,
459  typename NewLowerDimensionOldVisibleIdss,
460  typename NewUpperDimensionNewVisibleIdss>
461 CK_TILE_HOST_DEVICE constexpr auto transform_tensor_view(const OldTensorView& old_tensor_view,
462  const NewTransforms& new_transforms,
463  NewLowerDimensionOldVisibleIdss,
464  NewUpperDimensionNewVisibleIdss)
465 {
466  auto new_desc = transform_tensor_descriptor(old_tensor_view.desc_,
467  new_transforms,
468  NewLowerDimensionOldVisibleIdss{},
469  NewUpperDimensionNewVisibleIdss{});
470 
471  return tensor_view<typename OldTensorView::buffer_view,
472  remove_cvref_t<decltype(new_desc)>,
473  remove_cvref_t<OldTensorView>::DstInMemOp>{old_tensor_view.buf_, new_desc};
474 }
475 
476 template <typename TensorView,
477  typename TileLengths, // tuple<...>
478  typename DoPads> // sequence<bool, bool, ...>
479 CK_TILE_HOST_DEVICE constexpr auto
480 pad_tensor_view(const TensorView& tensor_view, const TileLengths& tile_lengths, DoPads)
481 {
482  constexpr index_t num_dim = DoPads::size();
483 
484  static_assert(num_dim == TileLengths::size() && num_dim == TensorView::get_num_of_dimension(),
485  "wrong! inconsistent # of dimensions");
486 
487  // transforms
488  const auto transforms = generate_tuple(
489  [&](auto idim) {
490  const auto old_length = tensor_view.get_tensor_descriptor().get_length(idim);
491 
492  const auto tile_length = tile_lengths[idim];
493 
494  const auto new_length = integer_divide_ceil(old_length, tile_length) * tile_length;
495 
496  const auto pad_length = new_length - old_length;
497 
498  constexpr bool DoPad = DoPads::at(idim);
499 
500  const auto transform =
501  conditional_expr<DoPad>(make_right_pad_transform(old_length, pad_length),
502  make_pass_through_transform(old_length));
503 
504  return transform;
505  },
506  number<num_dim>{});
507 
508  // lower dimension Id
509  const auto lower_dimss =
510  generate_tuple([&](auto idim) { return sequence<idim.value>{}; }, number<num_dim>{});
511 
512  // upper dimension Id
513  const auto upper_dimss = lower_dimss;
514 
515  return transform_tensor_view(tensor_view, transforms, lower_dimss, upper_dimss);
516 }
517 
518 } // namespace ck_tile
#define CK_TILE_LDS_ADDR
Definition: config.hpp:56
#define CK_TILE_HOST_DEVICE
Definition: config.hpp:41
auto transform(InputRange &&range, OutputIterator iter, UnaryOperation unary_op) -> decltype(std::transform(std::begin(range), std::end(range), iter, unary_op))
Definition: algorithm.hpp:36
Definition: cluster_descriptor.hpp:13
constexpr CK_TILE_HOST_DEVICE auto make_right_pad_transform(const LowLength &low_length, const RightPadLength &right_pad_, bool_constant< SkipIsValidCheck >=bool_constant< false >{})
Definition: coordinate_transform.hpp:1641
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:255
constexpr CK_TILE_HOST_DEVICE auto integer_divide_ceil(X x, Y y)
Definition: math.hpp:149
constexpr CK_TILE_HOST_DEVICE auto make_naive_tensor_view(DataType *p, const tuple< Lengths... > &lengths, const tuple< Strides... > &strides, number< GuaranteedLastDimensionVectorLength >=number<-1 >{}, number< GuaranteedLastDimensionVectorStride >=number<-1 >{})
Definition: tensor_view.hpp:424
memory_operation_enum
Definition: arch.hpp:44
constexpr CK_TILE_HOST_DEVICE auto transform_tensor_view(const OldTensorView &old_tensor_view, const NewTransforms &new_transforms, NewLowerDimensionOldVisibleIdss, NewUpperDimensionNewVisibleIdss)
Definition: tensor_view.hpp:461
int32_t index_t
Definition: integer.hpp:9
constexpr CK_TILE_HOST_DEVICE auto pad_tensor_view(const TensorView &tensor_view, const TileLengths &tile_lengths, DoPads)
Definition: tensor_view.hpp:480
constexpr CK_TILE_HOST_DEVICE auto make_pass_through_transform(const LowLength &low_length)
Definition: coordinate_transform.hpp:1615
constexpr CK_TILE_HOST_DEVICE auto make_tensor_coordinate(const TensorDesc &tensor_desc, const TopIndex &idx_top)
Definition: tensor_coordinate.hpp:60
remove_cv_t< std::remove_reference_t< T > > remove_cvref_t
Definition: type_traits.hpp:20
constant< v > number
Definition: integral_constant.hpp:33
constexpr CK_TILE_HOST_DEVICE bool coordinate_has_valid_offset_assuming_top_index_is_valid(const TensorDesc &tensor_desc, const TensorCoord &coord)
Definition: tensor_coordinate.hpp:79
constexpr CK_TILE_HOST_DEVICE auto transform_tensor_descriptor(const OldTensorDescriptor &old_tensor_desc, const NewTransforms &new_transforms, NewLowerDimensionOldTopIdss, NewUpperDimensionNewTopIdss)
Definition: tensor_descriptor.hpp:184
constexpr CK_TILE_HOST_DEVICE auto make_naive_tensor_descriptor_packed(const tuple< Lengths... > &lengths, number< GuaranteedLastDimensionVectorLength >=number<-1 >{})
Definition: tensor_descriptor.hpp:352
constexpr CK_TILE_HOST_DEVICE auto make_tensor_view(DataType *p, const tensor_descriptor< Ts... > &desc)
Definition: tensor_view.hpp:407
constexpr CK_TILE_HOST_DEVICE auto generate_tuple(F &&f, number< N >)
Definition: tuple.hpp:400
typename std::remove_reference< T >::type remove_reference_t
Definition: type_traits.hpp:14
address_space_enum
Definition: arch.hpp:34
constexpr CK_TILE_HOST_DEVICE auto make_naive_tensor_view_packed(DataType *p, const tuple< Lengths... > &lengths, number< GuaranteedLastDimensionVectorLength >=number<-1 >{})
Definition: tensor_view.hpp:445
std::enable_if< B, T > enable_if
Definition: enable_if.hpp:10
Definition: array.hpp:24
Definition: buffer_view.hpp:33
Definition: integral_constant.hpp:13
Definition: tensor_view.hpp:401
Definition: sequence.hpp:52
Definition: tensor_descriptor.hpp:34
constexpr CK_TILE_HOST_DEVICE auto get_element_space_size() const
Definition: tensor_descriptor.hpp:96
Definition: tensor_view.hpp:41
constexpr CK_TILE_HOST_DEVICE void set_vectorized_elements(const TensorCoord &coord, index_t linear_offset, const X &x, bool_constant< oob_conditional_check >={})
Definition: tensor_view.hpp:233
TensorDesc desc_
Definition: tensor_view.hpp:396
CK_TILE_HOST_DEVICE void print() const
Definition: tensor_view.hpp:378
constexpr CK_TILE_HOST_DEVICE tensor_view()=default
constexpr CK_TILE_HOST_DEVICE void update_vectorized_elements_raw(const TensorCoord &coord, index_t linear_offset, const X &x, bool_constant< oob_conditional_check >={}, bool_constant< pre_nop >={})
Definition: tensor_view.hpp:346
decltype(make_tensor_coordinate(TensorDesc{}, TensorIndex{})) TensorCoord
Definition: tensor_view.hpp:46
constexpr CK_TILE_HOST_DEVICE void set_vectorized_elements_raw(const TensorCoord &coord, index_t linear_offset, bool is_valid_element, const X &x, bool_constant< oob_conditional_check >={})
Definition: tensor_view.hpp:288
constexpr CK_TILE_HOST_DEVICE void async_get_vectorized_elements_raw(remove_cvref_t< DataType > *smem, const TensorCoord &coord, index_t linear_offset, bool_constant< pre_nop >={}) const
Definition: tensor_view.hpp:194
typename buffer_view::type DataType
Definition: tensor_view.hpp:43
constexpr CK_TILE_HOST_DEVICE void update_vectorized_elements(const TensorCoord &coord, index_t linear_offset, const X &x, bool_constant< oob_conditional_check >={})
Definition: tensor_view.hpp:307
constexpr CK_TILE_HOST_DEVICE void set_vectorized_elements(const TensorCoord &coord, index_t linear_offset, bool is_valid_element, const X &x, bool_constant< oob_conditional_check >={})
Definition: tensor_view.hpp:252
constexpr CK_TILE_HOST_DEVICE void update_vectorized_elements_raw(const TensorCoord &coord, index_t linear_offset, bool is_valid_element, const X &x, bool_constant< oob_conditional_check >={}, bool_constant< pre_nop >={})
Definition: tensor_view.hpp:367
constexpr CK_TILE_HOST_DEVICE auto & get_buffer_view()
Definition: tensor_view.hpp:68
buffer_view buf_
Definition: tensor_view.hpp:395
array< index_t, TensorDesc::get_num_of_top_dimension()> TensorIndex
Definition: tensor_view.hpp:45
CK_TILE_HOST_DEVICE void get_vectorized_elements_raw(remove_cvref_t< X > &dst, const TensorCoord &coord, index_t linear_offset, bool_constant< oob_conditional_check >={}, bool_constant< pre_nop >={}) const
Definition: tensor_view.hpp:117
static constexpr auto DstInMemOp
Definition: tensor_view.hpp:47
constexpr CK_TILE_HOST_DEVICE void async_get_vectorized_elements(CK_TILE_LDS_ADDR remove_cvref_t< DataType > *smem, const TensorCoord &coord, index_t linear_offset, bool is_valid_element) const
Definition: tensor_view.hpp:175
constexpr CK_TILE_HOST_DEVICE void update_vectorized_elements(const TensorCoord &coord, index_t linear_offset, bool is_valid_element, const X &x, bool_constant< oob_conditional_check >={})
Definition: tensor_view.hpp:326
constexpr CK_TILE_HOST_DEVICE void set_vectorized_elements_raw(const TensorCoord &coord, index_t linear_offset, const X &x, bool_constant< oob_conditional_check >={})
Definition: tensor_view.hpp:269
constexpr CK_TILE_HOST_DEVICE const auto & get_buffer_view() const
Definition: tensor_view.hpp:66
CK_TILE_HOST_DEVICE void init_raw()
Definition: tensor_view.hpp:57
constexpr CK_TILE_HOST_DEVICE tensor_view(const buffer_view &buffer_view, const TensorDesc &desc)
Definition: tensor_view.hpp:51
constexpr CK_TILE_HOST_DEVICE void async_get_vectorized_elements_raw(remove_cvref_t< DataType > *smem, const TensorCoord &coord, index_t linear_offset, bool is_valid_element, bool_constant< pre_nop >={}) const
Definition: tensor_view.hpp:214
constexpr CK_TILE_HOST_DEVICE remove_cvref_t< X > get_vectorized_elements(const TensorCoord &coord, index_t linear_offset, bool is_valid_element, bool_constant< oob_conditional_check >={}) const
Definition: tensor_view.hpp:97
CK_TILE_HOST_DEVICE void get_vectorized_elements_raw(remove_cvref_t< X > &dst, const TensorCoord &coord, index_t linear_offset, bool is_valid_element, bool_constant< oob_conditional_check >={}, bool_constant< pre_nop >={}) const
Definition: tensor_view.hpp:138
constexpr CK_TILE_HOST_DEVICE auto & get_tensor_descriptor() const
Definition: tensor_view.hpp:59
constexpr CK_TILE_HOST_DEVICE remove_cvref_t< X > get_vectorized_elements(const TensorCoord &coord, index_t linear_offset, bool_constant< oob_conditional_check >={}) const
Definition: tensor_view.hpp:79
static constexpr CK_TILE_HOST_DEVICE index_t get_num_of_dimension()
Definition: tensor_view.hpp:61
remove_reference_t< BufferView_ > buffer_view
Definition: tensor_view.hpp:42
constexpr CK_TILE_HOST_DEVICE void async_get_vectorized_elements(CK_TILE_LDS_ADDR remove_cvref_t< DataType > *smem, const TensorCoord &coord, index_t linear_offset) const
Definition: tensor_view.hpp:156
remove_cvref_t< TensorDesc_ > TensorDesc
Definition: tensor_view.hpp:44
Definition: tuple.hpp:192
Definition: vector_type.hpp:60