Intel, AMD及VIA CPU的微架構(2)

2021-08-07 09:34:06 字數 2332 閱讀 3787

從ppro開始的第六代intel微處理器,在微架構實際上,提供了乙個重要的,稱為亂序執行的改進。思想是,如果由於輸入資料尚不可用,一條特定指令的執行被推遲,那麼處理器將嘗試在後續指令中找出它可以執行的第一條,如果該指令的輸入資料已就緒。顯然,微處理器必須檢查後續指令是否需要前面指令的輸出。如果每條指令都依賴之前指令的結果,那麼我們沒有亂序執行的機會。這稱為依賴鏈。手冊2:「優化彙編例程」給出了如何避免長依賴鏈的例子。

確定輸入依賴的邏輯,以及一旦必須的輸入就像就執行指令的機制,給予我們更多好處——微處理器同時可以完成幾件事情。如果我們需要做一次加法與一次乘法,並且兩者彼此不依賴,那麼我們可以同時進行兩者,因為它們使用兩個不同的執行單元。但如果只有乙個乘法單元,我們無法同時執行兩個乘法。

通常,這些微處理器中的一切都是高度流水線化的,以提公升吞吐率。例如,如果浮點加法需要4時鐘週期,並且執行單元完全流水線化,那麼在t時刻我們開始一次加法,它將在t+4時刻完成,而在t+1時刻開始另一次加法,它將在t+5時刻完成。因此,如果**可以組織成在相鄰指令間的依賴性盡可能少,這個技術的優勢是最大的。

具有亂序執行能力的微處理器把所有的指令翻譯為微操作——縮寫為μops或uops。簡單指令,像addeax, ebx僅產生乙個μops,而像addeax, [mem1]的指令可能產生兩個μops:乙個用於從記憶體讀入乙個臨時(匿名)暫存器,另乙個將臨時暫存器的內容加到eax內容上。指令add[mem1], eax可能產生三個μops:乙個讀入記憶體,乙個執行加法,乙個將結果寫回記憶體。這樣的好處是μops可以亂序執行。例如:

;example 2.1. out of order processing

moveax, [mem1]

imuleax, 5

addeax, [mem2]

mov[mem3], eax

這裡,指令addeax, [mem2]被分解為兩個μops。這樣的好處是,微處理器可以在進行乘法的同時獲取[mem2]的值。如果資料不在快取裡,在開始獲取[mem1]後,微處理器將立即開始獲取[mem2],遠在乘法可以開始之前。分解為μops還使得棧的工作更有效。考慮這個序列:

;example 2.2. instructions split into μops

pusheax

callfunc 10

指令pusheax可能被分解為兩個可以表示為subesp, 4及mov[es], eax的μops。這樣的好處是,即使eax的值還未就緒,也可以執行μopssub esp, 4。操作call需要esp的新的值,因此,如果指令push沒有分解為μops,call必須等待eax的值。歸功於μops的使用,棧指標的值幾乎從不會導致普通程式的延遲。

考慮這個例子:

;example 2.3. register renaming

moveeax, [mem1]

imuleax, 6

mov[mem2], eax

moveax, [mem3]

addeax, 2

mov[mem4], eax

這段**執行兩件彼此無關的事情:[mem1]乘上6,[mem3]加上2。如果在最後三條指令中,我們使用另乙個暫存器,那麼無關性就很明顯。事實上,微處理器勝任這個工作。在最後三條指令中,它使用別的臨時暫存器,因此它可以並行進行乘法與加法。ia32指令集僅提供7個32位通用暫存器,通常我們耗盡它們。因此我們承受不起為每次計算使用乙個新暫存器的奢侈行為。但微處理器有大量的臨時暫存器可用。微處理器可以重新命名這些臨時暫存器中的任乙個來代表乙個邏輯暫存器,比如eax。

暫存器重新命名以乙個非常簡單的方式,完全自動完成。每次指令寫或修改乙個邏輯可暫存器時,微處理器將乙個新臨時暫存器分配給邏輯暫存器。上面第一條指令將分配乙個臨時暫存器給eax。第二條指令將新的值放入eax,因此這裡將分配乙個新臨時暫存器。換而言之。乘法指令將使用兩個不同的暫存器,乙個用於輸入,另乙個用於輸出。下乙個例子展示這樣的好處:

;exampe 2.4. register renaming

moveax, [mem1]

movebx, [mem2]

addebx, eax

imuleax, 6

mov[mem3], eax

mov[mem4], ebx

現在,假定[mem1]在快取裡,而[mem2]不在。這意味著乘法可以先於加法開始。對乘法結果使用乙個新臨時暫存器的好處是,我們仍然有eax舊的值,必須保留它,直到ebx對加法就緒。如果我們對乘法的輸入、輸出使用相同的暫存器,那麼乘法將必須等待,直到載入ebx且加法完成。在所有的操作完成後,代表**序列中eax最終值的臨時暫存器的值被寫入永久的eax暫存器,這個過程稱為**(retire)(參考81頁)。

所有通用暫存器,棧暫存器,標記,浮點暫存器,向量暫存器及可能段暫存器可以重新命名。許多處理器不允許重新命名控制l1字,浮點狀態字,這是為什麼修改這些暫存器的**慢的原因。

Intel, AMD及VIA CPU的微架構(4)

用於p1的分支 機制與其他處理器差異極大。在intel文件及別處找到的,關於這個主題的資訊是誤導性的,遵循這些文件中給出的建議很可能導致次優的 p1有乙個分支目標緩衝 btb 它可以儲存最多256條跳轉指令的資訊。btb被組織為乙個4路組相連快取,每路64項。這意味著btb不能持有超過4個組值相同的...

intel AMD平台主機板等級分類

intel平台的主板晶元組 市面上常見的有x z b h 4個等級 不同等級搭配的cpu也有所不同 x 級定位發燒級 一般搭配的cpu效能十分強悍,例如目前在售的x299主機板有2066個針腳,可搭配i9 7920x i9 7980xe等處理器使用,昂貴。z 級定位高階級別 是民用級別裡面最高的,支...

mysql三大正規化及資料約束及查詢及儲存過程

資料約束 連線查詢 多表查詢 儲存過程 引數型別 會話變數 變數只在當前連線會中有效 區域性變數 帶有輸入輸出引數的儲存過程 帶有判斷條件的儲存過程 帶有迴圈條件的儲存過程 接收表中的資料的儲存過程 觸發器create table student id int,name varchar 20 gen...