上一講,我給你初步介紹了CPU的流水線技術。乍看起來,流水線技術是一個提高性能的靈丹妙藥。它經過把一條指令的操做切分紅更細的多個步驟,能夠避免CPU「浪費」。
每個細分的流水線步驟都很簡單,因此咱們的單個時鐘週期的時間就能夠設得更短。這也變相地讓CPU的主頻提高得很快。java
這一系列的優勢,也引出了現代桌面CPU的最後一場大戰,也就是Intel的Pentium 4和AMD的Athlon之間的競爭。在技術上,這場大戰Intel能夠說輸得很是完全,Pentium 4系列以及
後續Pentium D系列所使用的NetBurst架構被徹底拋棄,退出了歷史舞臺。可是在商業層面,Intel卻經過遠超過AMD的財力、本來就更大的市場份額、無所不用的競爭手段,以及最終
壯士斷腕般放棄整個NetBurst架構,最終依靠新的酷睿品牌打敗了AMD。服務器
在此以後,整個CPU領域競爭的焦點,再也不是Intel和AMD之間的桌面CPU之戰。在ARM架構經過智能手機的快速普及,後來居上,超越Intel以後,移動時代的CPU之戰,
變成了高通、華爲麒麟和三星之間的「三國演義」。架構
咱們在第3講裏講過,咱們其實並不能簡單地經過CPU的主頻,就來衡量CPU乃至計算機整機的性能。由於不一樣的CPU實際的體系架構和實現都不同。一樣的CPU主頻,
實際的性能可能差異很大。因此,在工業界,更好的衡量方式一般是,用SPEC這樣的跑分程序,從多個不一樣的實際應用場景,來衡量計算機的性能。性能
可是,跑分對於消費者來講仍是太複雜了。在Pentium 4的CPU面世以前,絕大部分消費者並非根據跑分結果來判斷CPU的性能的。你們判斷一個CPU的性能,
一般只看CPU的主頻。而CPU的廠商們也經過不停地提高主頻,把主頻當成技術競賽的核心指標。spa
Intel一貫在「主頻戰爭」中保持領先,可是到了世紀之交的1999年到2000年,狀況發生了變化。1999年,AMD發佈了基於K7架構的Athlon處理器,其綜合性能超越了當年的Pentium III。
2000年,在大部分CPU還在500~850MHz的頻率下運行的時候,AMD推出了第一代Athlon 1000處理器,成爲第一款1GHz主頻的消費級CPU。在2000年先後,AMD的CPU不但性能和主頻比Intel的要強,價格還每每只有Intel的2/3。設計
在巨大的外部壓力之下,Intel在2001年推出了新一代的NetBurst架構CPU,也就是Pentium 4和PentiumD。Pentium 4的CPU有個最大的特色,就是高主頻。
2000年的Athlon 1000的主頻在當時是最高的,1GHz,然而Pentium 4設計的目標最高主頻是10GHz。3d
爲了達到這個10GHz,Intel的工程師作出了一個重大的錯誤決策,就是在NetBurst架構上,使用超長的流水線。這個超長流水線有多長呢?咱們拿在Pentium 4以前和以後的CPU的數字作個比較,
你就知道了。blog
Pentium 4以前的Pentium III CPU,流水線的深度是11級,也就是一條指令最多會拆分紅11個更小的步驟來操做,而CPU同時也最多會執行11條指令的不一樣Stage。
隨着技術發展到今天,你平常用的手機ARM的CPU或者Intel i7服務器的CPU,流水線的深度是14級。生命週期
能夠看到,差很少20年過去了,經過技術進步,現代CPU仍是增長了一些流水線深度的。那2000年發佈的Pentium 4的流水線深度是多少呢?答案是20級,比Pentium III差很少多了一倍,
而到了代號爲Prescott的90納米工藝處理器Pentium 4,Intel更是把流水線深度增長到了31級。ip
要知道,增長流水線深度,在同主頻下,實際上是下降了CPU的性能。由於一個Pipeline Stage,就須要一個時鐘週期。那麼咱們把任務拆分紅31個階段,
就須要31個時鐘週期才能完成一個任務;而把任務拆分紅11個階段,就只須要11個時鐘週期就能完成任務。在這種狀況下,31個Stage的3GHz主頻的CPU,其實和11個
Stage的1GHz主頻的CPU,性能是差很少的。事實上,由於每一個Stage都須要有對應的Pipeline寄存器的開銷,這個時候,更深的流水線性能可能還會更差一些。
我在上一講也說過,流水線技術並不能縮短單條指令的 響應時間這個性能指標,可是能夠增長在運行不少條指令時候的 吞吐率。由於不一樣的指令,實際執行須要的時間是不一樣的。
咱們能夠看這樣一個例子。咱們順序執行這樣三條指令。
1. 一條整數的加法,須要200ps。
2. 一條整數的乘法,須要300ps。
3. 一條浮點數的乘法,須要600ps。
若是咱們是在單指令週期的CPU上運行,最複雜的指令是一條浮點數乘法,那就須要600ps。那這三條指令,都須要600ps。三條指令的執行時間,就須要1800ps。
若是咱們採用的是6級流水線CPU,每個Pipeline的Stage都只須要100ps。那麼,在這三個指令的執行過程當中,在指令1的第一個100ps的Stage結束以後,第二條指令就開始執行了。
在第二條指令的第一個100ps的Stage結束以後,第三條指令就開始執行了。這種狀況下,這三條指令順序執行所須要的總時間,就是800ps。那麼在1800ps內,使用流水線的CPU比單指令週期的CPU就能夠多執行一倍以上的指令數。雖然每一條指令從開始到結束拿到結果的時間並無變化,也就是響應時間沒有變化。可是一樣時間內,完成的指令數增多了,也就是吞吐率上升了。
那到這裏可能你就要問了,這樣看起來不是很好麼?Intel的CPU支持的指令集很大,咱們以前說過有2000多條指令。有些指令很簡單,執行也很快,好比無條件跳轉指令,
不須要經過ALU進行任何計算,只要更新一下PC寄存器裏面的內容就行了。而有些指令很複雜,好比浮點數的運算,須要進行指數位比較、對齊,而後對有效位進行移位,而後再進行計算。
二者的執行時間相差二三十倍也很正常。既然這樣,Pentium 4的超長流水線看起來很合理呀,爲何Pentium 4最終成爲Intel在技術架構層面的大失敗呢?
第一個,天然是咱們在第3講裏講過的功耗問題。提高流水線深度,必需要和提高CPU主頻同時進行。由於在單個Pipeline Stage可以執行的功能變簡單了,也就意味着單個時鐘週期內可以完成的事情變少了。因此,只有提高時鐘週期,CPU在指令的響應時間這個指標上才能保持和原來相同的性能。
同時,因爲流水線深度的增長,咱們須要的電路數量變多了,也就是咱們所使用的晶體管也就變多了。主頻的提高和晶體管數量的增長都使得咱們CPU的功耗變大了。
這個問題致使了Pentium 4在整個生命週期裏,都成爲了耗電和散熱的大戶。而Pentium 4是在2000~2004年做爲Intel的主打CPU出如今市場上的。這個時間段,正是筆記本電腦市場快速發展的時間。在筆記本電腦上,功耗和散熱比起臺式機是一個更嚴重的問題了。即便性能更好,別人的筆記本能夠用上2小時,你的只能用30分鐘,那誰也不愛買啊!
更況且,Pentium 4的性能還更差一些。 這個就要咱們說到第二點了,就是上面說的流水線技術帶來的性能提高,是一個理想狀況。在實際的程序執行中,並不必定可以作獲得。
還回到咱們剛纔舉的三條指令的例子。若是這三條指令,是下面這樣的三條代碼,會發生什麼狀況呢?
int a = 10 + 5; // 指令 1 int b = a * 2; // 指令 2 float c = b * 1.0f; // 指令 3
咱們會發現,指令2,不能在指令1的第一個Stage執行完成以後進行。由於指令2,依賴指令1的計算結果。一樣的,指令3也要依賴指令2的計算結果。這樣,即便咱們採用了流水線技術,
這三條指令執行完成的時間,也是 200 + 300 + 600 = 1100 ps,而不是以前說的 800ps。而若是指令1和2都是浮點數運算,須要600ps。那這個依賴關係會致使咱們須要的時間變成1800ps,
和單指令週期CPU所要花費的時間是同樣的。這個依賴問題,就是咱們在計算機組成裏面所說的 冒險(Hazard)問題。這裏咱們只列舉了在數據層面的依賴,也就是數據冒險。在實際應用中,還會有 結構冒險、控制冒險等其餘的依賴問題。
對應這些冒險問題,咱們也有在 亂序執行、 分支預測等相應的解決方案。咱們在後面的幾講裏面,會詳細講解對應的知識。
可是,咱們的流水線越長,這個冒險的問題就越難一解決。這是由於,同一時間同時在運行的指令太多了。若是咱們只有3級流水線,咱們能夠把後面沒有依賴關係的指令放到前面來執行。
這個就是咱們所說的亂序執行的技術。比方說,咱們能夠擴展一下上面的3行代碼,再加上幾行代碼。
int a = 10 + 5; // 指令 1 int b = a * 2; // 指令 2 float c = b * 1.0f; // 指令 3 int x = 10 + 5; // 指令 4 int y = a * 2; // 指令 5 float z = b * 1.0f; // 指令 6 int o = 10 + 5; // 指令 7 int p = a * 2; // 指令 8 float q = b * 1.0f; // 指令 9
咱們能夠不先執行一、二、3這三條指令,而是在流水線裏,先執行一、四、7三條指令。這三條指令之間是沒有依賴關係的。而後再執行二、五、8以及三、六、9。這樣,
咱們又可以充分利用CPU的計算能力了。可是,若是咱們有20級流水線,意味着咱們要確保這20條指令之間沒有依賴關係。這個挑戰一會兒就變大了不少。畢竟咱們平時撰寫程序,
一般先後的代碼都是有必定的依賴關係的,幾十條沒有依賴關係的指令可很差找。這也是爲何,超長流水線的執行效率發而下降了的一個重要緣由。
相信到這裏,你對CPU的流水線技術,有了一個更加深刻的瞭解。你會發現,流水線技術和其餘技術同樣,都講究一個「折衷」(Trade-Off)。一個合理的流水線深度,
會提高咱們CPU執行計算機指令的吞吐率。咱們通常用IPC(Instruction Per Cycle)來衡量CPU執行指令的效率。
IPC呢,其實就是咱們以前在第3講講的CPI(Cycle Per Instruction)的倒數。也就是說, IPC = 3對應着CPI= 0.33。Pentium 4和Pentium D的IPC都遠低於本身上一代的Pentium III以及競爭對手AMD的Athlon CPU。過深的流水線,不只不能提高計算機指令的吞吐率,更會加大計算的功耗和散熱問題。Intel本身在筆記本電腦市場,也很快放棄了Pentium 4,而是主推了使用Pentium III架構的圖拉丁CPU。
而流水線帶來的吞吐率提高,只是一個理想狀況下的理論值。在實踐的應用過程當中,還須要解決指令之間的依賴問題。這個使得咱們的流水線,特別是超長的流水線的執行效率變得很低。要想解決好 冒險的依賴關係問題,咱們須要引入亂序執行、分支預測等技術,這也是我在後面幾講裏面要詳細講解的內容。