2015-05-13 69 views
1

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

Github链接,欢迎举例!

Thankx!

+2

在一般情况下,这是不可能的。 –

+0

如上所述:这是不可能的。您始终可以找到适合一个工作组的问题,并且至少具有本地同步功能。但是,当然,如果问题规模扩大,这将不再适用。它不会在不调整问题大小的情况下在不同的硬件上运行。 OpenCL 2.0提供内核入队调用的功能。如果您需要基于主机的同步,这可能会减少一些开销。但是对于所有问题来说,这并不是一个通用的解决方案 – Christian

+0

您可以尝试将程序分成更多内核并通过命令队列同步它。当你不需要记住内核中的变量并且可以计算它们时,它尤其有效。如果需要存储变量,那么可以使用全局数组结构/向量来在内核之间传输变量。 –

回答

3

内核中的全局同步是不可能的。这是因为工作组不能同时运行。如果将内核分割成几部分,则可以在主机应用程序中实现全局同步。这并不适用于许多内核,尤其是在内核执行任何实际工作之前,如果使用大量本地内存或有一点初始化代码。

把你的内核分解成两个文件 - 例如kernelA和kernelB。全局同步仅仅是为kernelA运行NDRange,然后为kernelB运行finish()和NDRange。全局数据将保留在两次调用之间的内存中。

再次,不是很漂亮,不一定是高性能,但如果你真的必须有全球同步,这是得到它的唯一方法。