Skip to content

Commit 3c8e5d9

Browse files
committed
Implement kernel_dim and components range mappers
1 parent e86705c commit 3c8e5d9

File tree

3 files changed

+91
-4
lines changed

3 files changed

+91
-4
lines changed

include/range_mapper.h

+45-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <stdexcept>
4+
#include <tuple>
45
#include <type_traits>
56

67
#include <CL/sycl.hpp>
@@ -172,7 +173,7 @@ namespace access {
172173
fixed(const subrange<BufferDims>& sr) : m_sr(sr) {}
173174

174175
template <int KernelDims>
175-
subrange<BufferDims> operator()(const chunk<KernelDims>&) const {
176+
subrange<BufferDims> operator()(const chunk<KernelDims>& /* chnk */) const {
176177
return m_sr;
177178
}
178179

@@ -248,6 +249,49 @@ namespace access {
248249
neighborhood(size_t, size_t)->neighborhood<2>;
249250
neighborhood(size_t, size_t, size_t)->neighborhood<3>;
250251

252+
struct kernel_dim {
253+
explicit kernel_dim(const int d) : m_dim(d) {}
254+
255+
template <int KernelDims>
256+
subrange<1> operator()(const chunk<KernelDims>& chnk) const {
257+
return {chnk.offset[m_dim], chnk.range[m_dim]};
258+
};
259+
260+
private:
261+
int m_dim;
262+
};
263+
264+
template <typename... ComponentMappers>
265+
struct components {
266+
constexpr static int buffer_dims = sizeof...(ComponentMappers);
267+
268+
explicit components(const ComponentMappers&... components) : m_mappers{components...} {}
269+
270+
template <int KernelDims>
271+
subrange<buffer_dims> operator()(const chunk<KernelDims>& chnk, const range<buffer_dims>& buffer_size) const {
272+
return apply(chnk, buffer_size, std::make_integer_sequence<int, buffer_dims>());
273+
}
274+
275+
private:
276+
std::tuple<ComponentMappers...> m_mappers;
277+
278+
template <int Dim, int KernelDims>
279+
void apply_component(const chunk<KernelDims>& chnk, const range<buffer_dims>& buffer_size, subrange<buffer_dims>& out_sr) const {
280+
static_assert(Dim < buffer_dims);
281+
const auto component_sr = detail::invoke_range_mapper_for_kernel(std::get<Dim>(m_mappers), chnk, range<1>(buffer_size[Dim]));
282+
out_sr.offset[Dim] = component_sr.offset[0];
283+
out_sr.range[Dim] = component_sr.range[0];
284+
}
285+
286+
template <int KernelDims, int... BufferDims>
287+
subrange<buffer_dims> apply(
288+
const chunk<KernelDims>& chnk, const range<buffer_dims>& buffer_size, std::integer_sequence<int, BufferDims...> /* seq */) const {
289+
subrange<buffer_dims> sr;
290+
(apply_component<BufferDims>(chnk, buffer_size, sr), ...);
291+
return sr;
292+
}
293+
};
294+
251295
} // namespace access
252296

253297
namespace experimental::access {

test/runtime_tests.cc

+45
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,51 @@ namespace detail {
185185
}
186186
}
187187

188+
TEST_CASE("kernel_dim built-in range mapper behaves as expected", "[range-mapper]") {
189+
using celerity::access::kernel_dim;
190+
{
191+
range_mapper rm{kernel_dim(0), cl::sycl::access::mode::read, range<1>{128}};
192+
auto sr = rm.map_1(chunk<1>{{1}, {4}, {7}});
193+
CHECK(sr.offset == id<1>{1});
194+
CHECK(sr.range == range<1>{4});
195+
}
196+
{
197+
range_mapper rm{kernel_dim(1), cl::sycl::access::mode::read, range<1>{128}};
198+
auto sr = rm.map_1(chunk<3>{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}});
199+
CHECK(sr.offset == id<1>{2});
200+
CHECK(sr.range == range<1>{5});
201+
}
202+
}
203+
204+
TEST_CASE("components built-in range mapper behaves as expected", "[range-mapper]") {
205+
using celerity::access::components;
206+
using celerity::access::kernel_dim;
207+
{
208+
range_mapper rm{components(all(), all(), all()), cl::sycl::access::mode::read, range<3>{128, 128, 128}};
209+
auto sr = rm.map_3(chunk<3>{{1, 2, 3}, {40, 50, 60}, {70, 80, 90}});
210+
CHECK(sr.offset == id<3>{0, 0, 0});
211+
CHECK(sr.range == range<3>{128, 128, 128});
212+
}
213+
{
214+
range_mapper rm{components(fixed(subrange<1>(19, 31)), fixed(subrange<1>(15, 44))), cl::sycl::access::mode::read, range<2>{128, 128}};
215+
auto sr = rm.map_2(chunk<3>{{1, 2, 3}, {40, 50, 60}, {70, 80, 90}});
216+
CHECK(sr.offset == id<2>{19, 15});
217+
CHECK(sr.range == range<2>{31, 44});
218+
}
219+
{
220+
range_mapper rm{components(kernel_dim(2), kernel_dim(0), kernel_dim(1)), cl::sycl::access::mode::read, range<3>{128, 128, 128}};
221+
auto sr = rm.map_3(chunk<3>{{1, 2, 3}, {40, 50, 60}, {70, 80, 90}});
222+
CHECK(sr.offset == id<3>{3, 1, 2});
223+
CHECK(sr.range == range<3>{60, 40, 50});
224+
}
225+
{
226+
range_mapper rm{components(kernel_dim(0), kernel_dim(0)), cl::sycl::access::mode::read, range<2>{128, 128}};
227+
auto sr = rm.map_2(chunk<1>{{1}, {40}, {70}});
228+
CHECK(sr.offset == id<2>{1, 1});
229+
CHECK(sr.range == range<2>{40, 40});
230+
}
231+
}
232+
188233
TEST_CASE("even_split built-in range mapper behaves as expected", "[range-mapper]") {
189234
{
190235
range_mapper rm{even_split<3>(), cl::sycl::access::mode::read, range<3>{128, 345, 678}};

website/pages/en/index.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,7 @@ int main() {
120120
distr_queue q;
121121
q.submit([&](handler &cgh) {
122122
// (2) specify data access patterns to enable distributed execution
123-
accessor m(matrix, cgh, [size](chunk<1> chnk) {
124-
return subrange<2>({chnk.offset[0], 0}, {chnk.range[0], size});
125-
}, read_only);
123+
accessor m(matrix, cgh, access::components(access::kernel_dim(0), access::all()), read_only);
126124
accessor v(vector, cgh, access::one_to_one(), read_only);
127125
accessor r(result, cgh, access::one_to_one(), write_only, no_init);
128126

0 commit comments

Comments
 (0)