全局存儲帶寬(DRAM)
全局內存是動態隨機訪問的方式訪問內存.我們希望訪問DRAM的時候非常快,實際情況是DRAM中出來的數據非常非常慢,這就好比,理想狀態是泄洪,水傾巢而出,氣勢宏偉,實際取水卻像是用吸管在喝飲料,速度非常慢.
通常來看,我們會通過優化算法減少DRAM的訪問次數.
由上圖可以看出,用戶訪問需要的Address會被分成Row addr和Column address, 通過row decoder -> Core Array -> Sense Amps -> Column Latches ->到這里會非常寬,但是到-> Mux 會變得非常窄,然后通過off-chip data bus 給到處理器 .這就是DRAM bank的組織框架.
DRAM 中從core array中讀取一個cell是非常慢的,cell是指一個存儲單元.
• DDR: Core speed = 1⁄2 interface speed
• DDR2/GDDR3: Core speed = 1⁄4 interface
speed
• DDR3/GDDR4: Core speed = 1⁄8 interface
speed
• ... likely to be worse in the future
隨着時間的推移,市場上DDR的容量越來越大,但是訪問速度卻是越來越慢.
為什么core array中讀取非常慢,如下圖:
如下圖:
假設我們有1000個cells,在水平方向(因為是行嗎)是很長的,當訪問其中的一個cell,其實是訪問在訪問某一個bit,當為1時表示存在,0表示不存在.而這個bit是存儲在一個很小的電容里面,當想這個電容的晶體管里面充電,這個值是1,不充電則是0. 這個在縱向會連接到一個檢測放大器(sense amplifier),縱向線是一個非常緩慢的過程,記得這個即可.
DRAM Bursting
對於DDR{2,3} cores 核心的頻率是接口頻率的1/N. 為了提高訪問的速度,DRAM中提供更多的端口數目(lanes),類似收費站提供很多的收費口來減輕擁堵問題一樣.雖然單一時間慢,但是同時執行的多,所以總的情況會變快.
DDR2/GDDR3: buffer的寬度是借口寬度的4倍
為了降低訪問的次數,當處理器訪問一段數據時,實際上傳遞給處理器的是圍繞這一段數據的一個更大的數據.這個就是dram burst 設計.所以一個時鍾周期訪問的數據,其實是把這個之后的幾個時鍾周期也訪問的數據一起取出來,如果CPU不需要這些多余的數據,其實就可以說是浪費了,所以為了充分利用DRAM的這個特性.
上面提到的增加更多的接口數目說的是DRAM bank.
例子:
nVidia GTX280 GPU的極限帶寬是141.7GB/s
DDR3的接口速度是1.1GHz, core speed是276Mhz, 是接口速度的1/4.
對於一個64bit的接口,時鍾應該是2倍,因為在上升沿和下降沿都由數據傳輸.
64bit/8 = 8Bytes.
8*2 *1.1 = 17.6GB/s 這個遠遠達不到141.7.
141.7/17.6 = 8 memory channels . 這樣可以達到這個速度.
內存合並訪問
為了利用dram burst的特性,所以我們就有了合並內存訪問.通過合並內存訪問的次數提高訪問memory的效率.
GPU的存儲是row-major,是以行來組織數據的.
對於GPU來說,由於thread是異步執行的.下面這兩種訪問模式一種是合並訪問的,利用到DRAM,一種是非合並訪問:
B是合並訪問, A不是.B是以縱向的訪問方向,A是橫向的訪問方向.
所以總結一條規則是:
GPU縱向訪問內存可以實現合並訪問的效果.