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

问题描述

这可能最终很愚蠢,但是我偶然发现了这个问题,而自己却无法回答。

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

  1. 阻止写入:
queue->enqueueWriteBuffer(d_vec,CL_TRUE,sizeof(int) * vec.size(),vec.data());
  1. 使用event.wait()进行无阻塞写入:
cl::Event event;
queue->enqueueWriteBuffer(d_vec,CL_FALSE,vec.data(),nullptr,&event);
event.wait();

在我看来,这两个代码最终的行为相同。谁能解释其中的区别?

谢谢!

解决方法

是的,如果您所做的就是,它们实际上是相同的。但是,如果您另外将内核或其他非阻塞操作加入到并发队列或其他队列中,则缓冲区的写或读操作可能会与其他操作并行运行。您还可以通过将该事件用作后续排队任务的输入(相关性)来跳过等待write事件完成的过程。

阻止写入只是您不需要其中任何一种功能时的快捷方式。