全局內存通過緩存實現加載和存儲過程。其中,L1為一級緩存,每個SM都有自己的L1;L2為二級緩存,L2則被所有SM共有。
數據從全局內存到SM的傳輸過程中,會去L1和L2中查詢是否有緩存。對全局內存的訪問將經過L1;如果未命中,則會接著從L2中查找;如果再次未命中,則會從全局內存DRAM中讀取。
CUDA允許通過編譯選項控制是否啟用L1。當L1被禁用時,對全局內存的加載請求將直接進入L2;如果L2未命中,將由DRAM完成請求。
核函數從全局內存DRAM中讀取數據有兩種粒度,使用L1時,每次按照128字節進行緩存;不使用L1時,每次按照32字節進行緩存。
# 禁用一級緩存
-Xptxas -dlcm=cg
# 啟用一級緩存
-Xptxas -dlcm=ca
全局內存的訪問模式,有合并和非合并之分。
合并訪問指的是一個線程束對全局內存的一次訪問請求(讀或者寫)導致最少數量的數據傳輸;否則稱訪問是非合并的。
合并度:線程束請求的字節數 / 由該次請求導致的所有數據傳輸的字節數。
以僅使用L2緩存為例,一次數據傳輸或者一次內存事務是將32字節的數據從全局內存(cache sector)傳輸到SM。考慮一個線程束(32個線程)訪問單精度浮點數(4字節)的全局變量,該線程束請求128字節的數據。
https://zhuanlan.zhihu.com/p/641639133
Memory Workload Analysis
內存圖表以圖形化、邏輯化的方式,展現 GPU 上和 GPU 外內存子單元的性能數據。性能數據包括傳輸大小、命中率、指令或請求數量等。
邏輯單元顯示為綠色(活動)或者灰色(非活動),包括在GPU的SM上執行的CUDA Kernel、全局內存、本地內存、紋理內存、表面內存、共享內存和加載全局存儲共享(指令直接從全局加載到共享內存中,無需中間寄存器文件訪問)。
物理單元顯示為藍色(活動)或者灰色(非活動),包括
(1)L1/TEX Cache:L1緩存和紋理緩存
(2)Shared Memory:共享內存
(3)L2 Cache:L2緩存
(4)L2 Compression:L2 Cache的內存壓縮單元
(5)System Memory:CPU內存
(6)Device Memory:GPU顯存
(7)Peer Memory:其他CUDA設備的GPU顯存
內核與其他邏輯單元之間的鏈接表示針對相應單元執行的指令 (?Inst?) 數量。例如,?內核與全局之間的鏈接表示從全局內存空間加載或存儲的指令。
邏輯單元與藍色物理單元之間的鏈接表示其各自指令產生的請求 (?Req?) 數量。例如,從?L1/TEX Cache?到?Global 的鏈接顯示了全局加載指令產生的請求數量。
每條鏈路的顏色代表相應通信路徑的峰值利用率百分比。圖表右側的顏色圖例顯示了從未使用 (0%) 到峰值性能運行 (100%) 所應用的顏色漸變。如果鏈路處于非活動狀態,則顯示為灰色。圖例左側的三角形標記對應于圖表中的鏈路。與單獨的顏色漸變相比,這些標記可以更準確地估算已實現的峰值性能值。
(1)Instructions
對于每種訪問類型,每個 Warp 中實際執行的匯編 (SASS)?指令總數。不包括預測指令。
(2)Requests
每種指令類型生成的所有 L1?請求總數。在 SM 7.0 (Volta) 及更新的架構上,每條指令只會為 LSU 流量(全局、本地等)生成一個請求。對于紋理 (TEX) 流量,可能會生成多個請求。