From 1fb202fa89e7b0352521daf224a72fecb9fff342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Tue, 14 Oct 2025 17:03:32 +0800 Subject: [PATCH] feat: add test `USM explicit data movement` --- tests/fig-3-4_usm-explicit-data-movement.cpp | 46 ++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 tests/fig-3-4_usm-explicit-data-movement.cpp diff --git a/tests/fig-3-4_usm-explicit-data-movement.cpp b/tests/fig-3-4_usm-explicit-data-movement.cpp new file mode 100644 index 0000000..91ba25d --- /dev/null +++ b/tests/fig-3-4_usm-explicit-data-movement.cpp @@ -0,0 +1,46 @@ +// Figure 3-4. USM explicit data movement +// from book - Data Parallel C++ +// https://link.springer.com/book/10.1007/978-1-4842-5574-2 + +#include +#include + +constexpr int N = 42; + +int main() { + sycl::queue Q; + + std::array host_array; + int *device_array = sycl::malloc_device(N, Q); + + for (int i = 0; i < N; i++) { + host_array[i] = N; + } + + // We will learn how to simplify this example later + Q.submit([&](sycl::handler &h) { + // copy hostArray to deviceArray + h.memcpy(device_array, &host_array[0], N * sizeof(int)); + }).wait(); + + Q.submit([&](sycl::handler &h) { + h.parallel_for(N, [=](sycl::id<1> i) { device_array[i]++; }); + }).wait(); + + Q.submit([&](sycl::handler &h) { + // copy deviceArray back to hostArray + h.memcpy(&host_array[0], device_array, N * sizeof(int)); + }).wait(); + + sycl::free(device_array, Q); + + for (int i = 0; i < host_array.size(); i++) { + if (host_array[i] != N + 1) { + std::cerr << "Expect " << N + 1 << " at idx " << i << " but got " << host_array[i] + << std::endl; + return -1; + } + } + + return 0; +} \ No newline at end of file