Skip to content

Commit 2ee73db

Browse files
committed
[SYCL] Added test using set_args with handler API
Signed-off-by: Alexander Flegontov <[email protected]>
1 parent 1000e33 commit 2ee73db

File tree

1 file changed

+255
-0
lines changed

1 file changed

+255
-0
lines changed
Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
// RUN: %clangxx -fsycl %s -o %t.out
2+
// RUN: %CPU_RUN_PLACEHOLDER %t.out
3+
// RUN: %GPU_RUN_PLACEHOLDER %t.out
4+
// RUN: %ACC_RUN_PLACEHOLDER %t.out
5+
//==--------------- handler_set_args.cpp -------------------==//
6+
//
7+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8+
// See https://llvm.org/LICENSE.txt for license information.
9+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10+
//
11+
//===----------------------------------------------------------------------===//
12+
#include <CL/sycl.hpp>
13+
#include <cassert>
14+
15+
struct use_offset {
16+
static const int no = 0;
17+
static const int yes = 1;
18+
};
19+
20+
using accessor_t =
21+
cl::sycl::accessor<int, 1, cl::sycl::access::mode::read_write,
22+
cl::sycl::access::target::global_buffer>;
23+
24+
struct single_task_functor {
25+
single_task_functor(accessor_t acc) : acc(acc) {}
26+
27+
void operator()() { acc[0] = 10; }
28+
29+
accessor_t acc;
30+
};
31+
32+
struct single_task_new_functor {
33+
single_task_new_functor(accessor_t acc) : acc(acc) {}
34+
35+
void operator()() { acc[0] = 10; }
36+
37+
accessor_t acc;
38+
};
39+
40+
template <int useOffset> struct parallel_for_range_id_functor {
41+
parallel_for_range_id_functor(accessor_t acc) : acc(acc) {}
42+
43+
void operator()(cl::sycl::id<1> id) { acc[0] = 10; }
44+
45+
accessor_t acc;
46+
};
47+
48+
template <int useOffset> struct parallel_for_range_item_functor {
49+
parallel_for_range_item_functor(accessor_t acc) : acc(acc) {}
50+
51+
void operator()(cl::sycl::item<1> item) { acc[0] = 10; }
52+
53+
accessor_t acc;
54+
};
55+
56+
struct parallel_for_nd_range_functor {
57+
parallel_for_nd_range_functor(accessor_t acc) : acc(acc) {}
58+
59+
void operator()(cl::sycl::nd_item<1> ndItem) { acc[0] = 10; }
60+
61+
accessor_t acc;
62+
};
63+
64+
template <class kernel_name>
65+
cl::sycl::kernel get_prebuilt_kernel(cl::sycl::queue &queue) {
66+
cl::sycl::program program(queue.get_context());
67+
program.build_with_kernel_type<kernel_name>();
68+
return program.get_kernel<kernel_name>();
69+
}
70+
71+
const cl::sycl::range<1> range = 1;
72+
73+
template <class kernel_wrapper>
74+
void check_api_call(cl::sycl::queue &queue, kernel_wrapper &&kernelWrapper) {
75+
int result = 0;
76+
{
77+
auto buf = cl::sycl::buffer<int, 1>(&result, range);
78+
queue.submit([&](cl::sycl::handler &cgh) {
79+
auto acc = buf.get_access<cl::sycl::access::mode::read_write>(cgh);
80+
kernelWrapper(cgh, acc);
81+
});
82+
}
83+
assert(result == 10);
84+
}
85+
86+
int main() {
87+
cl::sycl::queue queue;
88+
const cl::sycl::id<1> offset(0);
89+
90+
const cl::sycl::nd_range<1> ndRange(range, range);
91+
92+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
93+
cgh.single_task(single_task_functor(acc));
94+
});
95+
96+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
97+
cgh.parallel_for(range, parallel_for_range_id_functor<use_offset::no>(acc));
98+
});
99+
100+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
101+
cgh.parallel_for(range, offset,
102+
parallel_for_range_id_functor<use_offset::yes>(acc));
103+
});
104+
105+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
106+
cgh.parallel_for(range,
107+
parallel_for_range_item_functor<use_offset::no>(acc));
108+
});
109+
110+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
111+
cgh.parallel_for(range, offset,
112+
parallel_for_range_item_functor<use_offset::yes>(acc));
113+
});
114+
115+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
116+
cgh.parallel_for(ndRange, parallel_for_nd_range_functor(acc));
117+
});
118+
119+
{
120+
auto preBuiltKernel = get_prebuilt_kernel<single_task_functor>(queue);
121+
122+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
123+
cgh.set_args(acc);
124+
cgh.single_task(preBuiltKernel);
125+
});
126+
}
127+
128+
{
129+
auto preBuiltKernel =
130+
get_prebuilt_kernel<parallel_for_range_id_functor<use_offset::no>>(
131+
queue);
132+
133+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
134+
cgh.set_args(acc);
135+
cgh.parallel_for(range, preBuiltKernel);
136+
});
137+
}
138+
139+
{
140+
auto preBuiltKernel =
141+
get_prebuilt_kernel<parallel_for_range_id_functor<use_offset::yes>>(
142+
queue);
143+
144+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
145+
cgh.set_args(acc);
146+
cgh.parallel_for(range, offset, preBuiltKernel);
147+
});
148+
}
149+
150+
{
151+
auto preBuiltKernel =
152+
get_prebuilt_kernel<parallel_for_range_item_functor<use_offset::no>>(
153+
queue);
154+
155+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
156+
cgh.set_args(acc);
157+
cgh.parallel_for(range, preBuiltKernel);
158+
});
159+
}
160+
161+
{
162+
auto preBuiltKernel =
163+
get_prebuilt_kernel<parallel_for_range_item_functor<use_offset::yes>>(
164+
queue);
165+
166+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
167+
cgh.set_args(acc);
168+
cgh.parallel_for(range, offset, preBuiltKernel);
169+
});
170+
}
171+
172+
{
173+
auto preBuiltKernel =
174+
get_prebuilt_kernel<parallel_for_nd_range_functor>(queue);
175+
176+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
177+
cgh.set_args(acc);
178+
cgh.parallel_for(ndRange, preBuiltKernel);
179+
});
180+
}
181+
182+
{
183+
auto preBuiltKernel = get_prebuilt_kernel<single_task_functor>(queue);
184+
185+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
186+
cgh.set_args(acc);
187+
cgh.single_task<class other_kernel_name1>(preBuiltKernel,
188+
[=]() { acc[0] = 10; });
189+
});
190+
}
191+
192+
{
193+
auto preBuiltKernel =
194+
get_prebuilt_kernel<parallel_for_range_id_functor<use_offset::no>>(
195+
queue);
196+
197+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
198+
cgh.set_args(acc);
199+
cgh.parallel_for<class other_kernel_name2>(
200+
preBuiltKernel, range, [=](cl::sycl::id<1> id) { acc[0] = 10; });
201+
});
202+
}
203+
204+
{
205+
auto preBuiltKernel =
206+
get_prebuilt_kernel<parallel_for_range_id_functor<use_offset::yes>>(
207+
queue);
208+
209+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
210+
cgh.set_args(acc);
211+
cgh.parallel_for<class other_kernel_name3>(
212+
preBuiltKernel, range, offset,
213+
[=](cl::sycl::id<1> id) { acc[0] = 10; });
214+
});
215+
}
216+
217+
{
218+
auto preBuiltKernel =
219+
get_prebuilt_kernel<parallel_for_range_item_functor<use_offset::no>>(
220+
queue);
221+
222+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
223+
cgh.set_args(acc);
224+
cgh.parallel_for<class other_kernel_name4>(
225+
preBuiltKernel, range, [=](cl::sycl::item<1> item) { acc[0] = 10; });
226+
});
227+
}
228+
229+
{
230+
auto preBuiltKernel =
231+
get_prebuilt_kernel<parallel_for_range_item_functor<use_offset::yes>>(
232+
queue);
233+
234+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
235+
cgh.set_args(acc);
236+
cgh.parallel_for<class other_kernel_name5>(
237+
preBuiltKernel, range, offset,
238+
[=](cl::sycl::item<1> item) { acc[0] = 10; });
239+
});
240+
}
241+
242+
{
243+
auto preBuiltKernel =
244+
get_prebuilt_kernel<parallel_for_nd_range_functor>(queue);
245+
246+
check_api_call(queue, [&](cl::sycl::handler &cgh, accessor_t acc) {
247+
cgh.set_args(acc);
248+
cgh.parallel_for<class other_kernel_name6>(
249+
preBuiltKernel, ndRange,
250+
[=](cl::sycl::nd_item<1> ndItem) { acc[0] = 10; });
251+
});
252+
}
253+
254+
return 0;
255+
}

0 commit comments

Comments
 (0)