Intel Core & Enhanced Core微架構(12)
Data Prefetch to L1 Caches
Intel Core微架構提供了2個硬體預取器,可以將資料預取到一級快取中,由此加速程式訪問資料的速度:
- 資料快取單元預取器(DCU prefetcher) – 這個預取器,也被稱為流式預取器,按最近地址升序的讀存操作觸發。處理器認為這種型別的訪存屬於流式訪存演算法,會自動的預取下一行資料。
- 基於指令指標的步長預取器 – 這個預取器持續的跟蹤單條讀存指令。如果偵測到有規律的步長,就會預取下一條資料,地址是當前地址加上偵測到的步長。這個預取器可以向前或者向後進行預取,可以偵測到的步長最大可達4K位元組頁面的一半,即2K個位元組的步長。
資料預取適用於滿足一下條件的讀存操作:
- 讀存操作訪問回寫記憶體型別
- 預取請求在4K頁面的邊界內(即不能跨儲存器頁面進行預取)
- 在流水線中不能有進行中的fence或者lock(即不能有訪存序列化指令或者匯流排封鎖指令)
- 不能有太多的讀存未命中事件在處理過程中(預取操作優先順序低,目的是節省訪存頻寬)
- 匯流排也不能太忙(為其他操作節省匯流排資源)
- 不能有持續的寫存操作流(避免增加衝突,也節省頻寬)
DCU預取具有如下的效果:
- 如果程式中某個大結構體中的資料按照順序儲存,則可以提升效能
- 如果訪存模式過於鬆散而非區域性訪問,則可能會由於頻寬問題導致輕微的降低效能
注:進行中的預取會佔用頻寬,鬆散的訪存頻繁導致快取未命中而訪存,造成頻寬競爭。
- 在某些罕見的情況下,如果程式演算法設計為佔用大部分快取記憶體,無用的預取會導致程式需要的快取行被evict。由於DCU的容量有限,這種情況下的硬體預取可能會導致嚴重的效能惡化。(注:可以檢視BIOS設定是否有關閉DCU預取的選項)
硬體預取機制以來硬體邏輯來預測資料訪問模式,做為對比,軟體預取指令則依賴程式設計師來預測訪問資料時快取的命中情況。軟體預取指令作為一種提示資訊,讓處理器提前將某個資料行讀取到指定的某級快取中。注意:軟體預取的意圖是預取資料,不要預取指令。
Data Prefetch Logic
根據一級資料快取向二級快取請求資料的歷史模式,資料預取邏輯DPL可以預先將資料讀取到二級快取中。DPL維護者兩個獨立的來自於DCU的儲存地址陣列:一個記錄上行流(12個條目),另一個記錄下行流(4個條目)。DPL在每個條目中跟蹤對一個4K位元組大小的頁面的訪問。如果訪問過的頁面不在任何一個數組中,則會為該頁面分配一個數組條目。
注:上行流即某個頁面中按地址增大的順序訪問資料;下行流即按地址減小的順序訪問資料。每個條目跟蹤一個頁面,則DPL可以跟蹤12個上行流頁面和4個下行流頁面。
資料預取邏輯DPL監視DCU的遞增的讀請求序列(被稱為讀請求流)。一旦DPL偵測到對某個流的第二次請求,它會預取下一個快取行。例如,當DCU請求快取行A和A+1,DPL會假設DCU接下來很快會需要快取行A+2。如果DCU真的請求了A+2快取行,則DPL會預取快取行A+3。對於“下行流”請求模式,DPL採取類似的工作機制。
資料預取邏輯DPL是由Intel Pentium M處理器引入的,在Intel Core微架構上做了如下增強:
- DPL可以偵測更加複雜的流模式,例如請求流跳過快取行。DPL可以在每次二級快取查詢時做兩個預取請求。Intel Core微架構中的資料預取邏輯在DCU實際發出讀取請求之前可以提前預取最多達8個快取行。
- 資料預取邏輯可以根據匯流排頻寬和請求的數量動態的調整預取行為。如果匯流排不忙的話,DPL可以預取的更遠(即更多快取行),否則DPL只做少量預取(即少數快取行)。
- DPL可以根據不同的應用和系統配置調整。注:例如BIOS選項。
處理器中的每個核獨立操作DPL。英文原文如下:Entries for the two cores are handled separately.