这可能会很愚蠢,但我偶然发现了这个问题,而且我自己无法回答。
在 OpenCL 中写入缓冲区时使用以下两段代码有什么实际区别?
- 阻止写入:
queue->enqueueWriteBuffer(d_vec, CL_TRUE, 0, sizeof(int) * vec.size(), vec.data());
- 使用 event.wait() 进行非阻塞写入:
cl::Event event;
queue->enqueueWriteBuffer(d_vec, CL_FALSE, 0, sizeof(int) * vec.size(), vec.data(), nullptr, &event);
event.wait();
在我看来,这两个代码最终的行为是相同的。谁能解释一下其中的区别吗?
谢谢!
最佳答案
是的,如果您只是这么做的话,它们实际上是相同的。但是,如果您另外将内核或其他非阻塞操作排队到并发队列或其他队列,则缓冲区写入或读取可能会与这些其他操作并行运行。您还可以通过使用事件作为后续排队任务的输入(依赖项)来跳过等待写入事件完成的过程。
阻塞写入只是当您不需要任何这些功能时的捷径。
关于gpu - 在 OpenCL 上使用阻塞写入和 event.wait() 与非阻塞写入之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64547520/