众所周知,OpenCL的barrier()函数仅适用于单个工作组,并且没有直接同步工作组的可能性。如果可能的话,今天最好的全局同步方法是什么?使用原子操作、OpenCL 2.0功能等等?欢迎提供Github链接和示例!
谢谢!
谢谢!
在内核中进行全局同步是不可能的,这是因为工作组不能保证同时运行。如果您将内核分成多个部分,则可以在主机应用程序中实现某种形式的全局同步。这对于许多内核来说并不适用,尤其是如果您使用了大量本地内存或者在内核执行任何真正的工作之前需要有一些初始化代码。
将内核分成两部分--例如kernelA和kernelB。全局同步只需运行kernelA的NDRange,然后finish(),再运行kernelB的NDRange即可。全局数据将在两次调用之间保留在内存中。
再次说明,这并不是很美观,也不一定高性能,但如果您确实需要全局同步,这是唯一的方法。
虽然全局同步没有简洁的内核API调用,但如果计算设备支持OpenCL扩展cl_khr_global_int32_base_atomics,则可以使用原子操作来实现。
请参阅肖等人的论文,该论文评估了GPU上锁定和无锁方法进行全局同步。 http://synergy.cs.vt.edu/pubs/papers/xiao-ipdps2010-gpusync.pdf
这在另一篇stackoverflow帖子中提到,该帖子在此处找到:OpenCL and GPU global synchronization