Skip to content
This repository was archived by the owner on Mar 28, 2023. It is now read-only.

Commit 0fe3ffd

Browse files
authored
[SYCL] Add test for classes implicitly converted from items in parallel_for (#607)
1 parent 40d6183 commit 0fe3ffd

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// RUN: %clangxx -fsycl -fsycl-targets=%sycl_triple %s -o %t.out
2+
// RUN: %HOST_RUN_PLACEHOLDER %t.out
3+
// RUN: %CPU_RUN_PLACEHOLDER %t.out
4+
// RUN: %GPU_RUN_PLACEHOLDER %t.out
5+
// RUN: %ACC_RUN_PLACEHOLDER %t.out
6+
7+
// This test performs basic check of supporting user defined class that are
8+
// implicitly converted from sycl::item/sycl::nd_item in parallel_for.
9+
10+
#include <CL/sycl.hpp>
11+
#include <iostream>
12+
13+
template <int Dimensions> class item_wrapper {
14+
public:
15+
item_wrapper(sycl::item<Dimensions> it) : m_item(it) {}
16+
17+
size_t get() { return m_item; }
18+
19+
private:
20+
sycl::item<Dimensions> m_item;
21+
};
22+
23+
template <int Dimensions> class nd_item_wrapper {
24+
public:
25+
nd_item_wrapper(sycl::nd_item<Dimensions> it) : m_item(it) {}
26+
27+
size_t get() { return m_item.get_global_linear_id(); }
28+
29+
private:
30+
sycl::nd_item<Dimensions> m_item;
31+
};
32+
33+
int main() {
34+
sycl::queue q;
35+
36+
// Initialize data array
37+
const int sz = 16;
38+
int data[sz] = {0};
39+
for (int i = 0; i < sz; ++i) {
40+
data[i] = i;
41+
}
42+
43+
// Check user defined sycl::item wrapper
44+
sycl::buffer<int> data_buf(data, sz);
45+
q.submit([&](sycl::handler &h) {
46+
auto buf_acc = data_buf.get_access<sycl::access::mode::read_write>(h);
47+
h.parallel_for(sycl::range<1>{sz},
48+
[=](item_wrapper<1> item) { buf_acc[item.get()] += 1; });
49+
});
50+
q.wait();
51+
bool failed = false;
52+
53+
{
54+
auto buf_acc = data_buf.get_access<sycl::access::mode::read>();
55+
for (int i = 0; i < sz; ++i) {
56+
failed |= (buf_acc[i] != i + 1);
57+
}
58+
if (failed) {
59+
std::cout << "item_wrapper check failed" << std::endl;
60+
return 1;
61+
}
62+
}
63+
64+
// Check user defined sycl::nd_item wrapper
65+
q.submit([&](sycl::handler &h) {
66+
auto buf_acc = data_buf.get_access<sycl::access::mode::read_write>(h);
67+
h.parallel_for(sycl::nd_range<1>{sz, 2},
68+
[=](nd_item_wrapper<1> item) { buf_acc[item.get()] += 1; });
69+
});
70+
q.wait();
71+
72+
{
73+
auto buf_acc = data_buf.get_access<sycl::access::mode::read>();
74+
for (int i = 0; i < sz; ++i) {
75+
failed |= (buf_acc[i] != i + 2);
76+
}
77+
if (failed) {
78+
std::cout << "nd_item_wrapper check failed" << std::endl;
79+
return 1;
80+
}
81+
}
82+
83+
std::cout << "Test passed" << std::endl;
84+
return 0;
85+
}

0 commit comments

Comments
 (0)