【发布时间】:2015-07-24 10:56:27
【问题描述】:
众所周知,OpenCL barrier() 函数仅适用于单个工作组,并且没有直接同步工作组的可能性。如果可能的话,今天全球同步的最佳方法是什么?使用原子、OpenCL 2.0 特性等?
Github 链接,欢迎举例!
谢谢!
【问题讨论】:
-
一般情况下是不可能的。
-
如上所述:这是不可能的。您总能找到适合一个工作组的问题,并且至少有本地同步。但是,当然,如果问题规模扩大,这将不再有效。如果不调整问题大小,它就不会在不同的硬件上运行。 OpenCL 2.0 提供了内核排队调用的特性。如果您需要基于主机的同步,这可能会减少一些开销。但这并不是解决所有问题的通用方法。
-
您可以尝试将您的程序分成更多的内核,并通过命令队列进行同步。当您不需要记住内核中的变量并且可以计算它们时,它尤其有效。如果需要存储变量,可以使用结构体/向量的全局数组在内核之间传输变量。
-
另一件事是没有示例或至少描述算法,您正在尝试并行化,因此很难判断该做什么。我建议再次查看该数据模式,因为如此巨大的同步是可疑的。您的问题可能有其他解决方案,或者最好使用 OpenCL 以外的其他解决方案。例如 SSE、多线程、OpenMP、...
-
谢谢大家的好点。
标签: synchronization opencl global atomic workgroup