0

我正在尝试 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)。谁能解释为什么会发生此错误?

4

1 回答 1

2

设备编译器只能看到从内核调用的代码和函数。这意味着你memcpy是常规的std::memcpy。SYCL 和设备编译器无法知道您将其放在这里。

要提交你的 memcpy,你应该改写h.memcpy(...)!或使用速记q.memcpy()

最后,鉴于您使用的是 USM,您必须注意同步。除非您有一个有序队列,否则不能保证三个内核将以相同的顺序执行。您可以wait()在每次提交后或使用h.depends_on(...)

于 2021-09-07T09:13:21.743 回答