CUDA存储器模型
存儲器模型有:
?Register
?Local
?shared
?Global
?Constant
?Texture
?Host memory
寄存器與Local memory
?對每個線程來說,寄存器都是線程私有的--這與CPU中一樣。如果寄存器被消耗完,數(shù)據(jù)將被存儲在本地存儲器(localmemory)。
?Localmemory對每個線程也是私有的,但是localmemory中的數(shù)據(jù)是被保存在顯存中,而不是片內(nèi)的寄存器或者緩存中,因此速度很慢。
?線程的輸入和中間輸出變量將被保存在寄存器或者本地存儲器中。
Shared memory
?用于線程間通信的共享存儲器。共享存儲器是可以被同一block中的所有thread訪問的可讀寫存儲器。
?訪問共享存儲器幾乎和訪問寄存器一樣快速,是實現(xiàn)線程間通信的延遲最小的方法。
?共享存儲器可以實現(xiàn)許多不同的功能,如用于保存共用的計數(shù)器(例如計算循環(huán)次數(shù))或者block的公用結(jié)果。
共享存儲器(Shared Memory)
?設置于SM內(nèi)部
?由一個線程塊內(nèi)部全部線程共享
–完全由軟件控制
–訪問一個地址只需要1個時鐘周期
constant memory和texture memory
?基于GPU圖形計算的專用單元發(fā)展而來的高速只讀緩存
?速度與命中率有關,不命中時將進行對顯存的訪問
?常量存儲器空間較小(只有64k),支持隨機訪問。從host端只寫,從device端只讀
?紋理存儲器尺寸則大得多,并且支持二維尋址(一個數(shù)據(jù)的“上下左右”的數(shù)據(jù)都能被讀入緩存),適合實現(xiàn)圖像處理算法。
全局存儲器
?使用的是普通的顯存,無緩存,可讀寫,速度慢
?整個網(wǎng)格中的任意線程都能讀寫全局存儲器的任意位置,并且既可以從CPU訪問,也可以從GPU訪問。
各種存儲器的延遲
?register: 1 周期
?shared memory: 1 周期(無bank conflict)——16 周期(發(fā)生16路bank conflict)
?texture memory: 1 周期(命中)——數(shù)百周期(不命中)
?constant memory: 1周期(命中)——數(shù)百周期(不命中)
?Global/ local memory: 數(shù)百周期
各存儲器大小
?每個SM中有64K或者32K的寄存器,寄存器的最小單位是32bit的register file
?每個SM中有16K~64K shared memory
?一共可以聲明64K的constant memory,但每個SM的cache序列只有8K
?可以聲明很大的texture memory,但是實際上的texture cache序列為每SM 6-8K
使用存儲器時可能出現(xiàn)的問題:
?致命問題:無法產(chǎn)生正確結(jié)果
?多個block訪問global同一塊,以及block內(nèi)thread間線程通信時的數(shù)據(jù)一致性問題
?Texture的工作模式設置錯誤
?效率問題:大大增加訪存延遲
?Shared bank conflict問題
?Global 合并訪問問題
?
總結(jié)
- 上一篇: CUDA之单thread单block多t
- 下一篇: Learn OpenGL (一):打开窗