# Linux 核心專題: 〈每位程式開發者都該有的記憶體知識〉校訂
> 執行人: lorian0738
> [GitHub](https://github.com/lorian0738/cpumemory-zhtw)
> [專題解說錄影](https://youtu.be/wacsGy9ZxsQ)
## 任務簡述
〈[每位程式開發者都該有的記憶體知識](https://sysprog21.github.io/cpumemory-zhtw/)〉翻自 Ulrich Drepper 於 2007 年撰寫的論文〈[What Every Programmer Should Know About Memory](https://www.akkadia.org/drepper/cpumemory.pdf)〉(版次: 1.0),儘管目前已涵蓋第一到第七章,然而仍有大量的改進要進行,如下:
* 原文寫於 2007 年,文中提及微處理器已不再流行,會造成閱讀障礙
* 第 6 章的翻譯不完整
* 由於現代處理器架構的變遷,部分實驗已與 2007 年不同,需要重現實驗並解讀
* 缺少第 8 章的翻譯
* 對照原文和譯文,比對箇中落差並校訂
## TODO: 重現第 6 章的實驗並校訂相關描述
研讀以下素材,在自己的電腦重現第 6 章的實驗並校訂相關描述。
* [現代處理器設計: Cache 原理和實際影響](https://hackmd.io/@sysprog/HkW3Dr1Rb)
* [CPU Cache 原理探討](https://hackmd.io/@drwQtdGASN2n-vt_4poKnw/H1U6NgK3Z)
* [prefetch 背景知識簡略整理](https://hackmd.io/@Rance/Hy3KRm1CG)
* [Random and sequential](https://hackmd.io/@dange/B1J3omXfV)
* [2022 年開發紀錄](https://hackmd.io/@6649/linux2022-cpumemory)
過程中應在 [GitHub](https://github.com/sysprog21/cpumemory-zhtw) 提交修訂的 pull request 並與授課教師協作。
> 實驗內容更新在本頁
## TODO: 重現第 7 章的實驗並校訂相關描述
在自己的電腦重現第 7 章的實驗並校訂相關描述。
過程中應在 [GitHub](https://github.com/sysprog21/cpumemory-zhtw) 提交修訂的 pull request 並與授課教師協作。
> 實驗內容更新在本頁
## TODO: 校訂第 1 到第 5 章的譯文
對照原文和譯文,比對第 1 到第 5 章落差並校訂。過程中應在 [GitHub](https://github.com/sysprog21/cpumemory-zhtw) 提交修訂的 pull request 並與授課教師協作。
### 第二章
1. 2.2.3. 再充電註解:
譯文:不管 [3] 與其它文獻怎麼說,列都是這項操作的對象(見 [18])。
原文:Rows are the granularity this happens with despite what [3] and other literature says (see [18])
```
修正:
granularity:顆粒度 -> 系統被劃分為碎片後那些碎片的大小
此句話要表達,列是重新充電的 "單位"
```
2. 2.2.4. 記憶體類型 SDR SDRAM
譯文:由於大量的陣列單元,成本貴得嚇人。
原文: With a huge number of array cells this is prohibitively expensive
```
修正:
由於使用大量的陣列單元,代價高得嚇人。
```
4. 2.2.4. 記憶體類型 DDR3 之一:
譯文:這導致只在頻率高於 DDR2 所能達到的情況,並且 ── 儘管如此 ── 一般在頻寬比延遲時間更為重要的時候,DDR3 才有其用處。
原文: This would cause DDR3 to be useful only at frequencies which are higher than those which can be achieved with DDR2, and, even then, mostly when bandwidth is more important than latency.
```
修正:
這會導致 DDR3 只有在頻率高於 DDR2 能達到的頻率時才有用,且更甚的是通常只有在頻寬比延遲更加重要的時候才有用。
```
3. 2.2.4. 記憶體類型 DDR3 之二:
譯文:無論如何,由於更快的匯流排,達到更高速度的可能性將會超過增加的等待時間。
原文:In any case, the possibility of achieving higher speeds because of faster buses will outweigh the increased latency.
```
修正:
無論如何,因更快的匯流排而達到更高速度的可能性將會比增加的延遲"更重要"
```
4. 2.2.4. 記憶體類型序列匯流排缺點:
譯文:第二個問題是,晶片驅動序列匯流排需要大量的能量,因為頻率非常高、以及驅動匯流排的需求。
原文:A second problem is that the chip driving the serial bus requires significant amounts of energy because of the very high frequency and the need to drive a bus.
```
修正:
第二個問題是,由於非常高的頻率和驅動匯流排的需求,晶片驅動序列匯流排需要大量的能量
```
> [Pull Request for 1345](https://github.com/sysprog21/cpumemory-zhtw/pull/6)
> 其中第三項沒有被採用
> [Pull Request for 2](https://github.com/sysprog21/cpumemory-zhtw/pull/7)
## TODO: 著手第 8 章的翻譯 (optional)
---
## 閱讀小記
:::info
:information_source: 書寫規範: 以 ==:question:== 標注提問和待確認的議題。
:::
### 1. 引言
* 解決主記憶體的瓶頸已被證實更加困難,而且幾乎所有的解決方法都必須改變硬體
* RAM 的硬體設計(速度以及平行度〔parallelism〕)。
* **記憶體控制器(controller)的設計**。
* **CPU 快取**。
* 裝置的直接記憶體存取(Direct Memory Access,DMA)。
* 止於商用硬體
* 作業系統的細節與解法時 -> Linux
* 「通常」
* 給軟體開發者
### 2. 現代商用硬體
* 水平發展 > 垂直發展
* 使用許多較小的、連結在一起的商用電腦
* Red Hat 未來產品 ( 2007 為基準 )
* 資料中心的「標準建構元件(building block)」
* 至多四個插槽(socket)的電腦
* 每個插槽插著一顆四核 CPU
* 採用超執行緒(hyper-threading,簡稱 HT)技術
* 將會有至多 64 個虛擬處理器(virtual processor)
* 意味著 4 個插槽、HT (即 2 個硬體執行緒),和每個 CPU 要有 8 核
* > HT:超執行緒(Hyper-Threading),在 CPU 內僅複製必要資源,讓兩個執行緒可以在一單位時間內同時執行,就好像真的有實體雙核心,能進行雙執行緒運作 [參考網站](https://jenifers001d.github.io/2020/08/04/%E9%9B%BB%E8%85%A6%E7%9F%A5%E8%AD%98/what-is-core-and-thread/)
* 2014 年的 POWER8 (IBM) 可達
* 每個 CPU 可有 6 或 12 核
> :question: 現況如何?
> 2021 年發布 [Power10](https://en.wikipedia.org/wiki/Power10)
> 核心:15 SMT8 cores、30 SMT4 cores
> 其中 SMT = Simultaneous multithreading 同步多執行緒
* 個人電腦、小型伺服器 -標準化-> 晶片組(chipset)
* ![](https://hackmd.io/_uploads/BJt1D5nHh.png)
* CPU 透過一條共用的匯流排(bus)連接到北橋
* bus:前端匯流排(Front Side Bus,FSB)
* 北橋(Northbridge)
* 包含記憶體控制器(memory controller)
* 決定用在電腦中的 RAM 晶片類型
* DRAM
* Rambus
* SDRAM
* RAM 只有單埠 (商用中)
* 仰賴極限速度的專門硬體(e.g., 路由器)有多埠
* 南橋(Southbridge)
* I/O 橋(藉由各種不同的匯流排與各個裝置溝通)
* PCI
* PCI Express
* SATA
* USB
* PATA
* IEEE 1394
* 序列埠(serial port)
* 平行埠(parallel port)
> :question:
> 處理器設計趨勢:將更多功能集成到更少的組件上,降低總體主板成本並提高性能
>
> 北橋消失:
> Intel Nehalem 系列 CPU 將北橋的記憶體控制器整合進處理器,其餘北橋功能和南橋晶片整合
> AMD 處理器整合北橋
>
> 現代的處理器和主機板設計已經將許多北橋和南橋的功能整合到單一晶片中 -> 單晶片系統(System on a Chip, SoC):將電腦或其他電子系統整合到單一晶片的積體電路
>
> Intel超低壓CPU、Intel Xeon D等Intel CPU已經內建南橋,AMD Ryzen、EPYC也內建了部分南橋功能
>
* 瓶頸
1. 裝置對 RAM 的存取
* DMA 允許裝置在沒有 CPU 介入下直接儲存並接收 RAM 中的資料
* 藉由北橋的幫助
* 現今所有依附於任何匯流排上的高效能裝置都能使用 DMA
* 引起北橋頻寬的爭奪
* DMA 請求與來自 CPU 的 RAM 存取相互競爭
2. 北橋到 RAM 的匯流排
* 兩條分離的匯流排(或稱通道〔channel〕)
* 北橋交錯地使用通道進行記憶體存取
* 更加近代的記憶體技術(FB-DRAM)-> 更多通道
* 有限的可用頻寬 -> 延遲最小化的方式排程記憶體存取
* 處理器比起記憶體快許多 -> 須等待存取記憶體
* 同時存取記憶體 -> 等待時間長
* 提升記憶體頻寬的方法
* 使用多個外部記憶體控制器
* ![](https://hackmd.io/_uploads/BJCTSh2Bn.png)
* 北橋不含記憶體控制器 -> 連接至外部的
* 多於一個記憶體匯流排 -> 提升頻寬
* 支援多個記憶體
* 並行(concurrent)記憶體存取模式藉由同時存取不同的記憶庫(memory bank)來減少延遲
* 限制:北橋的內部頻寬
* 將記憶體控制器整合到 CPU,並將記憶體附加到每顆 CPU 上
* ![name=Figure 2.3](https://hackmd.io/_uploads/HJr6e_lL2.png)
* 基於 AMD 的 Opteron 處理器的 SMP 系統
* Intel 將從 Nehalem 處理器開始支援通用系統介面(Common System Interface,CSI)
* 缺點:
* 系統上的所有記憶體要能被所有的處理器存取 -> 不均勻 NUMA (非均勻記憶體架構〔Non-Uniform Memory Architecture〕)
* 2.1 2.2 以邏輯閘(gate)層級討論硬體細節
#### 2.1. RAM 的種類
* SRAM(Static RAM)靜態:快速
* DRAM(Dynamic RAM)動態:成本低
##### 2.1.1. SRAM
* ![](https://hackmd.io/_uploads/SyWbHKlLn.png)
* SRAM 記憶單元(cell)
* 6 個電晶體 (transistor)
* 電晶體 $M$
* 兩個交叉耦合(cross-coupled)的反相器(inverter)
* 兩個穩定狀態:表示 0 與 1
* $V_{dd}$ 維持通電 -> 穩定
* 存取記憶單元的狀態:
* 提高字組存取線路(word access line)$WL$ 的電位
* 複寫記憶單元的狀態:
* 先將 $BL$、$\overline{BL}$
* 再提高 $WL$ 的電位
* 外部的驅動者(driver)強於四個電晶體 -> 可覆寫舊狀態
* 重點:
* 一個記憶單元六個電晶體
* 四個變體也有但有缺點
* 維持記憶單元的狀態需要持續供電
* 提高 $WL$ 電位時幾乎能立即取得記憶單元的狀態
* 訊號是直角(在兩個二元狀態間迅速地轉變)
* 如同其它電晶體控制
* 記憶單元的狀態是穩定的,不需要再充電週期(refresh cycle)
##### 2.1.2. 動態 RAM
* ![](https://hackmd.io/_uploads/HkHBxRxL3.png)
* 一個電晶體 $M$:控制狀態的存取
* 一個電容(capacitor)$C$:保存狀態
* 讀取記憶單元的狀態:
* 提高存取線路 $AL$ 的電位
* 看電容中的電量決定電流是否流經資料線路(data line) $DL$
* 對電容放電,無法一直重複,需充電
* 寫到記憶單元:
* 適當地設置資料線路 $DL$
* 提高 $AL$ 的電位一段足以讓電容充電或放電的時間
* 問題:
* 為了容納大量的記憶單元 -> 電容的電量必須很低
* 漏電(leakage)
* 儘管電容的電阻很高,耗電時間短
* 重新充電的期間內是無法存取記憶體
* 重新充電 = 丟棄結果的讀取操作
* 從記憶單元讀取的資訊無法直接使用
* 資料線路必須被連接到感測放大器(sense amplifier)
* (感測放大器)能夠根據仍需計作 1 的電量範圍來分辨(已被)儲存為 0 或 1 (的值)
* 從記憶單元進行讀取會消耗電容的電量
* 每次讀取都要充電
* 透過將感測放大器的輸出餵回到電容裡頭來自動達成
* -> 讀取記憶體需要額外電力時間
* 對電容充放電並不是立即完成的
* 感測放大器接收到的**訊號不是直角**
* 必須使用一個謹慎的估計得知何時可以使用記憶單元的輸出
* ![](https://hackmd.io/_uploads/ryKs4DXLh.png)
* ![](https://hackmd.io/_uploads/r1_2NvXLh.png)
* **不像靜態 RAM** 能夠在字組存取線路的電位提高時**立即**取得輸出結果
* 優點:
* 大小 -> 晶片面積比 SRAM 小好幾倍
* 結構簡單 -> 記憶單元塞得緊密
* 成本低
##### 2.1.3. DRAM 存取
* 一支程式 (program) 選擇記憶體位置
* 使用虛擬位址(virtual address)
* 處理器轉譯(translate) -> 實體位址(physical address)
* 記憶體控制器選擇對應於這個位址的 RAM 晶片
* 為了選擇 RAM 晶片中的個別記憶單元
* 實體位址的一部分會以數條位址線(address line)的形式被傳遞進去
* 用較小的一組位址線,編碼成二進位數值傳遞
* 由記憶體控制器個別定址(address)記憶體位置不切實際的 -> 4GB 的 RAM 會需要 $2^{32}$ 條位址線
* 須先被解多工(demultiplex)
* N 條位址線的解多工器(demultiplexer)將會有 $2^N$ 條輸出線(output line)
* 輸出線可被用來選擇記憶單元
* 缺點:記憶單元的數量增加不適合
* 1Gbit 容量的晶片將會需要 30 條位址線以及 $2^{30}$ 選擇線(select line)
* 解多工器的大小會隨著輸入線(input line)的數量以指數成長
* 大量的晶片空間
* 解多工器的(尺寸與時間)複雜度
* 同時在位址線上傳輸 30 個脈衝(impulse)很難
* 高階角度示意的 DRAM 晶片
* ![](https://hackmd.io/_uploads/Hkjr2KVU3.png)
* 被組織在列(row)與行(column)中
* 各為一半大小的一個解多工器與一個多工器
* 讀取時:
* 選擇一整列記憶單元的位址線:列位址選擇解多工器 ($\overline{RAS}$)
* 讀取記憶單元內容:行位址選擇多工器 ($\overline{CAS}$)
* 基於位址線 $a_2$ $a_3$ 可以提供給 DRAM 晶片的資料針腳(pin)
* 寫入時:
* 新的記憶單元的值會被置於資料匯流排中
* 當記憶單元藉由$\overline{RAS}$ 、$\overline{CAS}$ 選取時儲存到資料單元中
* 困難:
* 發出訊號之後,在資料能夠由資料匯流排讀取之前有多少**延遲**(因為電容無法立即充放電)
* 晶片的針腳是個寶貴的資源
* DRAM 晶片長期以來必須自行多工位址(位址會被轉變成兩個部分 -> 兩條外部的位址線選擇行列)
##### 2.1.4. 結論
* 2.1 重點:
* 為何不是所有記憶體都為 SRAM
* 記憶單元需要被個別選取使用
* 位址線的數量直接反映記憶體控制器、主機板(motherboard)、DRAM 模組、與 DRAM 晶片的成本
* 在讀取或寫入操作的結果有效之前得花上一段時間
* SRAM 通常是直接定址的
* SRAM 目前被用於 CPU 快取並內建於晶片上(on-die),其連線較少、並且完全在 CPU 設計者的控制中
#### 2.2. DRAM 存取技術細節
* 聚焦當前的技術:
* 同步 DRAM:Synchronous DRAM,SDRAM
* 與一種時間源(time source)有關
* 頻率決定前端匯流排(FSB)── DRAM 晶片使用的記憶體控制器介面 ── 的速度
* 匯流排都是二或四倍頻(double- or quad-pumped)
* 資料在每個週期傳輸二或四次
* 四倍頻 200MHz -> 800MHz 匯流排
* 傳輸率:
* 資料傳輸以 64 位元 (即 8 位元組) 組成
* 以四倍頻 200MHz 匯流排來說,6.4GB/s
* 雙倍資料傳輸速率 DRAM:Double Data Rate DRAM,DDR
* SDRAM 後繼者
* 也是一種 SDRAM
* > :question:但為何論文是寫 DDR DRAM 不直接寫 SDRAM
> :question: 需釐清是否過時,或是現況如何(速度、頻率)
* 現今與 RAM 模組溝通的協定中有許多的閒置期(downtime)
* -> 瞭解、並減小閒置期以達最佳效能
##### 2.2.1. 讀取協定
![](https://hackmd.io/_uploads/B1JKNxLUn.png)
* 訊號都會在時鐘(CLK)的上升邊沿(rising edge)被讀取
* 訊號並不是完全的方波也無所謂
* 讀取週期(不完整):
* 開始:記憶體控制器在位址匯流排提供列位址、並降低 $\overline{RAS}$ 訊號的電位
* 設置列位址會使得 RAM 晶片鎖上(latch)指定的列
* 經過 ${t_{RCD}}$ 個時脈週期:發出 $\overline{CAS}$ 訊號
* 行位址藉由位址匯流排提供
* 降低 $\overline{CAS}$ 線路的電位來傳輸
* 定址完成
* RAM 晶片需要一點時間準備
* $\overline{CAS}$ 等待時間
* 取決於記憶體控制器、主機板、以及 DRAM 模組的品質
* 也可是半週期:(if 2.5)在藍色第一個下降邊沿時取得
* DRAM 模組允許記憶體控制器指定要傳輸多少資料
* 只傳一組字組資料很浪費
* 通常選擇在 2、4、或 8 字組之間
* 可在不提供新的 $\overline{RAS}$ / $\overline{CAS}$ 序列下填滿快取中的整行
* 可在不重設列的選取的情況下發出新的 $\overline{CAS}$
* 記憶體控制器必須決定是否讓列保持「開啟(open)」
* 發出新的 $\overline{CAS}$ 僅受 RAM 模組的命令速率
* 此例每個週期吐出一個字組(第一世代)
* DDR 每個週期傳輸兩個字組
* DDR2 更快、更便宜、更可靠、更省電
##### 2.2.2. SDRAM 預充電與有效化
* 在能夠發送新的 $\overline{RAS}$ 訊號之前
* 無效化(deactivate)目前鎖上的列
* 對新的列預充電(precharge)
![](https://hackmd.io/_uploads/Sy92l-IU3.png)
* 從 $\overline{CAS}$ 訊號開始、到另一列的 $\overline{CAS}$ 訊號為止的活動
* 經過 $CL$ -> 取得以第一個 $\overline{CAS}$ 訊號請求的資料
* 無法立即發出預充電命令,等待與**傳輸資料**一樣長的時間
* 這裡和 $CL$ 一樣是剛好
* 預充電無專用的線路
* e.g., 同時降低允寫($\overline{WE}$)與 $\overline{RAS}$ 的電位
* 發出預充電命令 -> 花費 $t_{RP}$ 週期(直到列能被選取)
* 七個週期中只有兩個週期有用到資料匯流排
* 800MHz 匯流排:6.4GB/s ÷ 7 × 2 ≒ 1.8GB/s
* 800MHz × 8 Byte = 6.4GB/s
* CH6 有助提昇
* 其他 SDRAM 時間值:
* 預充電命令受限於資料傳輸時間
* $t_{RAS}$:
* 在 $\overline{RAS}$ 訊號之後,為另一列預充電的等待時間
* 數字很大,$t_{RP}$ 的 2 ~ 3 倍
* 若起始 $\overline{CAS}$ 接在 $\overline{RAS}$ 後,且 $t_{RAS}$ 為 8 個週期,預充電命令延遲一個額外的週期
* DDR 模組標記法:w-x-y-z-T
* | w | x | y | z | T |
| -------- | -------- | -------- | -------- | -------- |
| $CL$ | $t_{RCD}$ | $t_{RP}$ | $t_{RAS}$ | |
| $\overline{CAS}$ 等待時間 | $\overline{RAS}$ 至 $\overline{CAS}$ 等待時間 | $\overline{RAS}$ 預充電 | 有效化至預充電延遲 | 命令速率 |
* 可用來判斷模組效能
:::warning
"for example" 的簡稱是 "e.g.",不是 "ex",不要誤用。
:notes: jserv
收到
:::
##### 2.2.3. 再充電
* 對列重新充電的時候不能對它存取
> :question: 註解:
> 譯文:不管 [3] 與其它文獻怎麼說,列都是這項操作的對象(見 [18])。 ↩
> 原文:Rows are the granularity this happens with despite what [3] and other literature says (see [18]).
> granularity:顆粒度 -> 系統被劃分為碎片後那些碎片的大小
> 此句話要表達,列是重新充電的 "單位"
* JEDEC(聯合電子裝置工程委員會,Joint Electron Device Engineering Council)規範
* DRAM 記憶單元每隔 64ms 都必須重新充電
* 假如 DRAM 陣列有 8,192 列
* 記憶體控制器平均每 7.8125μs 都得發出再充電命令
* 64ms / 8192 = 7.8125μs
* 整個陣列的再充電時間需要平均分配給每個列確保所有列都在規定時間內得到充電
* > :question: 還沒想很清楚
* 再充電命令能夠佇列等待 -> 實務上兩次請求間的最大間隔能更長
* DRAM 模組
* 紀錄最後一次再充電的列的位址
* 自動為新的請求增加位址計數器
* 從正在被重新充電的列中取得一個關鍵的字組,處理器會被延誤很長一段時間
##### 2.2.4. 記憶體類型
* SDR(單倍資料傳輸速率)SDRAM
* ![](https://hackmd.io/_uploads/rypshQY82.png)
* 記憶單元陣列能夠以等同於經由記憶體匯流排傳輸的速率輸出記憶體內容
* 假如 DRAM 記憶單元陣列以 100MHz 運作
* 單一記憶單元的匯流排的資料傳輸率便為 100Mb/s
* 每個 cell 由一個 bit 組成
* 所有元件的頻率 $f$ 都一樣
* 提升 DRAM 晶片的吞吐量(throughput)的代價很高
* 耗能會隨著頻率增加而增加
* 提升頻率通常也需要提升電壓,會是問題
* 擁有大量的陣列單元代價很高
* > :question:
譯文:由於大量的陣列單元,成本貴得嚇人。
原文: With a huge number of array cells this is prohibitively expensive
-> 由於使用大量的陣列單元,代價高得嚇人。
* DDR1(DDR) SDRAM
* ![](https://hackmd.io/_uploads/H1d5aXY83.png)
* 設法在不提高任何相關頻率的情況下提升吞吐量
* 每個週期傳輸兩倍的資料量
* DDR1 晶片會在上升與下降邊沿傳輸資料
* 也可稱作二倍頻(double-pumped)匯流排
* 緩衝區(buffer)
* 為了不提升記憶單元陣列的頻率
* 持有每條資料線的兩個位元
* 要求令圖 2.7 的記憶單元陣列中的資料匯流排由兩條線路組成
* 實作方式:
* 對兩個 DRAM 記憶單元使用相同的行位址
* 平行存取它們
* 命名
* SDR DRAM
* 直接用頻率
* e.g., PC100 = 100MHz SDR
* DDR1 DRAM
* 頻率不會改變 -> 新的命名方式
* 讓銷售上聽起來更厲害
* 一個擁有 64 位元匯流排的 DDR 模組能夠維持、以位元組為單位的傳輸速率
* e.g., PC1600 = 100MHz DDR
* $100MHz×64bit×2=1,600MB/s$
* DDR2 SDRAM
* 和 DDR1 一樣概念,其中 x2 變成 x4
* 補:彆扭之處
* 用於 CPU、主機板、以及 DRAM 模組的 FSB 速度是使用實質上的頻率來指定的
* 將時脈週期的兩個邊沿都納入傳輸的因素
* 可以浮誇數字
* 擁有 266MHz 匯流排的 133MHz 模組,它的 FSB「頻率」為 533MHz
* > :question:
* DDR2 SDRAM
* ![](https://hackmd.io/_uploads/Hk5A5fsUn.png)
* 匯流排的頻率加倍
* 意味頻寬加倍
* 對記憶單元陣列來說不經濟
* -> 由 I/O 緩衝區在每個時脈週期讀取四個位元,再送到匯流排上
* 只讓 DIMM 的 I/O 緩衝區元件擁有能以更快速度運轉的能力
* DIMM(Dual In-line Memory Module):雙列直插式記憶體模組,指一系列由 DRAM 組成的模組
* DDR3(非用於顯卡中的假 GDDR3)
* ![](https://hackmd.io/_uploads/H1a0iFnwn.png)
* 電壓:1.8V -> 1.5V
* 功率消耗公式:正比電壓的平方 -> 改善 30%
* 改進晶粒(die)尺寸、其它電氣相關
* -> 同頻率下降低一半的功率消耗
* 在相同功率包絡(envelope)的情況下達到更高的頻率
* 包絡:
* 一條可以描繪出波傳遞極值的圓滑曲線
* 描述一個震盪訊號的振幅的變化
* 維持相同熱能排放量的情況下加倍容量
* 記憶單元陣列會以外部匯流排的四分之一速度運轉
* I/O 緩衝區加大到 8 位元
* 因為一開始技術較不成熟,$\overline{CAS}$ 等待時間較高
* > :question:現在呢?
* > :question:
譯文:「這導致只在頻率高於 DDR2 所能達到的情況,並且 ── 儘管如此 ── 一般在頻寬比延遲時間更為重要的時候,DDR3 才有其用處。」
原文: This would cause DDR3 to be useful only at frequencies which are higher than those which can be achieved with DDR2, and, even then, mostly when bandwidth is more important than latency.
-> 這會導致 DDR3 只有在頻率高於 DDR2 能達到的頻率時才有用,且更甚的是通常只有在頻寬比延遲更加重要的時候才有用。
* > :question:
譯文:「無論如何,由於更快的匯流排,達到更高速度的可能性將會超過增加的等待時間。」
原文:In any case, the possibility of achieving higher speeds because of faster buses will outweigh the increased latency.
-> 無論如何,因更快的匯流排而達到更高速度的可能性將會比增加的延遲"更重要"
* 問題:
* 對於 1,600Mb/s 或更高的傳輸率,每個通道的模組數量可能會減至僅剩一個。
* > :question:為何有這個要求?
* 早期的版本中,對於任何頻率都有這個要求
* 可以期待在某個時間點,這項要求會被剔除
* > :question:現在被剔除了嗎
* 否則會嚴重地限制系統的能力
* 所有 DDR 的問題:
* 匯流排頻率的提升,會使得建立平行資料匯流排變得困難
* 要規劃所有連結到資料與位址針腳的佈線,以讓它們有大略相同的長度
* 假如多過一個 DDR 模組被菊花鏈結(daisy-chain)在同一條匯流排上,對於每個附加的模組而言,訊號會變得越來越歪曲。
* > :question:補充菊花鏈結
* DDR2 規範只允許在每個匯流排(亦稱作通道)上有兩個模組,DDR3 規範在高頻時只能有一個
* 由於每個通道有 240 根針腳(DDR2),使得單一北橋無法合理地驅動多於兩個通道
* 替代方式是擁有外部的記憶體控制器,但這代價不小
* 商用主機板受限於至多持有四個 DDR2 或 DDR3 模組
* 限制了一個系統能夠擁有的記憶體總量
* 解決辦法
* 將記憶體控制器加到每個處理器中
* AMD 的 Opteron 系列
* Intel 也將以他們的 CSI 技術來達成
* > :question:達成了嗎?
* 讓處理器所能使用的、適當的記憶體容量都能被連接到單一處理器上
* 某些情況下此設置會引入 NUMA 架構,伴隨著其負面影響
* > :question:NUMA 架構?
* Intel 針對大型伺服器機器的解法:全緩衝 DRAM (Fully Buffered DRAM,FB-DRAM)
* > :question:現在呢?
* 生產相對便宜:使用與現今 DDR2 模組相同的記憶體晶片
* 差異在連結到記憶體控制器的連線中
* FB-DRAM 使用的並非平行資料匯流排,而是一條序列匯流排
* (也能追溯 Rambus DRAM、PATA 的後繼者 SATA 以及 PCI/AGP 的後繼者 PCI Express)
* 以極高頻驅動、恢復序列化的負面影響,甚至提升頻寬
* 主要影響:
1. 每個通道能使用更多模組。
2. 每個北橋/記憶體控制器能使用更多通道。
3. 序列匯流排是被設計成全雙工的(fully-duplex)(兩條線)。
* 理論上光這樣頻寬就能加倍
4. 實作一條差動(differential)匯流排(每個方向兩條線)足夠便宜,因而能提高速度。
* > :question:差動
* 一個 FB-DRAM 模組只有 69 根針腳
* 能較為妥善地處理匯流排的電氣影響
* > :question:電氣影響
* FB-DRAM 規範允許每通道至多 8 個 DRAM 模組
* 一個 FB-DRAM 控制器能夠同時連接多達六個通道
* 即使對於較小 RAM 容量的系統,也能夠提升頻寬
* > :question: 這裡的 6 個跟前面的 8 個?
* 有四個模組的 DDR2 系統擁有兩個通道 = 一個普通的 FB-DRAM 控制器,經由四個通道來達成
* 序列匯流排的實際頻寬取決於用在 FB-DRAM 模組的 DDR2(或 DDR3) 晶片類型
* 優點:
| | DDR2 | FB-DRAM |
| --------------- | ------- | ------- |
| 針腳數 | 240 | 69 |
| 通道數 | 2 | 6 |
| DIMM 數/通道數 | 2 | 8 |
| 最大記憶體(4GB) | 16GB | 192GB |
| 吞吐量(DDR2-800)| ~10GB/s | ~40GB/s |
* 缺點:
* > :question:
譯文:「第二個問題是,晶片驅動序列匯流排需要大量的能量,因為頻率非常高、以及驅動匯流排的需求。」
原文:A second problem is that the chip driving the serial bus requires significant amounts of energy because of the very high frequency and the need to drive a bus.
-> 第二個問題是,由於非常高的頻率和驅動匯流排的需求,晶片驅動序列匯流排需要大量的能量
* 如果要在一個通道上使用多個 DIMM
* 在鏈結的每個 DIMM 上,訊號會被延遲
* 晶片驅動序列匯流排需要大量的能量
* 頻率非常高
* 驅動匯流排的需求
* 但有著同樣頻率、同樣記憶體容量的 FB-DRAM 總是比 DDR2 與 DDR3 還快
* 至多四個的 DIMM 每個都能擁有自己的通道
* 對於大型記憶體系統,DDR 完全沒有任何使用商用元件的解決方法
##### 2.2.5. 結論
* 存取 DRAM 並不是一個非常快速的過程
* 與處理器執行、以及存取暫存器與快取的速度相比並不怎麼快
* 一顆以 2.933GHz 運作的 Intel Core 2 處理器以及一條 1.066GHz FSB 的時脈比率(clock ratio)為 11:1(註:1.066GHz 匯流排是四倍頻的)
* > :question:怎算
* 每在記憶體匯流排延誤一個週期,意味著延誤處理器 11 個週期
* 對於大多數機器來說,實際使用的 DRAM 要更慢一些,也因此增加延遲
* 讀取命令的時序圖顯示 DRAM 模組的持續資料傳輸速率(sustained data rate)很高
* 整個 DRAM 列能夠在毫無延誤的情況下傳輸
* 資料匯流排能夠 100% 持續使用
* DDR 模組:每個週期傳輸兩個 64 位元的字組
* DDR2-800 模組與雙通道:速率為 12.8GB/s
* 但除非設計成這樣,DRAM 並非總是循序存取的
* 使用不連續的記憶體區域
* 需要預充電以及新的 $\overline{RAS}$ 訊號
* -> 導致工作慢下來的原因
* 越早進行預充電以及發送 $\overline{RAS}$ ,真的需要那列時的損失(penalty)就越小
* 硬體與軟體預取(prefetch)能夠用以創造更多時間上的重疊並減少延誤
* 預取
* 有助於及時搬移記憶體操作
* 在資料真的被需要之前少點爭奪
* 不必在基本上相同的時間發出寫入與讀取操作
#### 2.3. 其它主記憶體使用者
* 除了 CPU 之外,還有其它能夠存取主記憶體的系統元件
* 網路與大容量儲存裝置控制器等高效能擴充卡(card)
* 無法負擔透過 CPU 輸送所有它所需要或提供的資料的成本
* 直接從/往主記憶體讀取或寫入資料(直接記憶體存取〔Direct Memory Access〕,DMA)
* 擴充卡能夠透過南北橋直接與記憶體溝通
* 其它匯流排,像是 USB,也需要 FSB 頻寬
* 不使用 DMA
* 南橋也會經由北橋、透過 FSB 連接到處理器
* FSB 頻寬的競爭
* 在 DMA 流量很大的時候,CPU 可能會在等待從主記憶體來的資料時,延誤得比平常更久
* 假如有對的硬體的話,有許多繞過這個問題的方法
* 如圖 2.3 的架構,可以設法確保使用不受 DMA 影響的節點上的記憶體來進行運算
* 也可能讓一個南橋依附在每一個節點上,均等地分配 FSB 在每個節點上的負載
* 第六節,我們將會介紹可望從軟體上協助達成改進的技術與程式設計介面
* 有些廉價系統的圖形系統缺乏獨立且專用的視訊 RAM(video RAM)
* > :question:視訊 RAM
* 使用主記憶體的一部分作為視訊 RAM
* 嚴重地影響系統效能,尤其是等待時間
* 視訊 RAM 的存取很頻繁(對於一個 16 bpp、60Hz 的 1024x768 的顯示器而言,即為 94MB/s)
* 系統記憶體 ── 不像顯示卡上的 RAM ── 並不具有兩個埠