关于内核执行期间的clEnqueueWriteBuffer()

时间:2012-10-03 16:41:44

标签: opencl

我可以在当前由GPU设备上运行的内核写入的缓冲区上调用clEnqueueWriteBuffer()吗? 让我们说我不关心数据冲突,我知道我在做什么。 OpenCL实现是否允许这样做?

3 个答案:

答案 0 :(得分:1)

如果未使用“乱序执行”标志创建命令队列,则所有排队的命令将按顺序执行(在单个命令队列中)。在这种情况下,写缓冲区和内核不会同时执行。 在其他情况下,命令可以同时执行,并且行为将是未定义的。

答案 1 :(得分:1)

值得对您的实现进行测试,但是从我记得通过OpenCL我与AMD和NVIDIA的工作中,即使指定了无序标志,队列也会按顺序排列。

即使该命令不按顺序执行,设备进行的缓存也可能无法让您在内核中看到该更改。对于全局内存以及随后的其余内存,OpenCL规范声明:

  

全局内存。此内存区域允许对所有工作项进行读/写访问   工作组。工作项可以读取或写入内存对象的任何元素。   可以缓存对全局内存的读取和写入,具体取决于该功能   设备

因此,即使您能够写入设备内存,内核也不太可能读取这些更改。在你写的情况下,我会假设内核写入会在写缓冲区发生之前提交,但似乎OpenCL规范在这一点上是故意模糊的(也许是为了允许APU类型的数据访问)。

答案 2 :(得分:0)

如果真的想要尝试这个,那么你需要两个不同的命令队列;这就是你如何重叠DMA和计算。我建议反对它,因为内核和传输所写的任何区域都会产生不一致的结果。