17 static_assert(stopDim > startDim,
"stopDim must be greater than startDim");
19 if constexpr (stopDim - startDim == 3) {
20 return tbb::parallel_reduce(
21 tbb::blocked_range3d<size_t, size_t, size_t>(0, grid_size[startDim], 0, grid_size[startDim + 1], 0,
22 grid_size[startDim + 2]),
24 [&](
const tbb::blocked_range3d<size_t, size_t, size_t> &r, NT value) -> NT {
26 for (
size_t i = r.pages().begin(); i != r.pages().end(); ++i) {
28 for (
size_t j = r.rows().begin(); j != r.rows().end(); ++j) {
29 l_idx[startDim + 1] = j;
30 for (
size_t k = r.cols().begin(); k != r.cols().end(); ++k) {
31 l_idx[startDim + 2] = k;
32 value += functor(l_idx);
39 }
else if constexpr (stopDim - startDim == 2) {
40 return tbb::parallel_reduce(
41 tbb::blocked_range2d<size_t, size_t>(0, grid_size[startDim], 0, grid_size[startDim + 1]), NT(0),
42 [&](
const tbb::blocked_range2d<size_t, size_t> &r, NT value) -> NT {
44 for (
size_t i = r.rows().begin(); i != r.rows().end(); ++i) {
46 for (
size_t j = r.cols().begin(); j != r.cols().end(); ++j) {
47 l_idx[startDim + 1] = j;
48 value += functor(l_idx);
54 }
else if constexpr (stopDim - startDim == 1) {
55 return tbb::parallel_reduce(
56 tbb::blocked_range<size_t>(0, grid_size[startDim]), NT(0),
57 [&](
const tbb::blocked_range<size_t> &r, NT value) -> NT {
59 for (
size_t i = r.begin(); i != r.end(); ++i) {
61 value += functor(l_idx);
67 return tbb::parallel_reduce(
68 tbb::blocked_range3d<size_t, size_t, size_t>(0, grid_size[startDim], 0, grid_size[startDim + 1], 0,
69 grid_size[startDim + 2]),
71 [&](
const tbb::blocked_range3d<size_t, size_t, size_t> &r, NT value) -> NT {
73 for (
size_t i = r.pages().begin(); i != r.pages().end(); ++i) {
75 for (
size_t j = r.rows().begin(); j != r.rows().end(); ++j) {
76 l_idx[startDim + 1] = j;
77 for (
size_t k = r.cols().begin(); k != r.cols().end(); ++k) {
78 l_idx[startDim + 2] = k;