1. 程式人生 > >Intel Sandy Bridge/Ivy Bridge架構/微架構/流水線 (9) - 流水線前端/微指令佇列&迴圈流偵測器LSD

Intel Sandy Bridge/Ivy Bridge架構/微架構/流水線 (9) - 流水線前端/微指令佇列&迴圈流偵測器LSD

Micro-op Queue and the Loop Stream Detector (LSD)

微指令佇列將流水線前端與亂序引擎解耦合(即隔離開)。它位於微指令生成單元與重新命名單元之間(參看上圖),主要功能是用於隱藏不同的微指令來源(即傳統譯碼流水線,MSROM和微指令快取)產生的“氣泡現象(即頻寬不均衡)”,確保每週期可以傳送4條微指令給流水線後續階段(即亂序引擎)。

對某些指令型別,微指令佇列在譯碼之後具有一些額外的功能。尤其是,讀存操作與計算操作以及所有的寫存操作,當使用變址定址時,在譯碼器和微指令快取中都表現為單條微指令(即微熔合機制)。但是在微指令佇列中,這些操作會被分裂成兩條微指令,被稱為“離解”過程(un-lamination process):一條微指令執行讀存操作,另一條執行計算操作。下面是一條典型的“讀存加計算”指令:

ADD RAX, [RBP+RSI]; rax = rax + LD(RBP+RSI)

類似的,下面這條寫存指令具有3個暫存器源(注意不是源運算元),會分解成“生成儲存地址”與“生成儲存資料”兩個字操作。

MOV [ESP+ECX*4+12345678], AL

 

通過“離解過程”生成的額外的微指令會使用重新命名和退役頻寬;但是,總體上會有省電效果。對於大量使用變址定址模式的程式碼(通常是陣列處理),重新設計程式演算法,使用基址定址(或相對基址定址)有時候可以提升程式效能,因為可以保持讀存操作與計算操作以及儲存操作始終處於熔合狀態,即不會被微指令佇列“離解”。

The Loop Stream Detector (LSD)

迴圈流偵測器LSD最初由Intel Core微架構引入(注:位於BPU中)。LSD偵測符合條件的小迴圈,將其鎖定在微指令佇列中。迴圈指令可以直接從微指令佇列中獲取,不再需要取指/譯碼或者從任何的快取中讀取微指令,直到分支預測失敗結束迴圈。

符合如下特徵的迴圈方可由LSD/微指令佇列鎖定:

  • 最多由8個32位元組指令塊構成
  • 最多28條微指令(~28 x86指令)
  • 所有的微指令同時存在於微指令快取中
  • 可以包括最多8個採納分支,且這些分支不能是CALL或者RET指令
  • 不能有未匹配的棧操作。例如,PUSH指令比POP指令多。

許多計算密集型的迴圈,查詢,和軟體字串搬移操作都符合這些特徵。

軟體應該“機會主義式的”使用LSD功能。對於要求高效能的程式碼,迴圈展開通常比LSD迴圈鎖定更受推薦,即便是迴圈展開可能導致無法做LSD鎖定(例如程式碼長度過大)。