關於CUDA性能優化的補充

之前寫過一篇CUDA性能優化的博客https://blog.csdn.net/weixin_44444450/article/details/104535306

上面那篇博客是看完CUDA手冊裏面關於性能優化的內容後總結的,但是有些地方還是不能很完美的理解。所以現在寫一篇博客來補充一下。

1.關於全局內存的合併訪問

要想合併訪問全局內存,就必須對地址進行一個對齊。

設備能通過單個指令將32位,64位、128位從全局內存讀取到寄存器中。也就是我們每次要讀取32、64、128整數倍的字節數大小的數據,這些數據會被加載到L2、L1緩存區,所以我們的數據字節大小得跟32的倍數對齊。

同時,還有一個要求是首地址必須爲32的整數倍,並且要連續訪問,也就是加載了多大的內存區域到L2、L1都要儘量用完。

2.線程數和塊的分配

塊內的線程數一般爲128、256、512比較合適,不太能多也不能太少。

太多有可能會導致一個SM上只分配了單個活躍塊塊,而沒有多餘的活躍塊,不能很好的隱藏SM上的開銷。

太少會導致塊內的線程開銷(比如訪問數據),一些高延遲的操作不能被很好的隱藏。

網格內的塊數分配要求每個SM上至少有兩個以上的活躍塊,這樣可以隱藏SM上的開銷(比如某個塊正在進行數據的高延遲訪問,這個時候運算核心沒有被用到,其它已經準備好的塊就可以佔用這部分資源)

同時要分配儘可能多的塊,使得所有的SM都可以工作起來。

3.關於鎖頁內存

我們在宿主端通過 cudaMallocHost申請 頁鎖定內存,這個內存是存在於CPU上的,但它比CPU的普通內存的傳輸速率要快,它的大小可能沒有運行內存有4G 8G 16G 那麼大,但是應該也是有幾百兆的。

4.不同內存的帶寬對比

寄存器應該快全局內存兩個數量級,共享內存應該快全局內存一個數量級。

最後

下面是自己總結的GPU架構的硬件圖,因爲軟件部分應該都比較熟悉了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章