OpenCL中的全局同步可能吗?

时间:2015-05-13 08:52:11

标签: synchronization opencl global atomic workgroup

众所周知,OpenCL barrier()函数仅适用于单个工作组,并且没有直接同步工作组的可能性。如果有可能今天全球同步的最佳方法是什么?使用原子,OpenCL 2.0等功能?

Github链接,欢迎举例!

Thankx!

3 个答案:

答案 0 :(得分:4)

内核中的全局同步是不可能的。这是因为工作组不能同时运行。如果将内核分解为多个部分,则可以在宿主应用程序中实现某种全局同步。这不适用于许多内核,特别是如果你使用大量的本地内存或者在你的内核做任何实际工作之前有一些初始化代码。

将内核分成两个部分 - 例如kernelA和kernelB。全局同步只是运行NDRange for kernelA,然后是finish()和NDRange for kernelB。全局数据将在两次调用之间保留在内存中。

同样,不是很漂亮,也不一定是高性能,但如果你真的必须拥有全局同步,这是获得它的唯一方法。

答案 1 :(得分:3)

虽然全局同步没有简洁的内核API调用,但如果计算设备支持OpenCL扩展cl_khr_global_int32_base_atomics,则可以使用atomics实现。

请参阅Xiao等人的文章,评估GPU上全局同步的锁定和无锁方法。 http://synergy.cs.vt.edu/pubs/papers/xiao-ipdps2010-gpusync.pdf

在此处找到的另一个stackoverflow帖子中提到了这一点:OpenCL and GPU global synchronization

答案 2 :(得分:0)

如果将command_queue配置为按顺序处理,则可以通过对顺序内核进行排序来实现全局同步。 没有显式的barrier()调用,只有在kernel2之前排队的kernel1。如果将命令队列配置为按顺序处理,则kernel1将在kernel2启动之前完成所有工作。您将需要在两个内核之间共享一个缓冲区,以便在它们之间传递信息。

按顺序处理是默认设置。无需在内核之间调用finish()。

可以使用clCreateCommandQueueWithProperties配置命令队列,如果需要执行无序队列,则可以将属性设置为CL_QUEUE_OUT_OF_ORDER_EXEC_MODE。在这种情况下,将需要finish()来确保同步。