/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-roccv/checkouts/latest/include/common/strided_data_wrap.hpp Source File

/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-roccv/checkouts/latest/include/common/strided_data_wrap.hpp Source File#

6 min read time

Applies to Linux

rocCV: /home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-roccv/checkouts/latest/include/common/strided_data_wrap.hpp Source File
strided_data_wrap.hpp
Go to the documentation of this file.
1 
22 #pragma once
23 
24 #include <cstddef>
25 #include <iostream>
26 #include <type_traits>
27 
28 #include "core/exception.hpp"
29 #include "core/status_type.h"
30 #include "core/tensor.hpp"
31 #include "core/tensor_data.hpp"
32 
33 namespace roccv::detail {
34 
35 template </*typename T, */ size_t RANK>
37  public:
38  template <typename... ARGS>
39  StridedDataWrap(void *data, ARGS... strides)
40  : data_(static_cast<uchar *>(data)), strides_{strides...} {
41  static_assert(sizeof...(ARGS) == RANK,
42  "StridedDataWrap sizeof...(ARGS) == RANK");
43  }
44 
45  template <typename T, typename... ARGS>
46  __device__ __host__ T &at(ARGS... idx) {
47  return const_cast<T &>(
48  static_cast<const StridedDataWrap<RANK> &>(*this).at<T>(
49  std::forward<ARGS>(idx)...));
50  }
51 
52  template <typename T, typename... ARGS>
53  __device__ __host__ const T &at(ARGS... idx) const {
54  static_assert(sizeof...(ARGS) == RANK,
55  "StridedDataWrap sizeof...(ARGS) == RANK");
56 
57  int64_t coords[] = {idx...};
58 
59  size_t index = 0;
60 #pragma unroll
61  for (int i = 0; i < RANK; ++i) {
62  index += coords[i] * strides_[i];
63  }
64 
65  return *(static_cast<T *>(static_cast<void *>(this->data_ + index)));
66  }
67 
68  private:
69  unsigned char *data_;
70  int64_t strides_[RANK];
71 };
72 
73 template <eTensorLayout LAYOUT>
74 constexpr size_t layout_get_rank();
75 
76 template <>
78  return 5;
79 }
80 
81 template <>
83  return 4;
84 }
85 
86 template <>
88  return 3;
89 }
90 
91 template <>
93  return 3;
94 }
95 
96 template <>
98  return 3;
99 }
100 
101 template <eTensorLayout LAYOUT>
102 inline auto get_sdwrapper(const roccv::Tensor &tensor)
104 
105 template <eTensorLayout LAYOUT>
106 inline auto get_sdwrapper(roccv::Tensor &tensor)
108  return get_sdwrapper<LAYOUT>(static_cast<const roccv::Tensor &>(tensor));
109 }
110 
111 template <>
114  auto tensor_data = tensor.exportData<roccv::TensorDataStrided>();
115 
116  if (tensor.shape().layout() != TENSOR_LAYOUT_NHWC &&
117  tensor.shape().layout() != TENSOR_LAYOUT_HWC) {
119  }
120 
121  const auto height_s =
122  tensor_data.stride(tensor.shape().layout().height_index());
123  const auto width_s =
124  tensor_data.stride(tensor.shape().layout().width_index());
125  const auto channels_s =
126  tensor_data.stride(tensor.shape().layout().channels_index());
127 
128  const auto batch_i = tensor.shape().layout().batch_index();
129  const auto batch_s =
130  (batch_i >= 0)
131  ? tensor_data.stride(batch_i)
132  : height_s * tensor.shape()[tensor.shape().layout().height_index()];
133 
135  tensor_data.basePtr(), batch_s, height_s, width_s, channels_s);
136 }
137 
138 template <>
141  auto tensor_data = tensor.exportData<roccv::TensorDataStrided>();
142 
143  if (tensor.shape().layout() != TENSOR_LAYOUT_LNHWC) {
145  }
146 
147  const auto height_s =
148  tensor_data.stride(tensor.shape().layout().height_index());
149  const auto width_s =
150  tensor_data.stride(tensor.shape().layout().width_index());
151  const auto channels_s =
152  tensor_data.stride(tensor.shape().layout().channels_index());
153 
154  const auto batch_i = tensor.shape().layout().batch_index();
155  const auto batch_s = tensor_data.stride(batch_i);
156 
157  const auto layer_s =
158  tensor_data.stride(tensor.shape().layout().sift_octave_layer_index());
159 
161  tensor_data.basePtr(), layer_s, batch_s, height_s, width_s, channels_s);
162 }
163 
164 template <>
167  auto tensor_data = tensor.exportData<roccv::TensorDataStrided>();
168 
169  if (tensor.shape().layout() != TENSOR_LAYOUT_NMC) {
171  }
172  const auto batch_i = tensor.shape().layout().batch_index();
173  const auto batch_s = tensor_data.stride(batch_i);
174  const auto maxFeatures_s =
175  tensor_data.stride(tensor.shape().layout().max_features_index());
176  const auto features_s =
177  tensor_data.stride(tensor.shape().layout().sift_features_index());
178 
180  tensor_data.basePtr(), batch_s, maxFeatures_s, features_s);
181 }
182 
183 template <>
186  auto tensor_data = tensor.exportData<roccv::TensorDataStrided>();
187 
188  if (tensor.shape().layout() != TENSOR_LAYOUT_NMD) {
190  }
191  const auto batch_i = tensor.shape().layout().batch_index();
192  const auto batch_s = tensor_data.stride(batch_i);
193  const auto maxFeatures_s =
194  tensor_data.stride(tensor.shape().layout().max_features_index());
195  const auto features_s =
196  tensor_data.stride(tensor.shape().layout().sift_features_index());
197 
199  tensor_data.basePtr(), batch_s, maxFeatures_s, features_s);
200 }
201 }
Definition: exception.hpp:31
Holds the underlying tensor data alongside tensor metadata. This particular tensor data type is used ...
Definition: tensor_data.hpp:114
Definition: tensor.hpp:37
Definition: strided_data_wrap.hpp:36
StridedDataWrap(void *data, ARGS... strides)
Definition: strided_data_wrap.hpp:39
__device__ __host__ T & at(ARGS... idx)
Definition: strided_data_wrap.hpp:46
__device__ __host__ const T & at(ARGS... idx) const
Definition: strided_data_wrap.hpp:53
Definition: strided_data_wrap.hpp:33
constexpr size_t layout_get_rank< TENSOR_LAYOUT_NMD >()
Definition: strided_data_wrap.hpp:97
constexpr size_t layout_get_rank< TENSOR_LAYOUT_HWC >()
Definition: strided_data_wrap.hpp:87
auto get_sdwrapper< TENSOR_LAYOUT_NMD >(const roccv::Tensor &tensor) -> const StridedDataWrap< layout_get_rank< TENSOR_LAYOUT_NMD >()>
Definition: strided_data_wrap.hpp:184
constexpr size_t layout_get_rank< TENSOR_LAYOUT_LNHWC >()
Definition: strided_data_wrap.hpp:77
auto get_sdwrapper< TENSOR_LAYOUT_LNHWC >(const roccv::Tensor &tensor) -> const StridedDataWrap< layout_get_rank< TENSOR_LAYOUT_LNHWC >()>
Definition: strided_data_wrap.hpp:139
constexpr size_t layout_get_rank< TENSOR_LAYOUT_NMC >()
Definition: strided_data_wrap.hpp:92
auto get_sdwrapper< TENSOR_LAYOUT_NHWC >(const roccv::Tensor &tensor) -> const StridedDataWrap< layout_get_rank< TENSOR_LAYOUT_NHWC >()>
Definition: strided_data_wrap.hpp:112
constexpr size_t layout_get_rank()
auto get_sdwrapper(const roccv::Tensor &tensor) -> const StridedDataWrap< layout_get_rank< LAYOUT >()>
auto get_sdwrapper< TENSOR_LAYOUT_NMC >(const roccv::Tensor &tensor) -> const StridedDataWrap< layout_get_rank< TENSOR_LAYOUT_NMC >()>
Definition: strided_data_wrap.hpp:165
constexpr size_t layout_get_rank< TENSOR_LAYOUT_NHWC >()
Definition: strided_data_wrap.hpp:82
@ INTERNAL_ERROR
the operation cannot be executed because of incorrect context.
@ TENSOR_LAYOUT_NMC
Definition: util_enums.h:44
@ TENSOR_LAYOUT_HWC
Definition: util_enums.h:40
@ TENSOR_LAYOUT_LNHWC
Definition: util_enums.h:48
@ TENSOR_LAYOUT_NMD
Definition: util_enums.h:46
@ TENSOR_LAYOUT_NHWC
Definition: util_enums.h:39