在OpenCL中,我的理解是,您可以使用barrier()
函數來同步工作組中的線程。我確實(通常)瞭解他們的用途以及何時使用它們。我也意識到工作組中的所有線程都必須碰到障礙,否則就會出現問題。但是,每次我嘗試使用屏障到目前爲止,它似乎導致我的視頻驅動程序崩潰,或有關訪問某種類型的無效內存的錯誤消息。到目前爲止,我已經在2種不同的視頻卡上看到了這一點(1個ATI,1個NVIDIA)。OpenCL中的障礙
所以,我的問題是:
- 任何想法,爲什麼會發生這種情況?
barrier(CLK_LOCAL_MEM_FENCE)
和barrier(CLK_GLOBAL_MEM_FENCE)
有什麼區別?我閱讀了文檔,但我不清楚。- 是否有關於何時使用
barrier(CLK_LOCAL_MEM_FENCE)
與barrier(CLK_GLOBAL_MEM_FENCE)
的一般規則? - 是否曾經有過使用錯誤的參數類型調用
barrier()
可能導致錯誤的時間?
顯然CLK_GLOBAL_MEM_FENCE往往比CLK_LOCAL_MEM_FENCE慢。原因是塊內的所有線程都必須等待內存訪問才能完成。等待全局內存訪問完成比本地內存訪問要昂貴得多。當然,這並不總是正確的,它取決於訪問模式(Fermi現在擁有緩存,意味着全局訪問可以緩存在L1上,與共享內存具有類似的延遲),內核中全局/本地內存訪問的數量,入住率,銀行衝突,合併等。 – Zk1001