#include <sycl/sycl.hpp>
#include <vector>
int main() {
constexpr int N = 1024;
std::vector<int> dataA(N, 1), dataB(N);
sycl::queue q;
int *devA = sycl::malloc_device<int>(N, q);
int *devB = sycl::malloc_device<int>(N, q);
sycl::event e1 = q.copy(dataA.data(), devA, N);
sycl::event e2 = q.copy(dataB.data(), devB, N);
sycl::event e3 = q.parallel_for(N, e1, [=](sycl::id<1> i) { devA[i] *= 2; });
sycl::event e4 = q.parallel_for(N, e2, [=](sycl::id<1> i) { devB[i] += 1; });
q.copy(devA, dataA.data(), N, e3).wait();
q.copy(devB, dataB.data(), N, e4).wait();
assert(dataA == std::vector<int>(N, 2));
assert(dataB == std::vector<int>(N, 2));
sycl::free(devA, q);
sycl::free(devB, q);
}
* Two independent chains never share an `event`, so the runtime is free to overlap them.
* Each kernel depends only on its own copy: Kernel A on `e1`, Kernel B on `e2`.
* Each copy-back depends only on its own kernel, so the two chains never meet.
* The two chains can execute in any order, or concurrently if the device allows.