記憶體控制器(memory controller)
想像繁忙機場的航管員。飛機(記憶體請求)雜亂地抵達,跑道與登機門(記憶庫與通道)有限,有些操作比別的久。航管員不是先到先服務;他聰明地排序它們——把一架送往空著的登機門,同時另一架還在滑行——好讓一切持續運轉、避免相撞。記憶體控制器對 DRAM 做的正是這件事:它是把 CPU 的記憶體請求翻譯成 DRAM 所需的精確底層命令、並以聰明順序發出的硬體。
具體來說,記憶體控制器(今日就內建在 CPU 裡)位在最後一層快取與 DRAM 之間。它拿到位址,把它們對應到通道/階/記憶庫/列/行,發出精確的 DRAM 命令——啟動(ACTIVATE)一列、讀(READ)或寫(WRITE)一行、預充電(PRECHARGE)以關掉一列——同時遵守每一個時序限制(tRCD、CL、tRAS、更新間隔等等)。關鍵是它會重排與排程請求:它試著把對同一開著列的存取湊成一批(列緩衝區命中)、把存取散到各記憶庫與通道以求平行、並穿插更新,全都是為了把有用的頻寬拉到最大、把停頓壓到最小。
為何重要:記憶體控制器是抽象的記憶體請求與 DRAM 凌亂物理現實交會之處,它的排程品質對效能有很大、很真實的影響。好的排程能把一連串原本會是列衝突的存取變成便宜的命中;差的排程則浪費頻寬。它也是位址交錯(interleaving)被決定的地方——連續的位址如何被灑到各記憶庫與通道,好讓普通的存取模式自然地利用到平行。簡而言之,它是那顆在物理允許範圍內盡可能隱藏 DRAM 延遲的大腦。
四個待處理的讀取,目標是記憶庫 0、1、2、3 中已經開著的列。控制器把它們對四個記憶庫重疊發出、而非一個接一個——把原本可能是四次完整列啟動的事,變成四次平行、大多命中的存取。
跨記憶庫與通道的聰明重排,就是控制器隱藏 DRAM 延遲的方式。
控制器隱藏延遲;它無法消滅延遲。當請求為了吞吐量被重排時,一個對延遲關鍵的單一存取仍可能被排在一批之後而被拖延——排程優化的是平均,有時是以尾端為代價。