0

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

4

3 回答 3

1

值得为您的实现运行一个测试,但从我记得我通过 OpenCL 与 AMD 和 NVIDIA 合作的情况来看,即使指定了无序标志,队列也是有序的。

即使命令将乱序执行,设备完成的缓存也可能不允许您看到内核中的更改。对于全局内存,以及随后的其余内存,OpenCL 规范声明:

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

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

于 2012-10-04T20:45:04.630 回答
1

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

于 2012-10-04T05:01:48.817 回答
0

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

于 2012-10-15T00:06:30.277 回答