31 template <
size_t dimension>
32 struct IncrementIterators
34 template <
typename T,
typename... Ts>
35 static void unroll(T &&it, Ts &&...iterators)
37 auto increment = [](T &&it) { it.increment(dimension); };
38 utility::for_each(increment, std::forward<T>(it), std::forward<Ts>(iterators)...);
47 struct ForEachDimension
49 template <
typename L,
typename... Ts>
50 static void unroll(
const Window &
w, Coordinates &
id, L &&lambda_function, Ts &&...iterators)
52 const auto &d =
w[dim - 1];
54 for (
auto v = d.start(); v < d.end(); v += d.step(), IncrementIterators<dim - 1>::unroll(iterators...))
57 ForEachDimension<dim - 1>::unroll(
w,
id, lambda_function, iterators...);
63 struct ForEachDimension<0>
65 template <
typename L,
typename... Ts>
66 static void unroll(
const Window &
w, Coordinates &
id, L &&lambda_function, Ts &&...iterators)
73 template <
typename L,
typename... Ts>
84 ForEachDimension<Coordinates::num_max_dimensions>::unroll(
w,
id, std::forward<L>(lambda_function),
85 std::forward<Ts>(iterators)...);
97 initialize(
tensor->info()->num_dimensions(),
tensor->info()->strides_in_bytes(),
tensor->buffer(),
98 tensor->info()->offset_first_element_in_bytes(), win);
104 initialize(num_dims, strides, buffer,
offset, win);
108 Iterator::initialize(
size_t num_dims,
const Strides &strides, uint8_t *buffer,
size_t offset,
const Window &win)
115 for (
unsigned int n = 0; n < num_dims; ++n)
117 _dims[n]._stride = win[n].step() * strides[n];
118 std::get<0>(_dims)._dim_start +=
static_cast<size_t>(strides[n]) * win[n].start();
124 _dims[n]._dim_start = std::get<0>(_dims)._dim_start;
134 _dims[dimension]._dim_start += _dims[dimension]._stride;
136 for (
unsigned int n = 0; n < dimension; ++n)
138 _dims[n]._dim_start = _dims[dimension]._dim_start;
144 return _dims.at(0)._dim_start;
149 return _ptr + _dims.at(0)._dim_start;
156 _dims[dimension]._dim_start = _dims[dimension + 1]._dim_start;
158 for (
unsigned int n = 0; n < dimension; ++n)
160 _dims[n]._dim_start = _dims[dimension]._dim_start;
166 int num_elements =
shape.total_size();
173 for (
int d =
shape.num_dimensions() - 1; d >= 0; --d)
175 num_elements /=
shape[d];
176 coord.set(d, index / num_elements);
177 index %= num_elements;
185 int num_elements =
shape.total_size();
194 index += coord[d] * stride;
205 "Cannot retrieve the dimension index for an unknown layout!");
207 const auto &it = std::find(dims.cbegin(), dims.cend(), data_layout_dimension);
209 return it - dims.cbegin();
215 "Cannot retrieve the layout dimension for an unknown layout!");