dpc++ 错误命令组在没有内核或显式内存操作的情况下提交。 -59 (CL_INVALID_OPERATION)
dpc++ error Command group submitted without a kernel or a explicit memory operation. -59 (CL_INVALID_OPERATION)
我正在尝试 sycl/dpc++。我写了下面的代码。我正在设备端创建一个数组 deviceArr,使用 memcpy 将 hostArr 的值复制到该数组,然后使用 parallel_for 内核将 devicearray 的值递增 1,并使用 memcpy 将值复制回来。
queue q;
std::array<int, 10> hostArr;
for (auto &val : hostArr)
val = 1;
int *deviceArr = malloc_device<int>(10, q);
q.submit([&](handler &h)
{ memcpy(deviceArr, &hostArr[0], 10 * sizeof(int)); });
q.submit([&](handler &h)
{ h.parallel_for(10, [=](auto &idx)
{ deviceArr[idx]++; }); });
q.submit([&](handler &h)
{ memcpy(&hostArr[0], deviceArr, 10 * sizeof(int)); });
此代码编译正常,但在 运行 执行此代码时,我在 运行 时间内收到以下错误。
**Command group submitted without a kernel or a explicit memory operation. -59 (CL_INVALID_OPERATION)**
但是我可以看到我提交的所有队列都有内核(parallel_for
)或内存操作(memcpy
)。谁能解释为什么会出现此错误?
设备编译器只能看到从内核调用的代码和函数。这意味着您的 memcpy
是常规 std::memcpy
。 SYCL 和设备编译器无法知道您将它放在这里。
要提交您的 memcpy,您应该改为 h.memcpy(...)
!或者使用 shorthand q.memcpy()
.
最后,鉴于您使用的是 USM,您必须注意同步。不能保证这三个内核会以相同的顺序执行,除非你有一个有序的队列。您可以在每次提交后 wait()
或使用 h.depends_on(...)
我正在尝试 sycl/dpc++。我写了下面的代码。我正在设备端创建一个数组 deviceArr,使用 memcpy 将 hostArr 的值复制到该数组,然后使用 parallel_for 内核将 devicearray 的值递增 1,并使用 memcpy 将值复制回来。
queue q;
std::array<int, 10> hostArr;
for (auto &val : hostArr)
val = 1;
int *deviceArr = malloc_device<int>(10, q);
q.submit([&](handler &h)
{ memcpy(deviceArr, &hostArr[0], 10 * sizeof(int)); });
q.submit([&](handler &h)
{ h.parallel_for(10, [=](auto &idx)
{ deviceArr[idx]++; }); });
q.submit([&](handler &h)
{ memcpy(&hostArr[0], deviceArr, 10 * sizeof(int)); });
此代码编译正常,但在 运行 执行此代码时,我在 运行 时间内收到以下错误。
**Command group submitted without a kernel or a explicit memory operation. -59 (CL_INVALID_OPERATION)**
但是我可以看到我提交的所有队列都有内核(parallel_for
)或内存操作(memcpy
)。谁能解释为什么会出现此错误?
设备编译器只能看到从内核调用的代码和函数。这意味着您的 memcpy
是常规 std::memcpy
。 SYCL 和设备编译器无法知道您将它放在这里。
要提交您的 memcpy,您应该改为 h.memcpy(...)
!或者使用 shorthand q.memcpy()
.
最后,鉴于您使用的是 USM,您必须注意同步。不能保证这三个内核会以相同的顺序执行,除非你有一个有序的队列。您可以在每次提交后 wait()
或使用 h.depends_on(...)