為什麼CPU流水線設計的級越長,完成一條指令的速度就越快?
百度百科和一些文章中都談到,超標量是通過內置多條流水線來提高速度,實質是以空間換取時間。——這個很容易理解,提升並行效率嘛。
在提到超流水線的時候,文中說是通過細化流水、提高主頻,使得在一個機器周期內完成一個甚至更多操作。——請問提高主頻和流水線有什麼樣的關係?——文中還說「實質是以時間換取空間」,這一點我是不能理解的,為什麼說是以時間換取空間,空間指的不就是CPU的核心面積嗎,而且用時間來換取這個空間豈不是本末倒置,而且這個邏輯我也沒看出是時間換取空間。另外,對流水線的講解還談到,流水線設計的步(級)越長,完成一條指令的速度就越快。——能否簡單談談為什麼會有這樣的效果。——一條指令是否需要走完整個流水線才算完成。最後一個問題,擴展指令集中指令的條數是否受到了製造工藝的限制,如果沒有的話,為什麼不集成更多的擴展指令集呢。而且我看完CPU的大致概述後,對指令的工作原理仍然不了解。指令是否就是指指令集中的指令,他們與終端的軟體程序有什麼關係?軟體程序的運行是否全部轉化為這些指令,隨後讓這些指令到處理器的流水線中進行執行?針對第二段的補充:http://blog.csdn.net/do2jiang/article/details/4545889針對第三段的補充:超流水線_百度百科
流水線是將組合邏輯分割成多個小塊,因為每段的關鍵路徑變短了,所以能提高系統主頻。同時能讓任務以類似並行方式處理,提高硬體模塊的利用率,提高系統頻率,提高吞吐量(throughput)。
為什麼CPU流水線設計的級越長,完成一條指令的速度就越快?
答:流水線級越長,一條指令執行速度反而更慢了,因為要插入寄存器分割組合邏輯,而寄存器讀寫也需要時間。流水線提高的是系統吞吐量,也就是單位時間內處理的指令條數。
那為什麼一條指令執行速度更慢,而單位時間內處理的指令條數增多呢? 因為 流水線能同時處理多條指令,類似並行形式。如下圖,五條指令在同時處理。流水線 「實質是以時間換取空間」?
答:不是。因為新插入寄存器需要消耗空間(面積),算是 以空間換取時間(吞吐量)。
在這個問題下詳細解釋了流水線,及產生的冒險(hazards)的解析。 是否有既用到 狀態機 又用到 流水線 的module? - young cc 的回答理想情況下流水線越長,cpu時鐘周期可以做得越短(也就是頻率越高,當然不能無限高)
相對非流水的結構而言,流水線可以提高指令執行的並行度。在理想情況下,流水線級數越多,可同時流水執行的指令數越多,正比增長。這就是推出該問題的理論基礎。並行度越大,在宏觀上看其實就等效於每一條指令的執行速度都變快了。但現實不是這樣理想的。流水的時候,會遇見各種冒險機制(某硬體不支持同時鐘周期被多個資源訪問,數據依賴或邏輯關係不被滿足的情況,跳轉指令等)。造成流水設計的困難。所以在理想情況並有上限的前提下,這句話是對的。
但考慮到太長的流水線可能造成的冒險機制會變得更複雜,所以「CPU流水線設計的級越長,完成一條指令的速度就越快」不過說的是理想或者近似理想的情況罷。
至於超流水線的時間換取空間……
時間減少了(cycles per instruction減少),空間增加了(增加了好多pipline寄存器還有其他邏輯)。。個人感覺這樣理解就行了吧。不過根據樓主的「用時間來換取這個空間豈不是本末倒置」看出樓主有個誤區:時間的減少的確重要,但是不是唯一的考慮。空間的增大會大約以平方的關係增加晶元成本,所以有時候為了空間應該要犧牲掉一些性能。擴展指令集中指令的條數當然是受制約的。指令越多,片上的邏輯越複雜,而RISC處理器的成功已經說明問題了,它的流水線簡單高效,現在x86也把CISC指令轉換成RISC指令在內部計算了。
指令是否就是指指令集中的指令?是。他們與終端的軟體程序有什麼關係?軟體其實就是一坨指令,它是從高級語言(c++之類)經過編譯鏈接等操作得到的。軟體程序的運行是否全部轉化為這些指令,隨後讓這些指令到處理器的流水線中進行執行?額……差不多吧……軟體除了指令還有數據。期待補充通俗一點的說法是,比如作為富二代的你幫你爹經營飯店,為了展示你不坑爹的管理能力,你決定改善廚房效率:以前洗菜(取指令)切菜(取數據)做菜(運算),裝盤(存數據)都是同一個大廚,他切菜的時候就不能洗菜,也不能做菜;然後你把切菜洗菜做菜裝盤分成4個人完成,這樣某人切菜的同時另一個人也在洗菜。雖說做某一道特定菜的時間會變長(人員之間要溝通嘛),但是總體來說速度是變快了。如果你把這件事情做到極致呢?比如切菜都分成100個人,第一個人切第一刀,第二個人切第二刀,諸如此類,你可以想像結果是整個過程變的更慢。這就是本質上來說並非越長越快的道理。然後你的跟班提議,我們雇個1000個廚師來做菜好了。但是你發現你沒那麼大的廚房(晶元大小限制,生產工藝,良率等等),你也沒那麼多錢付工資(電能,散熱等等)。所以這個也不靠譜。當然實際上問題更複雜。比如客人點個佛跳牆,切火腿準備菜的大哥很快就搞定了,而準備高湯的兄弟還在慢慢熬湯呢。這時候整個流水線就被迫停下來等熬湯。然後有人就提議,我們把很慢菜單獨分組讓那些弟兄慢慢玩不要影響流水線速度。然後你又發現,你有時候連炒花生糟毛豆還沒上,就把大龍蝦給端上去了(程序的數據間是有依賴的,比如a=b+c; d=a+1; 這裡第二個指令必須在第一個有結果之後才能運算)。。。於是你又找了個人來調度:「冷盤還沒好呢,熱菜的兄弟先等等。」 有了簡單調度之後你發現有些廚師弟兄有時候閑得蛋疼。於是你又找了個學數學的博士來做廚房調度(各種奇怪的流水線調度演算法)。。。這麼折騰之後你終於長嘆一聲,不坑爹真心不好搞,富二代容易么。原本以為工序多分幾個步驟,做更長的流水線就能更快,哪想到這麼噁心啊。
從來沒聽說過流水線級數越長,完成一條指令的速度就越快的說法。
不管是什麼情況,採用流水線結構,處理一條指令的速度一定會比比不用流水線的要慢。不過,如果是計算一段時間內完成指令的條數的話,流水線能處理的指令就會比不用流水線的處理機處理得多。
原因也很簡單,流水線處理機裡面,各個完成不同功能的部件都復用了,都在並行的工作。像上圖的例子,完成一條指令需要五個步驟,每一個步驟一個節拍。那麼,假設經過了10個節拍(從流水線空開始計算),那麼非流水線只能處理兩條,而流水線機,在第五個節拍的時候完成一條,第六個節拍的時候又完成一條,所以一共能完成六條指令。在這個意義下,流水線處理機比非流水線的處理機快很多。一句話回答,你這個說法是錯的.... 流水線長頂多就是有利於提升主頻,而事實證明超長流水線帶來的性能提升很有限。
流水線越長並不表示指令執行就越快。流水線最慢的那一級的時延越低,表示可以有更多的指令同時被執行,也就是並發度會越高。流水線長不表示什麼,反而應該越短越好,關鍵是最慢那一級的時延。如果考察單個指令,進流水到出流水的時間是一樣的。但是程序是由多個指令構成的,將指令並行之後,從程序的視角來看,整體執行變快了,此時可以用整個流水線耗時除以並行度,得出每條指令的「執行時間」,看上去加快了。但是這個執行時間是個假的,實際上每條指令從開始到結束並沒有變化。
本質上說,影響數字電路時鐘速度的短板是關鍵路徑的延時(延遲最長的那個路徑),關鍵延時主要是組合邏輯造成的,比如verilog寫個c&<=a+b;可以綜合出一個組合邏輯加法器,但是隨著位寬的增加,那些與或非們的級聯層數就越多,關鍵延時就越大,整個可以運行的時鐘頻率就下降了,解決此類問題就是在組合邏輯之間插入流水線寄存器,也就是觸發器,保留一些中間結果,將組合邏輯「打散」,相鄰兩個觸發器之前的組合邏輯規模縮小,延時變小,整個系統可以跑的時鐘組度就快了,但是插入觸發器,就會使得矽片面積增加,也就是你問題說的以空間換取時間。這就是流水線技術。
流水線長度跟速度沒有直接關係,一般來說流水線越長,整體性能越差。
參考intel的官方文檔:
Intel速 64 and IA-32 Architectures Optimization Reference Manual這裡記錄著每條指令需要的時鐘周期,在每條指令時鐘周期確定的情況下,主頻越高,性能越好。
而有些指令只消耗一個時鐘,這種情況下流水線是沒有意義的,一個指令至少需要一個時鐘的時間去執行(嚴格說不太準確,新的intel CPU已經能做到0.5個周期執行一個指令了)主頻不等於每秒執行的指令數,但每秒能執行的指令數通常不能超過主頻。
在沒有流水線的情況下,假設所有指令都需要2個周期,那麼100Mhz的CPU每秒能執行50M個指令,而有流水的情況下,就能執行100M個指令。實際情況是多數執行要消耗超過2個周期(多的需要十幾個周期),所以100Mhz的CPU每秒能執行的指令數一般小於30M個,這種情況下,流水線越長,可並發的指令越多,那麼每秒能執行的指令數就越高,但永遠不能超過100Mhz這個主頻上限。
「實質是以時間換取空間」這句話我不太理解,但我猜空間應該不是指晶元面積。流水線越長,單條指令執行越慢,只是從並發的角度上說整體性能更高而已,一條指令需要5個周期,如果用流水線設計,則是5條指令消耗9個周期,只是看上去平均每條指令更快了,實際單條指令速度仍然不改變。新一代intel CPU已經不重視主頻和流水線的性能提高,而是提高單個指令的周期,所以從發展局勢上看,縮短流水線是技術的發展方向,拉長流水線只是過去技術不過關的時候的補充手段。
擴展指令集有製造工藝的限制,但不明顯,實際上集成更多擴展指令的想法是錯誤的。硬體指令都是編譯器編譯生成的,過多的擴展指令對於編譯器來說是個負擔,用簡單的指令做複雜的事情是編譯器的主流思想,也方便編譯器優化。現在各種架構的CPU指令擴展的都不少,但實際上軟體用的上的並不多。並且擴展指令沒有統一標準,可能在這台電腦上可用,換個電腦就不能用了,對於軟體設計的負擔就更大了,軟體設計更重視通用性。
最後,指令確實就是指指令集的那些指令,但是,你確認你真的了解CPU指令集嗎?CPU指令集是非常龐大的,手冊就上百頁。終端軟體確實也執行的就是這些指令,不管任何軟體,最終執行的都是機器指令(也就是你前面說的那種指令)
------------------------------------------------------------
看到很多爭論,那我用數據說話:
以下是一段PPC彙編:
_text:00000028 loc_28:
_text:00000028 cmpw %r3, %r0_text:0000002C bge loc_38
_text:00000030 addi %r3, %r3, 1_text:00000034 b loc_28實際C語言源碼是:
while(i &< v)
i++;在主頻為264Mhz的主板上,執行264M次,耗時約2670ms,實際一共執行了4*264M條指令,但實際消耗時間小於4秒,這個CPU有流水線,單核,型號是SBC8349,其中所有指令都至少需要一個周期,由於流水線的作用,看上去最終的結果是平均一個指令小於一個周期。ARM上有類似的結果,MIPS的板子找不到了,x86的我就不實驗了。
因為CPU和板子都是公司生產的,我專門問過,單個指令消耗不會小於1個周期,至於為什麼實際情況是小於,看wiki的這裡,有數學證明,流水線 (計算機)這個說法是錯誤的,而且還有前車之鑒。
著名的奔騰四,就是因為流水線過長,而落得個高頻低能的名聲。而且,拜糟糕的奔騰四所賜, AMD 在那個時代全面超越了 intel,這也是歷史上唯一的一小段 AMD 主營 CPU 在性能上完全超越 intel 主營 CPU 的年代。(這個年代持續得不長,就因為酷睿的出世而結束了。)
流水線過長對性能沒有幫助,只對提升主頻有幫助。長流水線能夠使你提升主頻更容易,所以容易造就高頻低能的晶元。
流水線是一般CS的同志或者做架構的人考慮比較多,然而這個問題的本質需要從數字後端的角度解釋:
流水線的引入提高的只是得系統的Throughput (吞吐率),即全速工作時候,單位時間內執行的指令數目增加了。但是如果僅看單條指令的絕對執行時間,這個量必然是增加的:因為 每多插入一級D flip-flop必然引入sequencing overhead(中文翻譯時序支出?我不知道我翻譯的對不對)。
具體來說,舉例子:
a沒流水線的時候,時鐘周期最小Tclk1&>=Tsetup+Tpd_critical ,每條指令一個時鐘周期執行完。其中Tsetup為觸發器的建立時間,Tpd_critical為關鍵路徑的最壞傳輸延遲。
b假設我採用級流水線,每一級組合邏輯的critcal delay均分 (是之前critical delay的1/3, 即Tpd_critical/3) ,新時鐘周期 Tclk2&>=Tsetup+Tpd_critical/3 ,每條指令要花三個時鐘周期執行完。當全速執行的時候,每個時鐘周期結束都有一條指令處理完,而新時鐘周期Tclk2明顯比之前沒流水線時候Tclk1小了,所以我們說吞吐率提高了。如果你只關注一條指令的實際執行時間(注意每條指令花三個時鐘周期完成):
3* Tsetup+Tpd_critical/3)= 3*Tsetup + Tpd_critical 你發現絕對時間來看,單條指令執行時間反而比沒流水線時候大了。多出來2個Tsetup就是所謂的sequencing overhead。注意實際情況可能比上述複雜,但是上述例子用來解釋本問題是足夠的了。
接下來還要注意一點:我們說吞吐率提高了,只是在「全速工作」的情況下。前面還有人作答提到P4的高頻低能問題。其實這個問題又得從流水線的本質來解釋。比如,如果由於某種原因processor就是沒法全速工作怎麼辦?這種情況還不少見:比如我們有指令1指令2指令3,其中 指令2的執行依賴於指令1的結果,然後指令3的執行又依賴於指令2的結果。當出現這種情況時候,必須等前面一條指令完全執行完畢,產生結果之後,下條指令才能開始執行。當這種情況出現過多的時候,流水線的存在不僅沒有多大幫助,反而因為多出來的sequencing overhead讓性能降低。
總之,很多關於計算機硬體的問題如果想要究其本質,需要離開你平時所工作的level of abstraction(抽象層級)到更加底層的層次中去。流水線的級數增加方便於提高主頻,因為木板效應嘛。最短的那個木板決定裝水量,同理、最耗時間的流水線級就決定了周期的最小長度。說白了就是,如果流水線加長,那就有機會讓最耗時的那個流水線級所花時間降低。
最後一段的那段假設性的描述完全正確。
樓主沒做過軟體調試么?如果完全沒做過計算機編程,恐怕就算完全理解了這些知識,心裡也很不安穩吧……VS調試C/C++的時候有一個反彙編窗口,你在那裡面調試就可以看到CPU逐條的在執行指令了。也可以下載一個OllyIce/OllyDbg來運行一個程序試試。「實質是以時間換取空間」這個我很不理解,懷疑是出錯了。樓主能說下是在哪看到的么,我去找找。
為什麼不擴展指令集,這個容易理解,因為指令編碼的空間有限啊……不過編碼空間的限制可以靠增加處理器的模式來實現,就像現在Intel的EM64T、AMD的x86-64都是增加了處理器模式。我看ARM的32位處理器也總是支持多個模式的。另外就算你擴展了處理器的指令集,達到一種兼容的效果,那舊代碼還是享受不到新增指令帶來的好處嘛。快:指的是吞吐量 Throughput慢:指的是延遲 Latency流水線長,一般來講,頻率可以更高,所以吞吐量會更大,但延遲很有可能會提高
簡單粗暴得地說,假如如果只有一級流水線,每條指令需要10周期的話,現在假如能切成10級 每級能單獨運行的話,那麼理想情況下,每條指令只需要一個周期。換句話說,同一時刻,有10條指令同時在運行。為什麼呢?因為沒有流水線的話 執行一天指令的時間內 每個計算資源有十分之九的時間是閑著的
比如原先CPU有8級流水線,當一條指令到達某一級的時候,得需要10ns才能穿過這一級的硬體到達硬體末端。所以時鐘周期間隔必須在10ns以上,否則會出問題。
如果將CPU的流水線增加到16級,將很多級中複雜的硬體簡化,一條指令可能只需要5ns便可以穿過某一級的所有硬體。這樣時鐘周期間隔便可以縮小到5ns。這樣cpu主頻就可以顯著增加。
所以流水線級數越多,主頻越高。CPU性能就越好百度百科和一些文章中都談到,超標量是通過內置多條流水線來提高速度,實質是以空間換取時間。
——這個很容易理解,提升並行效率嘛。lz既然能理解這個,那麼應該也能理解流水線啊
因為流水線跟超標量一樣的也是提高並行效率的。流水線是一種通用的提升並行效率的方法,並不僅僅用在cpu上。工廠裡面的生產流水線,中式快餐店的取餐窗口,都是流水線方法的應用。
要提高一個任務的並行度,最容易想到的思路就是SIMD(單指令流多數據流)。
打個簡單的比方,小學時老師經常布置作業是把一篇文章抄三遍。一種偷懶的方法就是一把握住排成一排的三個筆,一次就寫出三遍內容了。流水線算是SIMD思想的一種比較特殊的應用吧。
因為前後有依賴,所以不像一般的SIMD,多條數據流是平行著進來的,而是斜著進來的。其他回答裡面有放圖的,lz看一下就明白了。關於這種方法的優缺點,吞吐量,延遲之類的其他答案已經說了很多了,就不再贅述了。可以從資源分配粒度的角度來理解,流水線代表對cpu運算資源的分配,10級流水線就是將cpu運算資源分成10份,而每一份運算資源都可以分配給某一個cpu指令,那10級流水線就表示可以將這10份資源最多分給10個不同的指令,而這些指令是同時執行的,10條指令分別在這10份資源上並發執行,這樣,流水線越長,表示cpu運算資源得到越細粒度的分配,資源的分配越快速敏捷,並行指令越多,當然效率越高;設想下,假如無流水線,1個cpu指令執行時獨佔cpu,那要等這cpu執行完後,其他cpu指令才能執行,當然延時很大,而且,沒有讓cpu上所有10份運算資源同時處於滿載狀態,而是在那空轉,這是嚴重浪費;cpu或fpga的一個重要原則是:讓硬體的所有部分最好都處於一直的滿載狀態!所有部分全並行運行;
當然,加入流水線,在流水線間切換存在開銷延時,從單個指令的絕對運行時間看,應該變慢了點,但從它後面的指令角度看,它不需要等前一個指令執行完後才能執行,因此,它對用戶的執行響應速度大大提高了;
學到了很多。。。
流水線機制不能提高單條指令的執行速度,有可能提高吞吐量。
我想知道,「亂序發射」和「流水線」與「超標量」有什麼關係?
完成每條指令的時間是確定的,不會隨著流水線長度的增加而變化。而流水線級數的增加會使同樣的時間內執行指令的條數增加,進而單位時間內執行的指令數增加,效率提升。
流水線越長越快?不對吧………有很多干擾因素的
級越長 意味著機器運行更充分 好比把磚頭從A到搬到B中間人越多就會越快, 可以達到每個人都沒偷懶 自然快 好比這個5級流水線圖 WB MEM EX ID IF可以同時工作 簡單的理解就是級數越多 等的時間越短 所以越快
推薦閱讀:
※cpu流水線上,若後一條指令獲取數據必須是前一條實時生成值,此時cpu流水線是否失效?解決辦法?
※如何看待有些人認為計算機專業是「拿命換錢」?
※電腦開機密碼怎麼解密?
※直接拔除通過 USB 連接的移動硬碟究竟會對硬碟造成什麼損害?
※Windows 系統筆記本到手之後需要做哪些工作?
TAG:英特爾Intel | 中央處理器CPU | 計算機 | 信息技術IT | AMD | 電腦硬體 | 體系結構 | 計算機體系架構 |