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(...)