在Compute Capability 2.0(Fermi)發佈之後,我想知道是否還有任何用於共享內存的用例。也就是說,什麼時候使用共享內存比讓L1在後臺執行它的魔法更好?CUDA:何時使用共享內存以及何時依賴L1緩存?
簡單的共享內存讓設計用於CC < 2.0的算法無需修改即可高效運行?
要通過共享內存進行協作,塊中的線程將寫入共享內存並與__syncthreads()
同步。爲什麼不直接寫入全局內存(通過L1),並與__threadfence_block()
同步?後一個選項應該更容易實現,因爲它不必涉及兩個不同的值的位置,並且它應該更快,因爲沒有從全局到共享內存的明確複製。由於數據被緩存在L1中,因此線程無需等待數據實際完成到全局內存。
使用共享內存時,可以保證在整個塊的持續時間內保留的值保留在那裏。這與L1中的價值觀是相反的,如果它們使用不夠頻繁,它們會被逐出。有沒有什麼情況下最好的辦法是將共享內存中很少使用的數據緩存起來,而不是讓L1根據算法實際使用的使用模式來管理它們?
謝謝,那確實回答了我的問題。我曾將緩存描繪爲能夠跟蹤哪些元素被最多使用,並且更願意緩存這些元素。我已經閱讀了關於n-way關聯緩存的內容,它看起來像主要的問題是它們可能會拋出一個經常使用的值,因爲另一個緩存線適合該插槽。 –
我認爲這意味着編寫CUDA程序的好策略通常可能是首先編寫算法以僅使用全局內存,然後查看L1是否工作良好,從而隱藏內存延遲。然後考慮手動優化與共享內存,如果算法結果是內存限制。 –