之前寫過一篇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架構的硬件圖,因爲軟件部分應該都比較熟悉了。