什麼是Speculative Execution?為什麼要有它?
預測執行(Speculative Execution)技術,它和multiple branch prediction(多分支預測)、 data flow analysis(數據流分析)三項技術,一起構成了out-of-order execution (亂序執行)的技術基石。它是現代高性能計算的基礎技術之一,廣泛被應用在高端ARM CPU(包括各種定製ARM晶元:高通、Apple、etc), IBM的Power 系列CPU,SPARC和X86 CPU中。Intel早在奔騰II就開始引入了它,它最近的曝光度很高,對它的功能卻語焉不詳。我們今天就從技術的角度來了解一下它的前世今生。
順序執行與亂序執行
在正式開始之前,為了方便描述,我們這裡引入一個簡化版的計算機微架構模型:
計算機的一條指令的執行,簡單來說是沿著粉紅色箭頭來運作。簡單來說分為4步,即
- Fetch:指令取出。
- Decode:指令解碼。
- Execute:指令執行。
- Write:結果寫回。
在386時代,指令是順序執行的。為了簡化起見,我們假設每個步驟在一個時鐘周期內可以完成。在那時,指令執行是這樣的:
指令1(Instr1)執行完畢後,指令2(Instr2)才能執行,以此類推。我們可以看出在9個時鐘周期內,指令執行了2條多一點。
在486後,引入了Pipeline(流水線)技術,將一條指令執行的四個步驟分別解放出來,就像流水線上的工人從1個全能高手變成了四個普通工人,每個普通工人只會幹自己的事情,它弄完後就會將結果傳遞給下一個。這樣指令執行就變成了:
我們直觀的可以看出來:一條指令還是需要4個時鐘周期,但在9個時鐘周期內完成了整個6條指令,吞吐量提高了將近3倍!這就是流水線的魅力所在,專人干專事,效率成倍增加,無怪乎福特發明的流水線迅速風靡世界。富士康的工人天天干一件事,會有苦悶和煩惱,但晶體管不會抱怨,把流水線引入CPU微架構真是個絕妙的主意!
這時的指令流水還是順序執行(in-order execution),大家規規矩矩排隊在流水線上運行,井然有序。但這種理想情況在現實世界裡面卻有諸多挑戰:流水線空轉問題和分支問題。
簡化過程中每一步都只要一個時鐘周期,這在實際情況中是很難滿足的,很多指令執行周期不一,有些需要很多周期,而在此時,整個流水線其他的人都被堵塞了(in Stall):
可以看到9個時鐘周期內只完整的執行了4條指令,很多執行元件都是處在stall的狀態,嚴重拉低了流水線的吞吐量。
我們都知道,程序是有分支的,下一條指令去哪裡執行在上一條指令還沒有結束之前有時候是不知道的。我們將指令1(instr1)想像成if-then-else的指令(當然它不是一條指令能夠涵蓋,為了簡化描述權作此安排),在它的Excute引擎執行完畢前,下一步去哪裡Fetch code都無從判斷,流水線被徹底被堵塞了。
流水線的這些問題部分可以通過加深流水的方式規避,但仍然問題多多,遠遠達不到理想最優情況。那怎麼解決呢?
在奔騰II後,Intel在CPU中引入了亂序執行(out-of-order execution,OOOE)。整體執行方式從程序流驅動變成了數據流驅動:只要部件的輸入條件滿足,就可以開始執行:
調整後的執行結果我們可以看出,因為指令3並不需要前面的指令2的輸入,它在指令2之前就得到了執行,而指令2因為依賴於指令1的輸出作為輸入,反倒落後於指令3,這就是所謂的亂序。從整個流水線吞吐量來看,吞吐量恢復到了理想最優情況。
而在另一方面:分支問題。分支預測技術加上我們今天的主角:預測執行(Speculative Execution)技術,在這裡大放光彩。分支預測會判斷哪條分支最可能被執行,預測執行會直接Fetch那裡的指令,並立即執行。這樣等分支結果出來後,實際上那裡的早就開始執行了,流水線上總是滿負荷運轉的,一個晶體管都不能偷懶!
有同學要問了,分支預測錯誤了怎麼辦呢?是啊,U非聖賢,豈能無措,錯了就改嘛。前面執行的都白瞎了,重新Fetch來執行,反正晶體管又不會抱怨你浪費它感情。值得欣慰的是,現代CPU的分支預測引擎十分的精準合高效,預測成功率高於95%!
結論
在前文:
老狼:為什麼CPU的頻率止步於4G?我們觸到頻率天花板了嗎?我們說過,CPU的主頻高並不能代表高性能,主頻高但在那裡空轉也不能解決實際問題。流水線、預測執行等等技術,都是為了讓CPU裡面的所有器件忙碌起來。分支檢測和執行技術也是CPU代季更新中極力改善的部分,我們會在後文中詳細介紹分支檢測,以及它為為什麼能夠達到令人驚訝的高於95%的預測準確率。如有可能還會介紹雙發射和多發射技術:
其他CPU硬體文章:
老狼:CPU製造的那些事之一:i7和i5其實是孿生兄弟!?老狼:CPU製造的那些事之二:Die的大小和良品率老狼:為什麼晶圓都是圓的不是方的?老狼:為什麼"電路"要鋪滿整個晶圓?老狼:CPU能用多久?會不會因為老化而變慢?老狼:為什麼CPU越來越多地採用硅脂而不是焊錫散熱?老狼:為什麼Intel CPU的Die越來越小了?老狼:破繭化蝶,從Ring Bus到Mesh網路,CPU片內匯流排的進化之路老狼:450mm的晶圓在哪裡?老狼:什麼是TLB和PCID?為什麼要有PCID?為什麼Linux現在才開始使用它?更多CPU電源管理的文章:
老狼:CPU省電的秘密(一):EIST老狼:CPU省電的秘密(二):CStates老狼:睿頻:榨乾CPU所有的潛力(CPU電源管理系列番外篇)歡迎大家關注本專欄和用微信掃描下方二維碼加入微信公眾號"UEFIBlog",在那裡有最新的文章。同時歡迎大家給本專欄和公眾號投稿!
推薦閱讀:
※未來usb會取代sata和pcie介面嗎?
※「獨輪平衡車之父」再出新品,單手拎起,像掛包一樣輕便!
※為什麼不能用分散式磁碟的方式來避免磁碟 IO 吃緊?
※做 APP 比做硬體還難?Misfit 設計師談軟體交互思路
※辦公用機,win7系統(足夠性價比的話新平台也可以)帶顯示器2000-3000預算。?