2014年2月20日 星期四

DRAM 的運作 (Computer Architecture 側)

算是 advanced computer architecture 的筆記
老師上課講得頗清楚,我應該是有聽懂
但是一陣子之後要用發現完全想不起來
所以找個時間重新閱讀並記錄下來,以免之後又忘了

**最基本的 DRAM**

首先先從 DRAM array 架構講起
不過我電子學&積電早就忘光了
所以只講理解這篇需要的部份,下面的說明因為懶的畫圖所以請自己看 wiki
http://en.wikipedia.org/wiki/Dynamic_random-access_memory
首先 DRAM array 簡單說就是有一定數量的 MOS 排成長方形矩陣的樣子
而每個 MOS 都有能力存一個 bit
例如 wiki 圖那樣 4x4 的 DRAM array 就有可能存這樣的資料
1001
0010
0100
1101
方便起見以矩陣的 notation 來稱呼,index from 1
例如第 3 個 row 的資料就是 0100

DRAM 一次讀寫的單位是 1-bit
分為幾個步驟,由以下這五個指令完成
ACTIVATE
READ
WRITE
PRECHARGE
REFRESH
下面解釋這五個指令

首先根據 wiki,我們大把 DRAM 畫成這樣

要讀寫資料的時候我們會先指定要讀哪個 row
把這個 row 存到 row buffer 裡面 (ACTIVATE 動作)
或者我覺得比較好的理解是「把 row 跟 row buffer 達到同步率400%

接著必須再指定想讀寫哪個 column
如果是 READ,這時 controller 就會把丟你要的從 buffer 給你 ( 動作)

WRITE 也差不多
ACTIVATE 之後指定一個 column 使用 WRITE 把 data 寫入 row buffer
反正他們同步了,所以總之資料會寫回 DRAM 中

例如我們想讀前例中右下的 1 就要 ACTIVATE 4 -> READ 4
如果之後馬上想讀左下的 1,不需要再 ACTIVATE 一次,只要再下 READ 4 就好了
或許會想問說為什麼不把 row buffer 全部都丟出來,應該是因為 IO 有數量限制吧

還有 PRECHARGE 是把 row buffer 解除同步,就是 ACTIVATE 的相反
以及 REFRESH 指令,基本上沒有功能
但因為 DRAM 的特性,所以一陣子沒 ACTIVATE 的 row 得作一次 REFRESH
(※不太確定是不是"一陣子沒 ACTIVATE")
要不然 DRAM 資料會消失

**電腦 (CPU) 看到的 DRAM**

一般對 CPU 來說電腦裡的 DRAM 看起來可分成這幾個階級(大到小)
channel
rank
bank
也就是一個系統有數個 channel,一個 channel 有數個 rank,一個 rank 有數個 bank
每一個層級之間可以平行運作,但是共享 bus

bank 可以看成上面的那種 DRAM,但是每個 cell 有很多 bits(一般是 64)


當 CPU 要一個 address 的時候,如果發現 cache 沒想要的資料 (cache miss)
CPU 就會向 DRAM 要資料,但是 DRAM 的 delay 太大了
所以 CPU 一次要的單位是 64-byte(好像也有 128-byte 的),並放到 cache

但是根據上面,一個 bank 只有 8-byte 的 IO
所以其實 CPU 要一次資料大概是這樣:
Access --> 等數百個cycle --> DRAM 連續 8-cycle 吐出資料

我們以下面這個常見的配置為例子(2012 年前後的數字 XD)
以一個 32-bits physical address (4GB in total) 為例
2 channel,我們從 0 開始算,也就是 channel 0, 1,以下亦然
2 rank per channel
4 bank per rank
1 bank is 32768 (2^15) row * 1024 (2^10) column * 8B = 256MB
假設 CPU 向 DRAM 要的 byte address:1011_1101_0111_1010_1101_0000_1100
首先因第 1 個 bit 是 1,所以 CPU 會找 channel 1
第 2 個 bit 是 0,所以會再去找 channel 1 下的 rank 0
接下來的 2 個 bit (11) 指定了 bank 3
接著的 15-bit 是 ACTIVATE 哪個 row
接著的 10-bit 是要讀寫哪個 column
因為要 8 個 clock 讀寫 DRAM,所以 10-bit 之中的最後 3 個是 counter
也就是說一次的讀寫是從 1 個 bank 的一個 row 讀出連續 8 個 column 共 64-byte
最後的 3-bit 因為一個 bank 一次可以讀寫 8-byte 根本不會用到

也就是
(1b channel)+(1b rank)+(2b rank)+(15b row)+(10b column)+(3-bit unused) = 32b
注意 10b column 的後三碼是 counter,所以也算 unused

可以注意 DRAM 一次讀寫只使用 row buffer 的 8/1024 = 0.8%
這一直是 DRAM 一個很大的問題

一般電腦中 dual channel 就是有兩個 channel 的意思
如此一來不同 channel 的 rank 之間不會互相搶 bus 的時間(大概吧)
不過我們看看剛剛 CPU 怎麼拿到資料的敘述
「Access --> 等數百個cycle --> DRAM 連續 8-cycle 吐出資料」
中間的等資料時間都是空檔,本來就不太會搶資料
所以一般實測上 dual channel 好像沒什麼顯著的差別
(You can google: dual channel speed difference)

**電腦 (CPU) 看不到的 DRAM**

那麼電腦裡面插的 DRAM 又是怎麼樣?
看電腦裡面那個「可以拔下來、可以在光華商場買到的那個」叫做 DIMM
 (image from wiki)
DIMM 上面會有一顆一顆黑黑的,那個每一個叫 chip(又稱 device),通常有 8 顆
一面是一個 rank
有的 DRAM 有兩面,就是兩個 rank(現在應該都有)

而因為製造技術上的種種原因
bank 實際上是分散在每個 chip
如上例中 4 個 bank
也就是每個 chip 上面都有 4 個 8-bit 的 bank (bank 0~3)
不同的 chip 上的同 ID 的 bank 是一起運作的總共有 8 個 chip
因此對 CPU 來說,一個 bank 是 64-bit
chipDIMM 這兩個單位對 CPU 是看不到的
(當然 DRAM 應該能額外告訴 OS 自己的型號,甚至製造商等等資訊
不過這邊「看不到」是指在 CPU 存取 DRAM 資料時)

沒有留言:

張貼留言