記憶體階層與快取
快取未命中(cache miss)
你伸手拿筆——它不在桌上。現在你得打開抽屜、找到它、拿過來,這要花實實在在的時間。快取未命中就是這個比較不幸的時刻:CPU 所要的資料「不在」快取裡,於是硬體必須下到較慢的層級(下一層快取或主記憶體)把它抓來,存取才能完成。
未命中時,快取向下一層請求那條缺少的列並等待——這個等待就是未命中代價,常是數十到數百個週期。當列抵達時被放進快取(若位置已被佔用,就依替換策略淘汰某條既有列),好讓未來對它的存取命中。未命中有三種樣貌,即三種未命中:強制(對某區塊的第一次參照,無法避免)、容量(工作集比快取大,有用資料被淘汰出去騰位)、衝突(在非全相聯的快取裡,好幾個熱區塊爭奪同一組、不斷把彼此擠出,即使整個快取並未塞滿)。
未命中不是故障——每次存取全新資料至少都得未命中一次——但記憶體成本幾乎全藏在這裡,因為每一次都掉到慢的層級。減少未命中是效能調校的主要遊戲:更好的區域性能縮小容量與衝突未命中,更大或更聰明的快取也有幫助,而預取則試圖在資料被要求前就抓來、把未命中變成命中。誠實的提醒:你永遠無法把未命中歸零,因為強制未命中是第一次觸碰資料時與生俱來的。
讀取一個從未碰過的陣列元素會強迫一次強制未命中:列從 DRAM 拉來,花掉未命中代價。在列優先語言裡以行優先方式讀二維陣列,每步跨很遠、使快取列失效,幾乎把每次存取都變成未命中——答案相同,卻慢上好幾倍。
資料不在快取,於是存取掉到較慢的層級並付出未命中代價。
你無法消除所有未命中:對某區塊的「第一次」存取(強制未命中)無可避免。調校針對的是容量與衝突未命中,它們來自快取太小與碰撞——而非第一次觸碰資料。
又称
另见