问题描述
这可能最终很愚蠢,但是我偶然发现了这个问题,而自己却无法回答。
在OpenCL中写入缓冲区时,使用以下两段代码有什么实际区别?
- 阻止写入:
queue->enqueueWriteBuffer(d_vec,CL_TRUE,sizeof(int) * vec.size(),vec.data());
- 使用event.wait()进行无阻塞写入:
cl::Event event;
queue->enqueueWriteBuffer(d_vec,CL_FALSE,vec.data(),nullptr,&event);
event.wait();
在我看来,这两个代码最终的行为相同。谁能解释其中的区别?
谢谢!
解决方法
是的,如果您所做的就是,它们实际上是相同的。但是,如果您另外将内核或其他非阻塞操作加入到并发队列或其他队列中,则缓冲区的写或读操作可能会与其他操作并行运行。您还可以通过将该事件用作后续排队任务的输入(相关性)来跳过等待write事件完成的过程。
阻止写入只是您不需要其中任何一种功能时的快捷方式。