超标量、超流水、超线程
1、超標量(Superscalar)
既然無法大幅提高ALU的速度,有什么替代的方法呢?并行處理的方法又一次產生了強大的作用。所謂的超標量CPU,就是只集成了多個ALU、多個FPU、多個譯碼器和多條流水線的CPU,以并行處理的方式來提高性能。
超標量技術應該是很容易理解的,不過有一點需要注意,就是不要去管“超標量”之前的那個數字,比如“9路超標量”,不同的廠商對于這個數字有著不同的定義,更多的這只是一種商業上的宣傳手段。
2、流水線(Pipeline)
流水線是現代RISC核心的一個重要設計,它極大地提高了性能。
對于一條具體的指令執行過程,通常可以分為五個部分:取指令,指令譯碼,取操作數,運算(ALU),寫結果。其中前三步一般由指令控制器完成, 后兩步則由運算器完成。按照傳統的方式,所有指令順序執行,那么先是指令控制器工作,完成第一條指令的前三步,然后運算器工作,完成后兩步,在指令控制器 工作,完成第二條指令的前三步,在是運算器,完成第二條指令的后兩部……很明顯,當指令控制器工作是運算器基本上在休息,而當運算器在工作時指令控制器卻 在休息,造成了相當大的資源浪費。解決方法很容易想到,當指令控制器完成了第一條指令的前三步后,直接開始第二條指令的操作,運算單元也是。這樣就形成了 流水線系統,這是一條2級流水線。
如果是一個超標量系統,假設有三個指令控制單元和兩個運算單元,那么就可以在完成了第一條指令的取址工作后直接開始第二條指令的取址,這時第一 條指令在進行譯碼,然后第三條指令取址,第二條指令譯碼,第一條指令取操作數……這樣就是一個5級流水線。很顯然,5級流水線的平均理論速度是不用流水線 的4倍。
流水線系統最大限度地利用了CPU資源,使每個部件在每個時鐘周期都工作,大大提高了效率。但是,流水線有兩個非常大的問題:相關和轉移。
在一個流水線系統中,如果第二條指令需要用到第一條指令的結果,這種情況叫做相關。以上面哪個5級流水線為例,當第二條指令需要取操作數時,第 一條指令的運算還沒有完成,如果這時第二條指令就去取操作數,就會得到錯誤的結果。所以,這時整條流水線不得不停頓下來,等待第一條指令的完成。這是很討 厭的問題,特別是對于比較長的流水線,比如20級,這種停頓通常要損失十幾個時鐘周期。目前解決這個問題的方法是亂序執行。亂序執行的原理是在兩條相關指 令中插入不相關的指令,使整條流水線順暢。比如上面的例子中,開始執行第一條指令后直接開始執行第三條指令(假設第三條指令不相關),然后才開始執行第二 條指令,這樣當第二條指令需要取操作數時第一條指令剛好完成,而且第三條指令也快要完成了,整條流水線不會停頓。當然,流水線的阻塞現象還是不能完全避免 的,尤其是當相關指令非常多的時候。
另一個大問題是條件轉移。在上面的例子中,如果第一條指令是一個條件轉移指令,那么系統就會不清楚下面應該執行那一條指令?這時就必須等第一條 指令的判斷結果出來才能執行第二條指令。條件轉移所造成的流水線停頓甚至比相關還要嚴重的多。所以,現在采用分支預測技術來處理轉移問題。雖然我們的程序 中充滿著分支,而且哪一條分支都是有可能的,但大多數情況下總是選擇某一分支。比如一個循環的末尾是一個分支,除了最后一次我們需要跳出循環外,其他的時 候我們總是選擇繼續循環這條分支。根據這些原理,分支預測技術可以在沒有得到結果之前預測下一條指令是什么,并執行它。現在的分支預測技術能夠達到90% 以上的正確率,但是,一旦預測錯誤,CPU仍然不得不清理整條流水線并回到分支點。這將損失大量的時鐘周期。所以,進一步提高分支預測的準確率也是正在研 究的一個課題。
越是長的流水線,相關和轉移兩大問題也越嚴重,所以,流水線并不是越長越好,超標量也不是越多越好,找到一個速度與效率的平衡點才是最重要的。
總結
以上是生活随笔為你收集整理的超标量、超流水、超线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 产品的思路——来自腾讯张小龙的分享(全版
- 下一篇: dnf搬砖代码Python_dnf自动搬