記憶體階層與快取

快取命中(cache hit)

你伸手拿筆——運氣真好——它已經在你桌上了。不用跑去抽屜、不用翻找;你立刻拿到。快取命中正是記憶體存取那一刻的好運:CPU 所要的資料已經在快取裡,因此能快速交付,不必下到較慢的記憶體。

在機制上,每次存取,快取用位址的一部分查到正確位置,再把儲存的標籤和位址其餘部分比對。若某條已存列的標籤相符、且該列有效,就是命中:所要的位元組直接從快速快取讀出,只花命中時間(L1 常是一個或幾個週期)。命中的存取比例是命中率,其補數——未命中率——就是 1 減命中率。把命中率拉高,是快取設計與撰寫區域性友善程式碼的核心目標。

命中正是階層得以運作的全部原因:因為區域性讓絕大多數存取都命中,平均記憶體存取時間就能停在那個快速的命中時間附近,即使每次未命中都很昂貴。一個有用的誠實話:「高」命中率沒有聽起來那麼令人安心,因為未命中比命中昂貴太多。從 97% 提升到 99% 的命中率聽起來只是小進步,卻可能大致把未命中流量減半、明顯加快程式——那幾個百分點的未命中,往往主導了總時間。

若每 100 次存取有 95 次命中(命中時間 1 週期)、5 次未命中(未命中代價 100 週期),光是未命中就花 500 週期,而全部命中加起來才 95 週期。把命中推到 100 次中 98 次,未命中成本就從 500 降到 200 週期——少見的未命中主導全局。

幸運的情況:資料已在快取裡,以快速的命中時間交付。

高命中率可能藏著一支慢程式。因為每次未命中比命中昂貴數十到數百倍,連 1-2% 的未命中率都可能主導總記憶體時間。要以 AMAT(依代價加權未命中)來判斷,而非只看命中率。

又稱
hit命中