1. 程式人生 > >Intel Sandy Bridge/Ivy Bridge架構/微架構/流水線 (18) - 資料預取

Intel Sandy Bridge/Ivy Bridge架構/微架構/流水線 (18) - 資料預取

Data Prefetching

使用軟體預取指令,硬體預取機制,或者兩者的任意組合,都可以將資料投機式地載入到L1D中。

程式設計師可以使用4條SSE預取指令來實施軟體控制的預取操作。這些指令給處理器提供一些“提示”,請求將資料行載入到指定的某級快取中。注意:軟體控制的預取是針對資料的,不要預取程式碼。

接下來講述Sandy Bridge提供的各種的硬體預取機制以及與前代微架構相比所作的增強點。資料預取器的設計目標是自動地預測程式即將要消費的資料。如果資料尚未在執行核中或者內層快取(注:指處理器核中的L1和L2快取)中,預取器會將資料從外層快取(注:即L3/LLC快取)或者儲存器中預取到內層快取裡。預取具有如下的效果(未必都是好的):

  • 對於順序使用資料的程式碼,提供程式效能。
  • 如果資料訪問模式是離散的而非區域性的,可能會由於頻寬問題導致程式效能略微下降

注:資料預取操作會消耗部分頻寬;預取的資料可能未被使用

  • 在某些罕見的情況下,如果程式的演算法被調優成了佔據大部分的快取記憶體空間,不必要的資料預取則可能導致程式還要使用的快取行被驅逐(evict)。考慮到L1有限的容量,硬體預取器可能會導致嚴重的效能惡化。

注:此時可以從BIOS設定中禁用相關的預取選項。

Data Prefetch to L1 Data Cache

當滿足如下條件時,資料預取由讀存操作觸發:

  • 從回寫式記憶體型別中讀資料
  • 要預取的資料與觸發預取的讀操作讀取的資料位於同一個4K頁面中。

注:即不能跨頁面預取資料。在Ivy Bridge微架構中有一個下頁預取器(NPP,next-page prefetcher)用於跨頁面進行資料預取。

  • 流水線中沒有fence。(todo:解釋fence)
  • 沒有太多的讀存未中事件在處理

注:此時不進行預取是想要節省訪存頻寬用於處理快取未中事件。

  • 沒有持續的寫存指令流

注:節省訪存頻寬

有兩個硬體預取器用於將資料載入到L1D快取中:

  • DCU(data cache unit)預取器。這個預取器也被稱為流式預取器(streaming prefetcher)。如果最近的讀操作按地址升序模式訪問儲存器,則會觸發DCU預取。處理器會假設這是一種流式訪問演算法,自動地預取下一行。
  • 基於指令指標IP的步進預取器(IP-based stride prefetcher)。這個預取器跟蹤單條讀存指令。如果偵測到讀操作有固定的有規律的步長,則以當前地址加上步長為源地址預取下一個資料行。預取器可以偵測前向(地址升序)或者後向(地址降序)的訪存模式,可以偵測的步長最長可達2K位元組。

Data Prefetch to L2 and Last Level Cache

有兩個硬體預取器可以將資料從儲存器中預取到L2快取和LLC快取中:

  • 空間預取器(spatial prefetcher:對於每個讀取到L2快取中的資料行(64位元組),這個預取器努力預取相鄰的快取行,從而形成一對完整的按照128位元組對齊的快取行塊(即兩個快取行組合在一起按照128位元組對齊)。
  • 二級流預取器(Streamer:這個預取器監視來自於L1快取的讀存請求,可以監視升序地址或者降序地址模式。受監視的讀存請求包括:由讀存或寫存操作發起的或者由硬體預取器發起的L1D請求,以及L1I發起的取指請求。預取的快取行必須位於同一個4K位元組頁面中。

這兩個預取器將資料預取到LLC中。除非L2快取已經負擔著很重的未命中(注:指L1未命中?)處理請求,通常資料也會被預取到L2中。

對二級流預取器Streamer的增強如下:

  • 對每次L2查詢,Streamer可以發起兩個預取請求,在實際讀存操作之前,最遠可以提前預取20個快取行。
  • 根據每個處理器核的未完成請求的數量動態調整預取行為。如果沒有太多的未完成請求在排隊,streamer可以儘可能遠地進行預取。如果請求很多,則只預取到LLC且預取地比較近。
  • 當預取的快取行比較遠時,只加載到LLC快取,但不儲存到L2快取。這種方式可以避免將L2緩衝中還會被使用的資料行替換掉。
  • 偵測並維護最多達32個數據訪問流。對每個4K頁面,可以維護一個前向流與一個後向流。