在 OpenCL 上使用阻塞写入和 event.wait() 与非阻塞写入的区别

Difference between using blocking write and event.wait() with non-blocking write on OpenCL

这可能最终会变得愚蠢,但我无意中遇到了这个问题,我自己无法回答。

在 OpenCL 中写入缓冲区时,使用以下两段代码有什么实际区别?

  1. 阻塞写入:
queue->enqueueWriteBuffer(d_vec, CL_TRUE, 0, sizeof(int) * vec.size(), vec.data());
  1. 非阻塞写入 event.wait():
cl::Event event;
queue->enqueueWriteBuffer(d_vec, CL_FALSE, 0, sizeof(int) * vec.size(), vec.data(), nullptr, &event);
event.wait();

在我看来,这两种代码最终的行为是一样的。谁能解释一下区别?

谢谢!

是的,如果您只做这些,它们实际上是一样的。但是,如果您另外将内核或其他 non-blocking 操作排队到并发队列或其他队列,则缓冲区写入或读取可能 运行 与其他操作并行。您还可以跳过等待写入事件完成的过程,方法是将事件用作后续排队任务的输入(依赖项)。

阻塞写入只是您不需要任何这些功能时的捷径。