1. 程式人生 > >7.2 流水線的優化

7.2 流水線的優化

一道 好的 神奇 連續 流處理 時鐘 http 體系 找到

計算機組成

7 流水線處理器

7.2 流水線的優化

技術分享圖片

相對於單周期處理器,流水線技術可以提升處理器的性能,但是,如果僅僅按照指令執行的步驟去切分流水線的話,不能夠充分利用流水線這項技術的優勢。那如何才能挖掘流水線技術的更多潛力呢?我們在這一節就來探討這個問題。

技術分享圖片

我們還是用這個廚房做菜的例子來對流水線進行分析。現在我們將做菜的工作分為四步,每一步都需要一分鐘。如果不采用流水線的方式,做一道菜需要四分鐘,而采用流水線的方式,則需要4分鐘多一些的時間。因為每一個階段之間的交接還需要額外花一些時間。對應於流水線處理器,就是各流水級之間的流水線寄存器所需要的延遲。不過總體來說,這兩種方式所用的時間還是大致相等的。而如果做多道菜,流水線方式的優勢就會逐漸體現出來,而且在流水線充滿的情況下,可以做到每一分鐘上一道菜。而非流水線的方式,只能做到每4分鐘上一道菜。這樣我們就會發現,如果我們劃分為4級的流水線,我們可以將性能提升為原來的4倍。

技術分享圖片

不過剛才這個情況非常的理想化,其實我們很難做到每一個階段恰好花同樣的時間。那我們不妨假設切菜這個環節非常復雜,需要花2分鐘的時間,而其他每個環節仍然只花一分鐘,那我們現在應該讓這個吹號手隔多長時間吹一次號呢?顯然他應該每兩分鐘才吹一次號。因為我們這個流水線的時鐘周期必須按照各流水級當中時間最長的那一級來確定,不然如果還按照1分鐘吹一次號,那上一道菜還沒有切完,下一道菜就已經洗完了,並送到了切菜環節,那就把剛才還沒有切完的菜給沖掉了,這樣顯然是不可以的。 所以,我們只能2分鐘吹一號,這樣只有切菜這個環節是飽滿的工作,其他環節都是幹一分鐘歇一分鐘。那我作為這個餐館的老板,顯然是無法接受這樣的狀況的。這個問題就出在了流水線的平衡性上。最終每個階段花費時間不相等的流水線就被稱為不平衡的流水線。那麽對於這條流水線,我們發現,雖然他還可以做到每兩分鐘出一道菜,但是性能提升幅度就變小了很多,而且從單獨做一道菜看來,非流水線方式只需要5分鐘,而用流水線方式,反而需要8分多鐘,這樣就慢了很多。因此,如果是對於流水線處理器來說,不平衡的流水線對於整體的指令吞吐率,和單獨一條指令執行時間,都有非常不好的影響。因此,在劃分流水線的時候,應當做到每一級所花費的時間盡可能相等,這就有可能造成這級流水線的名稱和它實際所完成的工作並不完全相符。比如說我們要求洗菜這個環節,就稍微多花一點時間把菜葉子先給撕碎了,這樣切菜就可以少花一點時間。當然這只是一種方式,針對這個例子我們還可以考慮另一種方法。

技術分享圖片

那就是把切菜這個環節分為兩步,既然他需要花2分鐘的時間,那我們不如把它分為2個一分鐘的環節。這樣和其他環節的時間就變成一樣的了,我們就可以設置其中周期為1分鐘,每過一分鐘,各個環節就把手中的成果送到下一個環節去。但我們要註意的是,這樣的切分,並不是說要增加新的硬件資源,而應該是把原有的硬件資源切分成兩個部分來使用。我們就還是說切菜,假設我們原來是要做土豆絲,那在切菜的時候,先用一把小刀完成削皮的工作,再用一把大刀完成切絲的工作,這樣一共花了2分鐘的時間。後來我們經過分析發現,削皮大概正好用一分鐘,切絲也需要用一分鐘,那我們就把它切分成兩步,把削皮用的小刀放在第一步,切絲用的大刀放在第二步。這樣我們並不需要購買新的工具,而只是把原有的工具分隔開來。那麽這個調整後的流水線就變成了一個平衡的流水線。

對於這個流水線,我們發現,它單獨做一道菜的時間已經降回到了5分鐘,和非流水線的方式基本相當,更重要的是,在連續工作的情況下,它又可以做到每一分鐘上一道菜。而非流水線的方式,只能是每5分鐘上一道菜。因此,采用流水線的方式,性能可以是原來的5倍,如果我們切分4級流水線,那我們可以做到性能提升為原來的4倍。而切分5級流水,就可以把性能提升到5倍,那就著這個思路想下去,我們繼續進行切分,是不是可以得到更高的性能呢?簡單來看,這樣是對的。這個技術就被稱為“超級流水線”。

技術分享圖片

當然,這個技術並不沒有它這個名字看起來那麽神奇。實際上,我們是將五級流水線作為一個基本的流水線劃分,如果在五級流水線的基礎上,將其中一些流水級細分為更多的階段,從而增加了流水線的深度。這樣的流水線就會被稱為超級流水線。

那麽超級流水線就可以做到更高的時鐘頻率,從而提高了指令的吞吐率。比如這是基礎的五級流水線,其中每個流水級的組合電路的延遲大約為200ps,而流水線寄存器的延遲為50ps,那這個流水線處理器的時鐘周期就是250ps。而如果我們做一個十級的流水線,而且恰好能將這個五級流水線當中的每一級平均地切為兩段,那這個處理器的時鐘周期就是100ps,加上流水線寄存器的50ps,一共是150ps。那顯然使用這樣的超級流水線技術可以帶來明顯的性能提升,但是流水線的級數是越多越好嗎?

