CPU摸魚被抓,上了一個新技術!

我叫阿Q,是CPU一號車間裏的員工,我所在的這個CPU足足有8個核,就有8個車間,幹起活來槓槓滴。

我們CPU的任務就是執行程序員編寫的程序,只不過程序員編寫的是高級語言代碼,而我們執行的是這些代碼被編譯器編譯之後的機器指令。

 

那一天,我正在忙活着···

“阿Q,工作時間你怎麼在摸魚啊!”,領導突然到訪,嚇得我一哆嗦。

“領導,我正在執行的這條指令,需要從內存讀取數據,這您是知道的,內存那傢伙可慢了,所以我只好等着,這可不是摸魚哦···”,我小心地解釋到。

領導眉頭緊鎖,指着一片電路問道:“這些是做什麼的,怎麼沒在工作?”

“那是讀取指令的電路”

“旁邊那些呢”

“那是指令譯碼的電路,我手裏這條指令還沒執行完,現在還輪不到它們工作”

“反正也是閒着,就不能提前處理下一條指令嗎?”,領導問道。

“不行啊,我們一直都是一條指令處理完成才處理下一條指令”

“這些電路單元閒着有點浪費啊,可惜了”,領導嘴裏唸叨着離開了我們一號車間,留下不知所措的我呆在原地。

指令流水線

沒過幾天,領導找我們幾個車間的代表開了個會。

會上,領導問道:“各位,咱們執行指令的效率能不能提一提,競爭對手快追上我們了”

“這怎麼提啊,我們幹活夠賣力的了”

“是啊,也沒有划水偷懶”

各車間代表七嘴八舌地說到。

“還說沒有划水?我最近去各車間巡視,經常發現有人摸魚”

一聽這話,大家都沉默,我也羞愧地低下了頭。

領導接着說道:“我在想啊,咱們現在執行指令的過程存在不少的資源浪費,大家能不能別等一條指令執行完再執行下一條,而是提前執行下一條”

這話一出,在場各車間的代表都滿臉問號。我們平時都是一條一條地執行指令,怎麼還能提前執行後面的指令呢,這簡直有點不可思議。

見大家一臉茫然,領導接着說道:“咱們現在執行指令的過程其實是分了好幾個步驟的,不同的步驟需要用到的電路設備基本上是不一樣的,在執行後面步驟的同時,前面步驟所用到的電路就可以騰出來用於處理後面的指令了”

就在我還有些似懂非懂時,二號車間小虎站起來說道:“我明白了!”

領導露出了滿意的笑容,問道:“說說看,你明白什麼了”

小虎轉身來到一旁的畫板上,畫了一張圖:

 

“大家請看,我們平時執行指令,差不多四個主要的步驟:讀取指令、指令譯碼、指令執行、數據回寫。在第一條指令進入指令譯碼的步驟時,負責讀取指令的電路模塊就閒下來了,這時可以用來讀取下一條指令,提前節省了時間。等到第一條指令進入執行的步驟時,指令譯碼的電路就能用來處理第二條指令,而讀取指令的電路就能用來讀取第三條指令,以此類推!”,小虎得意的說到。

“妙啊,妙啊!”,我也忍不住稱讚道:“整個過程就像一條流水線一樣,一環扣一環!這效率肯定能提升不少”

“流水線?這個名字好,要不咱們就把這項技術叫做指令流水線吧!”,領導說到。

不久,咱們CPU各個車間就開始正式推行這項技術,把原來執行指令的過程流水線化。

在我們一號車間又增加了一些人手:負責指令讀取的小A、負責指令譯碼的小胖,負責結果回寫的老K,至於我嘛,就負責具體的指令執行。

流水線的級數

用上了流水線之後,我們CPU的工作性能一下有了非常明顯的提升,甩開了競爭對手一大截,領導高興壞了。

但還沒高興太久,不知道誰走漏了消息,競爭對手CPU們也知道了這項技術,也用上了指令流水線,我們的差距又一次縮小了。

領導又一次召開會議。

“現在該怎麼辦?大家想想辦法啊”

會場一度陷入了沉默,過了一會兒,六號車間的代表小六才站起來發言:“領導,我有一個辦法”

“什麼辦法?”

