CUDA裝置儲存 一)

2021-10-04 15:53:00 字數 1652 閱讀 8383

首先回顧一下nvidia gpu的硬體結構:

上圖是volta **100的gpu結構全圖,這我們只關注儲存裝置,可以看到所有的sm共享l2 cache和全域性儲存器(通常說的視訊記憶體),另外還有乙個常數儲存器也是所有sm共享的。

再看單個的sm的硬體結構:

很明顯,每個sm共享l1 data和共享記憶體。另外每個cuda core擁有自己的暫存器(register file)。

訪問速度越靠近cuda core,訪問速度越快,效能優化要做的就是訪問全域性記憶體少些,訪問共享記憶體或者暫存器多些。

kernel在被調起時,按照執行緒塊分配給sm,所以每個sm的共享記憶體實際上是給執行緒塊共享的,即乙個執行緒塊中的所有執行緒共享同乙個共享記憶體,可以基於此,執行緒塊中的執行緒可以使用共享記憶體交換資料,是效率比較高的一種做法。

暫存器和共享儲存器是片上儲存器,具有高頻寬,低延遲特點。駐留在這兩種儲存器中的變數可以以高度並行的方式高速訪問。暫存器被分配給每個執行緒,而每個執行緒只能訪問分配給自己的暫存器。kernel函式經常用暫存器儲存那些需要頻繁訪問的變數,這些變數是每個執行緒私有的。

共享儲存器分配給執行緒塊,同乙個塊中的所有執行緒都可以訪問共享儲存器中的變數,如果是同乙個變數,那麼需要做好執行緒同步。共享儲存器是一種用於執行緒協作的高效方式,方法是共享其中的輸入資料和其中的中間結果。在宣告cuda變數時,通過對cuda儲存器型別的選擇,可以指定對應變數的可見性和訪速度。

雖然cuda裝置中的共享儲存器和暫存器都是片上儲存器,相對全域性儲存器具有更高的頻寬和耕地的延遲,但是他們之間在功能和訪問成本上有很大的差異。當處理器訪問共享儲存器時,儲存器需要執行記憶體載入操作,與訪問全域性儲存器一樣,由於共享儲存器在晶元上,訪問共享儲存器比訪問全域性儲存器有更低的延遲和更高的頻寬。但是又由於需要執行記憶體載入操作,共享儲存器比暫存器有較長的延遲和較低的頻寬。

程式中的變數宣告成不同型別的儲存器cuda語法如下:

總結一下,對於一塊gpu裝置,具有以下儲存裝置:

儲存每個執行緒的臨時區域性變數,由編譯器管理

裝置不同,容量不同,並且容量有限

程式可控制,程式中可以直接指定資料在共享儲存器中

同乙個執行緒塊中的所有執行緒可以同時訪問

低延遲,高頻寬:~2.5 tb/s

容量很小

常量儲存

容量比共享儲存器大,可以達到mb單位

所有執行緒共享

硬體控制,訪問全域性儲存器資料時,需要先將資料載入到l2快取

容量較大,可以達到gb單位

所有執行緒共享,主機cpu,同系統下的另外gpu均可訪問

高延遲(400-800 時鐘週期)

低頻寬 250gb/s

cuda學習筆記(一)儲存

1.乙個gpu 上有很多的sm stream multiprocessor 每個 sm中包括了8個 sp stream processor 標量流處理器,商業宣傳中所說的數百個 核 大多指的是 sp的數量。隸屬於同乙個sm的 sp共用同一套取指與發射單元。cuda 中的kernel 是以block ...

CUDA 獲取指定裝置

請求計算能力2.0裝置 費公尺架構 struct cudadeviceprop device prop int chosen device memeset device prop,0,sizeof cudadeviceprop device prop.major 2 device prop.mino...

CUDA學習筆記之 CUDA儲存器模型

gpu片內 register,shared memory 板載視訊記憶體 local memory,constant memory,texture memory,texture memory,global memory host 記憶體 host memory,pinned memory.cuda儲...