到今天爲止,專欄已通過半了。過去的20多講裏,我給你講的內容,不少都是圍繞着怎麼提高CPU的性能這個問題展開的。咱們先回顧一下第4講,不知道你是否還記得這個公式:bash
程序的CPU執行時間 = 指令數 × CPI × Clock Cycle Time
這個公式裏,有一個叫CPI的指標。咱們知道,CPI的倒數,又叫做IPC(Instruction Per Clock),也就是一個時鐘週期裏面可以執行的指令數,表明了CPU的吞吐率。那麼,這個指標,放在咱們前面幾節反覆優化流
水線架構的CPU裏,能達到多少呢?服務器
答案是,最佳狀況下,IPC也只能到1。由於不管作了哪些流水線層面的優化,即便作到了指令執行層面的亂架構
這說明,不管指令後續能優化得多好,一個時鐘週期也只能執行完這樣一條指令,CPI只能是1。可是,咱們如今用的Intel CPU或者ARM的CPU,通常的CPI都能作到2以上,這是怎麼作到的呢?併發
今天,咱們就一塊兒來看看,現代CPU都使用了什麼「黑科技」。性能
以前講CPU的硬件組成的時候,咱們把全部算術和邏輯運算都抽象出來,變成了一個ALU這樣的「黑盒子」。你應該還記得第13講到第16講,關於加法器、乘法器、乃至浮點數計算的部分,其實整數的計算和
浮點數的計算過程差別仍是不小的。實際上,整數和浮點數計算的電路,在CPU層面也是分開的。優化
一直到80386,咱們的CPU都是沒有專門的浮點數計算的電路的。當時的浮點數計算,都是用軟件進行模擬的。因此,在80386時代,Intel給386配了單獨的387芯片,專門用來作浮點數運算。那個時候,
你買386芯片的話,會有386sx和386dx這兩種芯片能夠選擇。386dx就是帶了387浮點數計算芯片的,而sx就是不帶浮點數計算芯片的。spa
其實,咱們如今用的Intel CPU芯片也是同樣的。雖然浮點數計算已經變成CPU裏的一部分,但並非全部計算功能都在一個ALU裏面,真實的狀況是,咱們會有多個ALU。這也是爲何,在第24講講亂序執行的時
候,你會看到,其實指令的執行階段,是由不少個功能單元(FU)並行(Parallel)進行的。scala
不過,在指令亂序執行的過程當中,咱們的取指令(IF)和指令譯碼(ID)部分並非並行進行的。設計
既然指令的執行層面能夠並行進行,爲何取指令和指令譯碼不行呢?若是想要實現並行,該怎麼辦呢?3d
其實只要咱們把取指令和指令譯碼,也同樣經過增長硬件的方式,並行進行就行了。咱們能夠一次性從內存裏面取出多條指令,而後分發給多個並行的指令譯碼器,進行譯碼,而後對應交給不一樣的功能單元去處理。
這樣,咱們在一個時鐘週期裏,可以完成的指令就不僅一條了。IPC也就能作到大於1了。
這種CPU設計,咱們叫做 多發射(Mulitple Issue)和 超標量(Superscalar)。
什麼叫多發射呢?這個詞聽起來很抽象,其實它意思就是說,咱們同一個時間,可能會同時把多條指令發射(Issue)到不一樣的譯碼器或者後續處理的流水線中去。
在超標量的CPU裏面,有不少條並行的流水線,而不是隻有一條流水線。「超標量「這個詞是說,原本咱們在一個時鐘週期裏面,只能執行一個標量(Scalar)的運算。在多發射的狀況下,
咱們就可以超越這個限制,同時進行屢次計算。
你能夠看我畫的這個超標量設計的流水線示意圖。仔細看,你應該能看到一個有意思的現象,每個功能單元的流水線的長度是不一樣的。事實上,不一樣的功能單元的流水線長度原本就不同。咱們平時所說的14級
流水線,指的一般是進行整數計算指令的流水線長度。若是是浮點數運算,實際的流水線長度則會更長一些。
不管是以前幾講裏講的亂序執行,仍是如今更進一步的超標量技術,在實際的硬件層面,其實實施起來都挺麻煩的。這是由於,在亂序執行和超標量的體系裏面,咱們的CPU要解決依賴衝突的問題。這也就是前面幾
講咱們講的冒險問題。
CPU須要在指令執行以前,去判斷指令之間是否有依賴關係。若是有對應的依賴關係,指令就不能分發到執行階段。由於這樣,上面咱們所說的超標量CPU的多發射功能,又被稱爲 動態多發射處理器。這些對於依賴
關係的檢測,都會使得咱們的CPU電路變得更加複雜。
因而,計算機科學家和工程師們就又有了一個大膽的想法。咱們能不能不把分析和解決依賴關係的事情,放在硬件裏面,而是放到軟件裏面來幹呢?
若是你還記得的話,我在第4講也講過,要想優化CPU的執行時間,關鍵就是拆解這個公式:
程序的CPU執行時間 = 指令數 × CPI × Clock Cycle Time
當時咱們說過,這個公式裏面,咱們能夠經過改進編譯器來優化指令數這個指標。那接下來,咱們就來看看一個很是大膽的CPU設計想法,叫做 超長指令字設計(Very Long Instruction Word,VLIW)。這個設計
呢,不只想讓編譯器來優化指令數,還想直接經過編譯器,來優化CPI。
圍繞着這個設計的,是Intel一個著名的「史詩級」失敗,也就是著名的IA-64架構的安騰(Itanium)處理器。只不過,這一次,責任不全在Intel,還要拉上能夠稱之爲硅谷起源的另外一家公司,也就是惠普。
之因此稱爲「史詩」級失敗,這個說法來源於惠普最先給這個架構取的名字, 顯式併發指令運算(ExplicitlyParallel Instruction Computer),這個名字的縮寫 EPIC,正好是「史詩」的意思。
好巧不巧,安騰處理器和和我以前給你介紹過的Pentium 4同樣,在市場上是一個失敗的產品。在經歷了12年之久的設計研發以後,安騰一代只賣出了幾千套。而安騰二代,在從2002年開始反覆掙扎了16年以後,
最終在2018年被Intel宣告放棄,退出了市場。自此,世上再也沒有這個「史詩」服務器了。
那麼,咱們就來看看,這個超長指令字的安騰處理器是怎麼回事兒。
在亂序執行和超標量的CPU架構裏,指令的先後依賴關係,是由CPU內部的硬件電路來檢測的。而到了 超長指令字的架構裏面,這個工做交給了編譯器這個軟件。
我從專欄第5講開始,就給你看了很多C代碼到彙編代碼和機器代碼的對照。編譯器在這個過程當中,其實也可以知道先後數據的依賴。因而,咱們可讓編譯器把沒有依賴關係的代碼位置進行交換。而後,再把多條
連續的指令打包成一個指令包。安騰的CPU就是把3條指令變成一個指令包。
CPU在運行的時候,再也不是取一條指令,而是取出一個指令包。而後,譯碼解析整個指令包,解析出3條指令直接並行運行。能夠看到,使用 超長指令字架構的CPU,一樣是採用流水線架構的。也就是說,一組
(Group)指令,仍然要經歷多個時鐘週期。一樣的,下一組指令並非等上一組指令執行完成以後再執行,而是在上一組指令的指令譯碼階段,就開始取指令了。
值得注意的一點是,流水線停頓這件事情在 超長指令字裏面,不少時候也是由編譯器來作的。除了停下整個處理器流水線, 超長指令字的CPU不能在某個時鐘週期停頓一下,等待前面依賴的操做執行完成。編譯器需
要在適當的位置插入NOP操做,直接在編譯出來的機器碼裏面,就把流水線停頓這個事情在軟件層面就安排穩當。
雖然安騰的設想很美好,Intel也曾經但願可以讓安騰架構成爲替代x86的新一代架構,可是最終安騰仍是在前先後後折騰將近30年後失敗了。2018年,Intel宣告安騰9500會在2021年中止供貨。
安騰失敗的緣由有不少,其中有一個重要的緣由就是「向前兼容」。
一方面,安騰處理器的指令集和x86是不一樣的。這就意味着,原來x86上的全部程序是沒有辦法在安騰上運行的,而須要經過編譯器從新編譯才行。
另外一方面,安騰處理器的VLIW架構決定了,若是安騰須要提高並行度,就須要增長一個指令包裏包含的指令數量,比方說從3個變成6個。一旦這麼作了,雖然一樣是VLIW架構,一樣指令集的安騰CPU,程序也需
要從新編譯。由於原來編譯器判斷的依賴關係是在3個指令以及由3個指令組成的指令包之間,如今要變成6個指令和6個指令組成的指令包。編譯器須要從新編譯,交換指令順序以及NOP操做,才能知足條件。甚至,咱們須要從新來寫編譯器,才能讓程序在新的CPU上跑起來。
因而,安騰就變成了一個既不容易向前兼容,又不容易向後兼容的CPU。那麼,它的失敗也就不足爲奇了。能夠看到,技術思路上的先進想法,在實際的業界應用上會遇到更多具體的實踐考驗。不管是指令集向前兼
容性,仍是對應CPU將來的擴展,在設計的時候,都須要更多地去考慮實踐因素。
這一講裏,我和你一塊兒向CPU的性能發起了一個新的挑戰:讓CPU的吞吐率,也就是IPC可以超過1。
我先是爲你介紹了超標量,也就是Superscalar這個方法。超標量可讓CPU不只在指令執行階段是並行的,在取指令和指令譯碼的時候,也是並行的。經過超標量技術,可使得你所使用的CPU的IPC超過1。
在Intel的x86的CPU裏,從Pentium時代,第一次開始引入超標量技術,整個CPU的性能上了一個臺階。對應的技術,一直沿用到了如今。超標量技術和你以前看到的其餘流水線技術同樣,依賴於在硬件層面,可以
檢測到對應的指令的前後依賴關係,解決「冒險」問題。因此,它也使得CPU的電路變得更復雜了。
由於這些複雜性,惠普和Intel又共同推出了著名的安騰處理器。經過在編譯器層面,直接分析出指令的先後依賴關係。因而,硬件在代碼編譯以後,就能夠直接拿到調換好前後順序的指令。而且這些指令中,能夠並
行執行的部分,會打包在一塊兒組成一個指令包。安騰處理器在取指令和指令譯碼的時候,拿到的再也不是單個指令,而是這樣一個指令包。而且在指令執行階段,能夠並行執行指令包裏全部的指令。
雖然看起來,VLIW在技術層面更具備顛覆性,不只僅只是一個硬件層面的改造,並且利用了軟件層面的編譯器,來組合解決提高CPU指令吞吐率的問題。然而,最終VLIW卻沒有獲得市場和業界的承認。
惠普和Intel強強聯合開發的安騰處理器命運多舛。從1989開始研發,直到2001年才發佈了第一代安騰處理器。然而12年的開發過程後,第一代安騰處理器最終只賣出了幾千套。而2002年發佈的安騰2處理器,也沒
能拯救本身的命運。最終在2018年,Intel宣佈安騰退出市場。自此以後,市面上再沒有可以大規模商用的VLIW架構的處理器了。