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



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

在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();

在我看来,这两种代码最终的行为都是一样的。有人能解释其中的区别吗?

谢谢!

是的,如果你只做这些,它们实际上是一样的。但是,如果您将内核或其他非阻塞操作额外排入并发队列或其他队列,那么缓冲区写入或读取可能与其他操作并行运行。您还可以通过将写入事件用作后续排队任务的输入(依赖项(来跳过等待写入事件完成的过程。

当你不需要这些能力时,阻塞写入只是一种快捷方式。

最新更新