26 #include <type_traits>
35 template <
size_t RANK>
38 template <
typename... ARGS>
40 : data_(static_cast<uchar *>(data)), strides_{strides...} {
41 static_assert(
sizeof...(ARGS) == RANK,
42 "StridedDataWrap sizeof...(ARGS) == RANK");
45 template <
typename T,
typename... ARGS>
46 __device__ __host__ T &
at(ARGS... idx) {
47 return const_cast<T &
>(
49 std::forward<ARGS>(idx)...));
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");
57 int64_t coords[] = {idx...};
61 for (
int i = 0; i < RANK; ++i) {
62 index += coords[i] * strides_[i];
65 return *(
static_cast<T *
>(
static_cast<void *
>(this->data_ + index)));
70 int64_t strides_[RANK];
73 template <eTensorLayout LAYOUT>
101 template <eTensorLayout LAYOUT>
105 template <eTensorLayout LAYOUT>
108 return get_sdwrapper<LAYOUT>(
static_cast<const roccv::Tensor &
>(tensor));
121 const auto height_s =
122 tensor_data.stride(tensor.shape().layout().height_index());
124 tensor_data.stride(tensor.shape().layout().width_index());
125 const auto channels_s =
126 tensor_data.stride(tensor.shape().layout().channels_index());
128 const auto batch_i = tensor.shape().layout().batch_index();
131 ? tensor_data.stride(batch_i)
132 : height_s * tensor.shape()[tensor.shape().layout().height_index()];
135 tensor_data.basePtr(), batch_s, height_s, width_s, channels_s);
147 const auto height_s =
148 tensor_data.stride(tensor.shape().layout().height_index());
150 tensor_data.stride(tensor.shape().layout().width_index());
151 const auto channels_s =
152 tensor_data.stride(tensor.shape().layout().channels_index());
154 const auto batch_i = tensor.shape().layout().batch_index();
155 const auto batch_s = tensor_data.stride(batch_i);
158 tensor_data.stride(tensor.shape().layout().sift_octave_layer_index());
161 tensor_data.basePtr(), layer_s, batch_s, height_s, width_s, channels_s);
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());
180 tensor_data.basePtr(), batch_s, maxFeatures_s, features_s);
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());
199 tensor_data.basePtr(), batch_s, maxFeatures_s, features_s);
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