技術分享圖片

我們還是要來深入地分析一下。對於五級流水線來說,其執行單條指令的延遲是1250ps,而對於這個十級流水線,它執行單條指令的延遲就變成了1500ps。因此,我們切分流水線之後,提高了時鐘的頻率,從而也提高了指令的吞吐率,但是單條指令的執行時間確實變長了的。這是因為我們增加了更多的流水線寄存器,在五級流水線當中,流水線寄存器的延遲大約占20%的比例。而在十級流水線當中,因為每級的組合邏輯電路的延遲減半了,但是流水線寄存器的延遲是不會發生變化的。因此,流水線級數劃分的越多,流水線寄存器的延遲所占的比例就會越高,從而導致單條指令的延遲越來越大。而且不僅如此,當流水線級數變多之後,填滿一個流水線所需要的指令就會變多,而這些同時處在流水線當中的指令,他們之間的關系也就會變得更加復雜,從而會帶來更多的負面影響,這些負面的影響我們在後面還會進行深入的分析。但我們的結論是很明確的,流水線的級數顯然不是越多越好。

技術分享圖片

那我們再來看看現實中的情況。比如說93年的奔騰處理器,它就采用了五級的流水線,而MIPS則是在更早就實現了流水線處理器,包括有五級的,和後來的八級的。因為MIPS在設計之初就充分考慮了用流水線進行實現,所以它很容易通過流水線以及超級流水線的技術獲得性能上的提升。而X86指令系統在設計的時候,並沒有考慮這一點,而且由於它自身比MIPS復雜得多,也很難進行流水線的切分。因此,在80年代到90年代初,以MIPS為代表的RISK處理器性能提升很快,對X86處理器構成了巨大的威脅。不過後來英特爾在非常困難的情況下,找到了一個應對的方法。

這個方法從95年的奔騰Pro開始實現。奔騰Pro是一個12級流水線的處理器,也有一些劃分方法認為它是14級的。它的核心要點在於,在處理器內部,用硬件將復雜的X86指令切分成簡單的RISK指令。從而可以運用這些先進的RISK處理器的技術,又保證了兼容之前用X86指令編寫的軟件。那麽經過幾番爭鬥之後,作為CISK代表的X86還是戰勝了來勢兇猛的RISK處理器廠商,雖然它用的也正是RISK的技術。

而現在作為RISK代表的ARM,在那時還並沒有多大的影響力,至少在計算機的領域是這樣的。這是97年的ARM9,采用了五級流水線的形式,這個流水線的劃分和MIPS基本上是一樣的。後來到02年,ARM推出了8級流水線的ARM11,這處理器憑借它低功耗的優勢,在嵌入式領域獲得了廣泛的應用。但是由於其性能的不足,還是難以進入個人計算機的市場。

那麽在這個階段,英特爾在戰勝了眾多RISK廠商之後,又和AMD等廠商開始了X86體系結構內部的鬥爭。那麽在這個時期,處理器的流水線級數變得越來越多。從10多級變到20多級,直到04年的奔騰4達到了頂峰,共有31級。 我們剛才已經分析過,流水線的級數並不是越多越好,過深的流水線反而會降低性能。那英特爾顯然不會不知道這一點,但他為什麽還要這麽做呢?其中一個重要的原因就是流水線加深之後,可以帶來的一個很明顯的變化—時鐘頻率的提升。雖然我們現在知道了頻率高不代表性能好,但其實很多普通的消費者並不清楚這一點,而且在那幾年,英特爾和AMD等廠商,在廣告中都是以處理器的頻率作為主打的性能指標。這就造成了那時消費者購買計算機時,都只問“你這個計算機頻率是多少?”,結果這就變成了這家出一個2G的,過幾天那一家就出個2.5G的,那你出個2.5G的,再過幾天,我就出個3G的。誰的頻率高,來買的人就多。這就是那幾年非常著名的CPU頻率大戰,這也帶動了那時主流處理器的流水線深度變得越來越深。當然這樣的事情是不能一直做下去的,它總歸有一個限度,所以到後來頻率大戰打不下去之後,流水線的深度也就逐漸地回落了。比如06年 的Core 2是14級,08年的Core i7是16級。而到現在,13年的Core i7在正常工作情況下,也是14級。那這是桌面處理器的主要情況。

而隨著喬布斯推出的iphone和ipad引爆了另外一個市場,我們也來看一看它的流水線深度。比如09年的Cortx-A8,這是ARM11後一代的處理器,它有13級流水線。而10年的Cortex-A9,則是11級的流水線。我們可以看到它的流水線級數不升反降。而11年的Cortex-A15,則是15級流水線,到13年的Cortex-A57,也仍然保持了這個數目。而A9,A15和A57,這些處理器,或者是與它們同架構的 一些別的處理器,廣泛應用於中高端的智能手機和平板電腦。所以,從這裏也可以看出,現在的主流處理器,其流水線深度基本維持在15級左右。

技術分享圖片

現在我們已經了解到,通過增加流水線的深度,可以有效地提高時鐘的頻率,從而提升指令的吞吐率。不過這個方法也有很大的限制,現在我們已經很難通過繼續增加流水線的深度來獲得性能上的提升了。那如果我們想繼續挖掘流水線處理器的潛力,就還得尋找其他的優化方案。

7.2 流水線的優化