【Microarchitecture of Intel and AMD CPU】 9 Sandy Bridge and Ivy Bridge pipeline 【9.8-9.10】

9.8 寄存器分配和重命名

所有的整數,浮點,MMX,XMM,YMM,標誌寄存器,並且可能段寄存器也可以被重命名。浮點數控制字也可以被重命名。

寄存器重命名被RAT(寄存器重命名錶)和重排序緩衝區控制,如圖6.1所示。來自譯碼器和stack engine的uops通過queue進入RAT,而後進入ROB-read 和保留站。RAT可以每週期處理4條uop。RAT可以每週期重命名4個寄存器,並且它甚至可以一個週期內重命名同一個寄存器4次。

非依賴的case

通常將一個寄存器設置爲0的方式是與其自身異或,或者讓它與自身相減,比如XOR EAX,EAX。如果處理器識別發現指令的兩個操作數是同一個寄存器,那麼它就不依賴於該寄存器之前的值。

這個可以應用到所有的以下的指令:XOR,SUB,PXOR,XORPS,XORPD,VXORPS,VXORPD 和 所有的變種:PSUBxxx和PCMPGTxx,但是不能應用到CMP,SBB,PANDN等等。

這些指令可以在重命名階段將寄存器設置爲0,這類的置0指令的吞吐率是每個週期4條指令,但是並沒有使用到執行單元。

PCMPEQxx指令會將所有的bit設置爲1,如果操作數的兩個寄存器相同。這樣的指令可以被識別成不依賴於寄存器之前的值,但是它確實需要一個執行單元。使用64bit mmx寄存器的置0指令也會需要使用執行單元,因爲和x87的浮點棧指針寄存器的overlap。

不需要執行單元的指令

上述提到的特殊情況是,XOR EAX,EAX這類的置零指令會在寄存器重命名,分配階段被處理好,而不需要使用任何的執行單元。這使得利用置零指令變的十分的高效。每週期可以實現4條置零指令的吞吐率。進位表示可以以相同的方式使用CLC清零。

之前的處理器只能在寄存器重命名階段處理FXCH指令。Sandy Bridge可以在寄存器重命名和分配階段處理這些特殊的case:比如置零指令和NOP指令。

NOP指令,包括多byte的NOPs因此是非常高效的,每週期4條指令的吞吐率。爲了提高效率,最好使用多byte的NOPs,而不是使用僞NOP,比如MOV EAX,EAX 或者是 LEA RAX,[RAX+0].

減少MOV指令

Ivy Bridge( 不是 Sandy Bridge) 可以在寄存器分配階段減少寄存器的移動。接下來的例子解釋了這個現象:

; Example 9.3. Move elimintaion
add eax,4
mov ebx,eax ; this move can be eliminated
sub ebx,ecx

在這個例子中,mov ebx,eax指令很可能被寄存器重命名所省去。代表ebx的物理寄存器師弟三條指令的輸入,同樣也是第一條指令的輸出。寄存器重命名在Page11中有介紹。

Move Elimination 並不是總會成功。如果必須的操作數沒有準備好時,它會失敗。但是通常在超過80%的case中,move elimination都會成功。move 鏈也可以被移除。

move 移除在所有的32bit和64bit通用寄存器和所有的128bite,256bit向量寄存器都可以使用。

擴展0的從8bit移動到32bit或64bit寄存器操作也可以被移除,比如movz eax,bl。16bit 擴展0的移動不能夠被移除。移動到8bit,16bit或者mxx寄存器的不能被移除。符號擴展的移動也不能被移除。

將一個寄存器移動到自身永遠不能被移除,比如mov eax,eax是不能被移除的。

一個被移除的move的latency爲0,不能使用任何的執行單元,但是消耗了譯碼器的帶寬。

9.9 寄存器讀阻塞

在之前的處理器中,寄存器讀取阻塞已經成爲了一個嚴重的,通常被忽略的瓶頸,直到intel Pentium Pro。 所有的intel基於P6微架構的處理器和他的衍生處理器,如Pentium M,Core 和 Nehamlem 微架構都限制每個週期從永久寄存器文件中讀取2個到3個寄存器。

在Sandy Bridge 和 Ivy Bridge 中,這個瓶頸已經被移除。在我的實驗中,我沒有發現對寄存器讀取個數的限制。

9.10 執行單元

Sandy Bridge 和 Ivy Bridge 有六個執行單元。Port0,1和5用於算數與邏輯計算(ALU)。有2個存儲器讀端口2和3,而之前的處理器只有1個。寫端口Port4 沒有地址計算單元。所有的寫操作都需要使用端口2或者3來進行地址計算。吞吐量的最大值爲每週期每個端口1條未融合的uop。

Port0,1和5支持全256 bit的向量操作。Port2,3和4使用兩個週期來進行256bit的讀或者寫操作。 在表格9.3和9.4中列出了不同的單元。

爲通用寄存器和向量寄存器的乘法有專門的端口。通用寄存器使用端口1的乘法器,延遲爲3。整數和浮點寄存器陳發使用端口0,對不同的精度都爲延遲5。這兩個乘法器可以同時執行,並且都可以完全的流水線化,每週期1條向量操作。

整數除法使用端口0的浮點除法單元,這是唯一一個沒有pipeline的單元。

端口5的跳轉單元處理所有的跳轉和分支操作,包括macro-fused的計算-分支指令。

處理器對整數和浮點向量操作有不同的執行單元。比如,浮點向量移動(MOVAPS和MOVAPD)只在port5端口執行,然而整數向量移動(MOVDQA)可以在port0,1和5端口上執行。

執行單元在端口0,1,和5被安排的很好。這使得每個週期執行3條向量指令變得可能,比如浮點向量乘法在port0,浮點向量加法在port1,浮點shuffle在端口5。

整數向量操作的延遲和通用寄存器的操作的延遲相同。這使得在沒有足夠的通用寄存器時,使用MMX寄存器和XMM寄存器進行整數操作變得非常便利。但是向量操作紙杯很少的幾個單元支持。

 


翻譯自【Microarchitecture of Intel and AMD CPU  An optimization guide for assembly programmers and compiler makers】

歡迎關注我的公衆號《處理器與AI芯片》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章