記憶體階層與快取

記憶體牆(memory wall)

想像一位廚師多年來把切菜練到快了十倍——但儲藏室還是走廊盡頭那麼遠的一段路。很快地,這位廚師幾乎整個班都在走去儲藏室,而不是在做菜。把廚師加快已經幾乎沒用了;現在限制晚餐的,是去儲藏室那一趟。記憶體牆對處理器就是同樣的窘境:CPU 一個十年又一個十年地大幅加速,主記憶體卻只慢慢變快,於是抓資料成了主導的瓶頸。

用數字來說:大約從 1980 年代起的一長段時間,處理器速度每年約進步 50%,而 DRAM 存取時間每年只進步個位數百分比。兩條曲線指數般地分岔,那道縫隙就是「牆」。現代核心在一次主記憶體存取回來的時間內,可以執行數百道指令。所以若處理器每次存取都得等記憶體,它絕大部分時間都會閒著乾等,全部速度都浪費掉。

記憶體牆是快取存在的原因,也是快取設計堪稱計算機結構中最重要效能主題的原因。快取、預取、更深的階層、更寬的記憶體通道,全是對付這道牆的武器。值得誠實面對:這道牆並未被拆除,只是被管理——記憶體延遲仍比暫存器存取糟上數百倍,一次到 DRAM 的快取未命中,就能讓快速核心停頓相當於數百道指令的時間。現代晶片與快取友善程式碼中的許多巧思,說到底都是為了不撞上這道牆。

若核心跑在 3 GHz(一個週期約 0.33 奈秒),而一次主記憶體存取要約 80 奈秒,那一次存取約等於 240 個週期。在這些週期裡,一顆寬核心本可完成數百道指令——全因等待而損失,除非快取先接住了這次存取。

CPU 把記憶體甩開了好幾個數量級;這道擴大的縫隙,就是快取被造出來去掩蓋的牆。

這道牆講的是「延遲」(一次存取要等多久),它改善得極慢。記憶體「頻寬」(每秒位元組數)成長快得多——所以把受延遲拖累的存取轉成受頻寬支配的串流(預取、良好區域性)的技巧,幫助很大。

又称
processor-memory gap處理器-記憶體鴻溝