小六潤了潤嗓子說道:“我先問大家一個問題,在我們沒有使用指令流水線技術的時候,假設執行一條指令需要4個步驟,每個步驟需要1ns,那執行完一條指令總共需要多少時間?4條指令全部執行完又需要多少時間呢?”

“一個步驟1ns,一條指令總共4個步驟就是4ns,4條指令就是16ns,這也太簡單了吧”,二號車間小虎說到。

“沒錯,那用上流水線以後呢?”

“讓我想想,用了流水線技術以後,從第4ns開始,每過1ns就會有1條指令從流水線上完成,完成上面4條指令,總共只需要7ns,比原來省了一半的時間。”

“說的沒錯,大家發現沒有,如果我們把執行步驟拆的再細一些,每個小步驟需要的時間更短一些,這樣流水線的深度就會更深一些,流水線中容納的指令也就越多,性能就會變得更高。”,小六激動的說到。

領導也聽得有些糊塗,打斷問道:“等等,你慢一點,我沒太明白”

小六繼續說道:“比如從現在的4個步驟,拆成8個更小的步驟,每個小步驟需要的時間減半爲0.5ns,這樣一來,流水線跑起來後,每隔0.5ns的時間就會有一條指令完成,比4個步驟的情況更快了!“

 

“妙啊!妙啊!”,領導忍不住鼓掌說道:“就這麼幹”

我總覺得哪裏不太對勁,卻一時也說不上來。

回去之後,我們就進行升級改造,將現在的四級流水線,改造成八級。

你還別說,效果還真是立竿見影,將指令執行過程拆分得更細以後,流水線中容納的指令數變得更多了,進一步減少了CPU電路資源的浪費,執行性能比以前更強了。

但沒過多久,競爭對手CPU也把流水線級數增加了,而且比我們的還多,這可急壞了領導。

沒有辦法,我們也只好再一次提升流水線級數來應對。

就這樣雙方你來我往,我們玩起了流水線級數大戰,最瘋狂的時候,我們把流水線級數做到了三十級。

終於,我們搞出了事情。

我們把一條指令的執行過程拆分的越來越細,雖然是提高了資源的利用率,但每個小步驟之間都需要做好交接,就需要增加很多額外的電路設備。

步驟之間交接不僅有額外的時間開銷,增加的電路設備也會產生額外的功耗。

流水線級數到了一定深度後,發現性能沒有增加反而下降了,而且功耗越來越大,風扇都要瘋狂轉起來給我們降溫。

看來這流水線級數也不是越多越好啊!我們又主動降低了流水線級數,在性能和功耗上選擇了一個平衡點。

流水線裏的冒險

不僅如此,我們在使用指令流水線的過程中,也漸漸地發現了一些其他問題。

有時候,我執行到一些指令,需要從內存讀取數據到寄存器中。不巧的是,負責讀取指令的小A也準備從內存中讀取後面的指令,這同一時間咱倆都要訪問內存,都要使用訪存電路,這下尷尬了,搞得流水線只好停頓下來等待,等我用完了小A再用,白白浪費了時間。

還有的時候,我執行到一些指令,所需要的數據來自於前一條指令計算的結果,可流水線中前一條指令還沒有結束,結果還拿不到,流水線只好又停頓下來等待。

這都還不算啥,更要命的是,遇到了有分支的時候,根本不知道要去把哪個分支的指令加入流水線中處理。

於是,我們把這些問題都集中反饋了上去,後來我發現不僅僅是我們車間,其他車間也遇到了這些問題。

大家把這些問題叫做流水線裏的冒險,還給這三種問題分別取了三個名字:

  • 結構冒險 :流水線中出現硬件資源競爭
  • 數據冒險:流水線中後面的指令需要等待前面指令完成數據的讀寫
  • 控制冒險:流水線需要根據前面指令的執行結果來決定下一步去哪執行

一時之間大家都沒有什麼好的辦法,遇到這些問題就只好讓流水線停頓下來等待,等待前面的指令完成,再繼續工作。

但不斷追求性能提升的領導,肯定不會放任這幾個問題不管,又會想出什麼樣的應對辦法呢?

【完】


 

上面的故事,出自我的新書 《趣話計算機底層技術》 ,如果覺得還不錯的話,歡迎大家衝一波呀~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章