2015-05-13 94 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。全局數據將保留在兩次調用之間的內存中。

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