我正在浏览 CCL 代码示例以及 oneapi 工具包。在下面的 DPC++(SYCL) 代码中,最初 sendbuf 在 cpu 端创建了一个缓冲区,但未初始化,在卸载到目标设备的部分中,dev_acc_sbuf[id] 变量是内核范围内的一个变量被修改. 因此,该变量(dev_acc_sbuf)没有在程序中使用,也没有将其值复制回 sendbuf。然后在下一行中,sendbuf 变量用于 allreduce。我无法理解更改 dev_acc_sbuf 如何更改 sendbuf。
cl::sycl::queue q;
cl::sycl::buffer<int, 1> sendbuf(COUNT);
/* open sendbuf and modify it on the target device side */
q.submit([&](cl::sycl::handler& cgh) {
auto dev_acc_sbuf = sendbuf.get_access<mode::write>(cgh);
cgh.parallel_for<class allreduce_test_sbuf_modify>(range<1>{COUNT}, [=](item<1> id) {
dev_acc_sbuf[id] += 1;
});
});
/* invoke ccl_allreduce on the CPU side */
ccl_allreduce(&sendbuf,
&recvbuf,
COUNT,
ccl_dtype_int,
ccl_reduction_sum,
NULL,
NULL,
stream,
&request);