我可以在当前由GPU设备上运行的内核写入的缓冲区上调用clEnqueueWriteBuffer()
吗?
让我们说我不关心数据冲突,我知道我在做什么。 OpenCL实现是否允许这样做?
答案 0 :(得分:1)
如果未使用“乱序执行”标志创建命令队列,则所有排队的命令将按顺序执行(在单个命令队列中)。在这种情况下,写缓冲区和内核不会同时执行。 在其他情况下,命令可以同时执行,并且行为将是未定义的。
答案 1 :(得分:1)
值得对您的实现进行测试,但是从我记得通过OpenCL我与AMD和NVIDIA的工作中,即使指定了无序标志,队列也会按顺序排列。
即使该命令不按顺序执行,设备进行的缓存也可能无法让您在内核中看到该更改。对于全局内存以及随后的其余内存,OpenCL规范声明:
全局内存。此内存区域允许对所有工作项进行读/写访问 工作组。工作项可以读取或写入内存对象的任何元素。 可以缓存对全局内存的读取和写入,具体取决于该功能 设备
因此,即使您能够写入设备内存,内核也不太可能读取这些更改。在你写的情况下,我会假设内核写入会在写缓冲区发生之前提交,但似乎OpenCL规范在这一点上是故意模糊的(也许是为了允许APU类型的数据访问)。
答案 2 :(得分:0)
如果真的想要尝试这个,那么你需要两个不同的命令队列;这就是你如何重叠DMA和计算。我建议反对它,因为内核和传输所写的任何区域都会产生不一致的结果。