Skip to content

Commit e7c4bf6

Browse files
authored
[SYCL][E2E] Add test for enum types as arguments in free function kernels (#19121)
Add a test that verifies that we can use scoped enums as arguments in free function kernels.
1 parent 3f3f9d5 commit e7c4bf6

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// RUN: %{build} -o %t.out
2+
// RUN: %{run} %t.out
3+
4+
// This test verifies that we can use scoped enum types as arguments in free
5+
// function kernels.
6+
7+
#include "helpers.hpp"
8+
#include <cassert>
9+
#include <sycl/ext/oneapi/free_function_queries.hpp>
10+
11+
using namespace sycl;
12+
using rAccType = sycl::accessor<int, 1, sycl::access::mode::read>;
13+
using wAccType = sycl::accessor<int, 1, sycl::access::mode::write>;
14+
using rwAccType = sycl::accessor<int, 1, sycl::access::mode::read_write>;
15+
16+
using flagType = sycl::accessor<bool, 1>;
17+
18+
template <typename T, int Dims, access::mode modeT>
19+
bool hasAccessorMode(sycl::accessor<T, Dims, modeT> acc, access::mode mode) {
20+
return modeT == mode;
21+
}
22+
23+
template <typename AccType>
24+
SYCL_EXT_ONEAPI_FUNCTION_PROPERTY((syclexp::single_task_kernel))
25+
void verifyAccessorMode(AccType acc, access::mode accMode, flagType flagAcc) {
26+
flagAcc[0] = hasAccessorMode(acc, accMode);
27+
}
28+
29+
int main() {
30+
sycl::queue Queue;
31+
sycl::context Context = Queue.get_context();
32+
sycl::kernel Kernel1 = getKernel<verifyAccessorMode<rAccType>>(Context);
33+
sycl::kernel Kernel2 = getKernel<verifyAccessorMode<wAccType>>(Context);
34+
sycl::kernel Kernel3 = getKernel<verifyAccessorMode<rwAccType>>(Context);
35+
36+
const auto rMode = sycl::access::mode::read;
37+
const auto wMode = sycl::access::mode::write;
38+
const auto rwMode = sycl::access::mode::read_write;
39+
40+
bool flag1, flag2, flag3;
41+
flag1 = (flag2 = (flag3 = false));
42+
{
43+
sycl::buffer<bool, 1> flagBuffer1(&flag1, 1);
44+
sycl::buffer<bool, 1> flagBuffer2(&flag2, 1);
45+
sycl::buffer<bool, 1> flagBuffer3(&flag3, 1);
46+
Queue.submit([&](sycl::handler &Handler) {
47+
flagType flagAcc1{flagBuffer1, Handler};
48+
rAccType acc1;
49+
50+
Handler.set_args(acc1, rMode, flagAcc1);
51+
Handler.single_task(Kernel1);
52+
});
53+
54+
Queue.submit([&](sycl::handler &Handler) {
55+
flagType flagAcc2{flagBuffer2, Handler};
56+
wAccType acc2;
57+
58+
Handler.set_args(acc2, wMode, flagAcc2);
59+
Handler.single_task(Kernel2);
60+
});
61+
62+
Queue.submit([&](sycl::handler &Handler) {
63+
flagType flagAcc3{flagBuffer3, Handler};
64+
rwAccType acc3;
65+
66+
Handler.set_args(acc3, rwMode, flagAcc3);
67+
Handler.single_task(Kernel3);
68+
});
69+
}
70+
assert(flag1 && flag2 && flag3);
71+
}

0 commit comments

Comments
 (0)