簡介
亂序執行(out-of-order execution)是指CPU採用了允許將多條指令不按程式規定的順序分開發送給各相應電路單元處理的技術。比方Core亂序執行引擎說程式某一段有7條指令,此時CPU將根據各單元電路的空閒狀態和各指令能否提前執行的具體情況分析後,將能提前執行的指令立即傳送給相應電路執行。
定義
在各單元不按規定順序執行完指令後還必須由相應電路再將運算結果重新按原來程式指定的指令順序排列後才能返回程式。這種將各條指令不按順序拆散後執行的運行方式就叫亂序執行(也有叫錯序執行)技術。
解釋
這樣將根據個電路單元的狀態和各指令能否提前執行的具體情況分析後,將能提前執行的指令立即傳送給相應電路單元執行,在這期間不按規定順序執行指令,然後由重新排列單元將各執行單元結果按指令順序重新排列。採用亂序執行技術的目的是為了使CPU內部電路滿負荷運轉並相應提高了CPU的運行程式的速度。分枝技術:(branch)指令進行運算時需要等待結果,一般無條件分支只需要按指令
順序執行,而條件分枝必須根據處理後的結果,再決定是否按原先順序進行。
目的
這好比請A、B、C三個名人為晚會題寫橫幅“春節聯歡晚會”六個大字,每人各寫兩個字。如果這時在一張大紙上按順序由A寫好"春節"後再交給B寫"聯歡",然後再由C寫"晚會",那么這樣在A寫的時候,B和C必須等待,而在B寫的時候C仍然要等待而A已經沒事了。
但如果採用三個人分別用三張紙同時寫的做法, 那么B和C都不必須等待就可以同時各寫各的了,甚至C和B還可以比A先寫好也沒關係(就象亂序執行),但當他們都寫完後就必須重新在橫幅上(自然可以由別人做,就象CPU中亂序執行後的重新排列單元)按"春節聯歡晚會"的順序排好才能掛出去。
工作原理
在按序執行中,一旦遇到指令依賴的情況,流水線就會停滯,如果採用亂序執行,就可以跳到下一個非依賴指令並發布它。這樣,執行單元就可以總是處於工作狀態,把時間浪費減到最少。亂序執行可以允許在發布指令3前發布指令4~8,而且這些指令的執行結果可以在指令3引出後立即引出(按序引出對X86 CPU來說是必需的),實際解碼率又會增加25%。不過PⅡ和K6從亂序執行中得到的好處有限,因為如果CPU遇到指令依賴情況,它必須找到更多的非依賴指令進行發布。
WinChip的性能表現看到一個帶有大容量一級Cache的按序執行CPU能夠同亂序執行CPU競爭,在時鐘周期方面,Cache未命中的代價是非常高昂的。帶有大容量一級Cache的按序執行CPU性能,比只有較小容量Cache亂序執行CPU的性能要強。
而Rise的工程師在這方面犯了錯誤,MP6的一級Cache只有16KB,因此Cache未命中的發生頻率比其他CPU高,以致於它很難“餵飽”它的3條流水線。這是很可惜的事,因為一個按序執行CPU不是太複雜,因此可以做得更小。如果Rise CPU具有較大的一級Cache和高時鐘頻率,那么,對於像K6-2那樣的亂序執行CPU來說,Rise CPU是一個兇狠的對手,它具有更好的浮點性能(雙FPU流水線),而且成本也更便宜。集成256KB二級Cache的mP6-Ⅱ或許將糾正這個錯誤,但它要達到令人滿意的時鐘頻率。
由於K7採用大容量緩衝,因此它能及時發布足夠多的非依賴性指令。大容量一級Cache、大容量緩衝和亂序執行,使K7的兩條FPU流水線比Rise mP6的兩條流水線更容易“餵飽”,效率更高。
歷史
從有序技術到亂序技術
直到大約1993年前,大多數CPU一次只能處理一條指令。那時,如果採用流水線設計,譬如摩托羅拉68040或者英特爾80486,那么可以同時在不同執行階段處理不同的指令。
到了1991年和1992年,出現了MIPS R4000、Alpha 21064和奔騰這些處理器,它們屬於面向通用市場的第一批“超標量”處理器:每個CPU周期可以處理(讀取、執行及退出)兩條指令。
後來,1995年出現了Alpha 21264,就有了每個周期能處理四條指令的第一個CPU,時鐘頻率達到300MHz,這個速度在當時十分驚人。Alpha21664在微處理器論壇上一亮相,就引來了台下觀眾的一片讚嘆,其中包括英特爾和IBM的設計者,更不用說Sun SPARC的設計者了。遺憾的是,Alpha最後沒有成功。
不管怎樣,這些廠商當時都採用了有條不紊的有序執行技術(In Order):程式指令在執行時,按順序讀取、執行及引退操作碼,每次執行兩條或者四條指令。
不同指令需要不同的執行資源,而且程式流程往往是這樣:執行需要等資源被釋放出來,或者指令依賴性(dependency)得到解決,才能繼續執行下一條指令。更糟的是,每出現新一代CPU,就需要重新編譯代碼,針對新CPU進行最佳化,不然讀/寫指令之間很可能會出現太多氣泡(bubble)即空閒時間,導致性能提升幅度不大,與競爭產品相比優勢也不大。
這時候,亂序執行(out of order execution)出場了。CPU硬體本身在讀取指令後重新安排指令的執行順序,根據現有資源情況,提供更多的執行單元、重新命名暫存器、處理好指令依賴性等等。所以,Pentium Pro和Alpha 21264之後的幾乎所有新款CPU都是採用無序執行技術。
在多數情況下,亂序執行可以加快晶片的運行速度,有時候加速明顯。21264的速度就是21164的將近兩倍,而Pentium Pro的速度也比奔騰快了一大截。經過重大改進的最新MIPS架構R10000也採用了亂序執行。
從安騰到Power6
亂序執行一直發展良好,直到後來英特爾推出了一種全新的技術。意義重大的安騰處理器擁有真正獨一無二的引擎,並使用了重要的顯式並行指令計算(EPIC)技術。先不說安騰處理器的超過100種的指令格式組合、龐大的慢速暫存器組等,它實際上重新採用了有序執行技術。所以,編譯器不得不完成所有工作,以確保執行單元始終處於忙碌狀態。除了浮點處理密集型套用外,要做到這一點並非易事,只要看看安騰系統的基準測試結果就會明白。
在後續的發展中,安騰架構的這一做法從來沒有變過。相反,Sun一度改用了富士通公司使用無序技術的SPARC64,而不是它自己的使用有序技術的UltraSPARC IV。其他的重要架構如x86則繼續採用無序技術,使用了Core 2和K10等新引擎,並進一步改進了這種方案,以便充分利用每MHz。
如果出於某種原因需要AIX,那么Power的重要性就不言而喻了。Power4和Power5都是高速、但複雜的採用亂序技術的RISC處理器,它結合了四路超標量執行機制和非常高的系統頻寬。不過,Power6卻回到了有序技術時代。原因何在?
一個答案就是,如果Power6的同步多執行緒效果好,那么對單一執行緒浪費執行資源就不用太擔心:在這種情況下,只要同步運行兩個執行緒就行。另外,為了進一步大幅提升性能,頻率提高一倍、二級高速快取增加一倍、縮短算術邏輯單元(ALU)的延遲等方面恐怕更關鍵。即使那樣,浮點處理部件還會保留有一定的亂序執行功能——這是在通用處理器的浮點運算部分首次引入十進制浮點處理單元(FPU)。“同步雙執行緒執行、負荷預測機制以及增強的數據和指令預取功能,提升了有序執行超標量核心的性能。”IBM是這么評價其新晶片的。
Power5+的五路無序執行被Power6的七路有序執行所取代,但即使如此,也有幾個地方需要注意:Power5+一個執行緒每個周期最多只有五條指令,而Power6一個執行緒增加了二條指令,這對計算型執行緒和記憶體搜尋型執行緒組合來說更有優勢。Power5+更關注內部資源,而Power6在大部分時候等待記憶體,所以每個周期兩次操作完全夠了。那么性能方面有什麼提升呢?看一下基準測試specfp2006,頻率為2.2GHz的Power5+在這方面能達到14.9,當然是在經過改動的Power5機器上實現的;而頻率為4.7GHz的Power6能達到22.3,時鐘頻率提高了一倍多,性能提升卻不到一半。
所以,Power6的7.9億個電晶體分布在尺寸比較大的341平方毫米上,超過了Barcelona/Agena的283平方毫米,僅比尺寸龐大的安騰小了一點,它確實大幅提升了性能,儘管沒有了亂序技術。雖然高速快取和記憶體頻寬隨著時鐘頻率的提高都水漲船高,但是仍然可以說,在時鐘頻率相同情況下,重新使用有序技術會在處理單執行緒任務時導致性能下降30%左右。
為此,不得不等待更新的Power6系統以及下一版本AIX在編譯器方面的進展,以減少這種性能損耗。不過對Power6來說,採用有序技術確實明顯提升了處理器的性能。安騰同樣採用了有序技術,但是至少到現在還沒有看到明顯的成效。x86恐怕再也不會出現有序技術。
不過,處理器技術的發展一日千里,Power6設計者不會坐井觀天。英特爾公司的3.6GHz的Harpertown”Penryn“和AMD公司3GHz Barcelona處理器就會陸續面世,都會對IBM Power6構成重大挑戰。IBM必須牢記: 對採用有序技術的這類處理器而言,隨著每一代後續CPU的問世,在編譯器方面需要做的工作更多。同時,並不是每個人都會有時間重新編譯自己的應用程式等。