1
0
mirror of https://github.com/fumiama/base16384-sycl.git synced 2026-06-05 00:32:49 +08:00
Files
base16384-sycl/tests/fig-3-11_using-events-and-depends-on.cpp
2026-01-09 14:43:48 +08:00

69 lines
1.6 KiB
C++

// Figure 3-11. Using events and depends_on
// from book - Data Parallel C++
// https://link.springer.com/book/10.1007/978-1-4842-5574-2
#include <sycl/sycl.hpp>
constexpr int N = 4;
int main() {
sycl::queue Q;
std::array<int, N> data1;
sycl::buffer B1{data1};
std::array<int, N> data2;
sycl::buffer B2{data2};
// Task A
auto eA = Q.submit([&](sycl::handler& h) {
sycl::accessor A1{B1, h};
sycl::accessor A2{B2, h};
h.parallel_for(N, [=](sycl::id<1> i) {
A1[i] = 233;
A2[i] = 666;
});
});
eA.wait();
// Task B
auto eB = Q.submit([&](sycl::handler& h) {
sycl::accessor A1{B1, h};
sycl::accessor A2{B2, h};
h.parallel_for(N, [=](sycl::id<1> i) {
A1[i] += i; // 233 234 235 236
A2[i] += A1[i]; // 899 900 901 902
});
});
// Task C
auto eC = Q.submit([&](sycl::handler& h) {
sycl::accessor A2{B2, h};
h.depends_on(eB);
h.parallel_for(N, [=](sycl::id<1> i) {
A2[i] <<= 1; // 1798 1800 1802 1804
});
});
// Task D
auto eD = Q.submit([&](sycl::handler& h) {
sycl::accessor A1{B1, h};
sycl::accessor A2{B2, h};
h.depends_on({eB, eC});
h.parallel_for(N, [=](sycl::id<1> i) {
A2[i] += A1[i] * i; // 1798 2034 2272 2512
});
});
std::array<int, N> expected{1798, 2034, 2272, 2512};
sycl::host_accessor A2{B2}; // if use data2 directly, the data may have not been synced
for (int i = 0; i < expected.size(); i++) {
if (A2[i] != expected[i]) {
std::cerr << "Expect " << expected[i] << " at idx " << i << " but got " << A2[i] << std::endl;
return -1;
}
}
std::cout << "Test Passed!!!" << std::endl;
return 0;
}