衆所周知,OpenCL barrier()函數僅適用於單個工作組,並且沒有直接同步工作組的可能性。如果可能的話,今天全球同步的最佳途徑是什麼?使用原子,OpenCL 2.0功能等?OpenCL中的全局同步可能嗎?
Github鏈接,歡迎舉例!
Thankx!
衆所周知,OpenCL barrier()函數僅適用於單個工作組,並且沒有直接同步工作組的可能性。如果可能的話,今天全球同步的最佳途徑是什麼?使用原子,OpenCL 2.0功能等?OpenCL中的全局同步可能嗎?
Github鏈接,歡迎舉例!
Thankx!
內核中的全局同步是不可能的。這是因爲工作組不能同時運行。如果將內核分割成幾部分,則可以在主機應用程序中實現全局同步。這並不適用於許多內核,尤其是在內核執行任何實際工作之前,如果使用大量本地內存或有一點初始化代碼。
把你的內核分解成兩個文件 - 例如kernelA和kernelB。全局同步僅僅是爲kernelA運行NDRange,然後爲kernelB運行finish()和NDRange。全局數據將保留在兩次調用之間的內存中。
再次,不是很漂亮,不一定是高性能,但如果你真的必須有全球同步,這是得到它的唯一方法。
雖然全局同步沒有簡潔的內核API調用,但如果計算設備支持OpenCL擴展cl_khr_global_int32_base_atomics,則可以使用原子實現它。
請參閱Xiao等人的論文,該論文評估GPU上全局同步的鎖定和無鎖定方法。 http://synergy.cs.vt.edu/pubs/papers/xiao-ipdps2010-gpusync.pdf
這是在這裏找到另一計算器帖子中提到:OpenCL and GPU global synchronization
在一般情況下,這是不可能的。 –
如上所述:這是不可能的。您始終可以找到適合一個工作組的問題,並且至少具有本地同步功能。但是,當然,如果問題規模擴大,這將不再適用。它不會在不調整問題大小的情況下在不同的硬件上運行。 OpenCL 2.0提供內核入隊調用的功能。如果您需要基於主機的同步,這可能會減少一些開銷。但是對於所有問題來說,這並不是一個通用的解決方案 – Christian
您可以嘗試將程序分成更多內核並通過命令隊列同步它。當你不需要記住內核中的變量並且可以計算它們時,它尤其有效。如果需要存儲變量,那麼可以使用全局數組結構/向量來在內核之間傳輸變量。 –