[英]Is global synchronization in OpenCL possible?
眾所周知,OpenCL barrier() 函數僅適用於單個工作組,並且無法直接同步工作組。 如果可能的話,當今全球同步的最佳方法是什么? 使用原子、OpenCL 2.0 特性等?
Github 鏈接,歡迎舉例!
謝謝!
內核中的全局同步是不可能的。 這是因為工作組不能保證同時運行。 如果將內核分解為多個部分,則可以在主機應用程序中實現某種全局同步。 這不適用於許多內核,特別是如果您在內核執行任何實際工作之前使用大量本地內存或有一些初始化代碼。
將內核分成兩個部分——例如 kernelA 和 kernelB。 全局同步只是運行 kernelA 的 NDRange,然后finish() 和 kernelB 的 NDRange 的問題。 全局數據將在兩次調用之間保留在內存中。
同樣,不漂亮也不一定高性能,但如果你真的必須有全局同步,這是獲得它的唯一方法。
雖然全局同步沒有簡潔的內核 API 調用,但如果計算設備支持 OpenCL 擴展 cl_khr_global_int32_base_atomics,則可以使用原子來實現。
請參閱 Xiao 等人的論文,該論文評估了 GPU 上全局同步的鎖和無鎖方法。 http://synergy.cs.vt.edu/pubs/papers/xiao-ipdps2010-gpusync.pdf
這是在此處找到的另一篇 stackoverflow 帖子中提到的: OpenCL and GPU global synchronization
如果將 command_queue 配置為按順序處理,則可以通過順序內核的排序來實現全局同步。 沒有顯式的 barrier() 調用,只有在 kernel2 之前排隊的 kernel1。 如果將命令隊列配置為按順序處理,則 kernel1 將在 kernel2 啟動之前完成所有工作。 您需要在兩個內核之間共享一個緩沖區以在它們之間傳遞信息。
按順序處理是默認設置。 無需在內核之間調用 finish() 。
命令隊列可以使用 clCreateCommandQueueWithProperties 進行配置,如果需要亂序隊列執行,可以將屬性設置為 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE。 在這種情況下,需要完成()以確保同步。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.