在板上逛了好幾年,看到CPU技術年年有新花樣,
因為本身是讀資訊相關類別的,所以難免對這些比較有興趣

,
不過因為這類知識學校跟課本的介紹不多,
很多部分還是靠自己收集各方資料整理推敲出來的,
所以如果有任何錯誤或缺漏,還請大家不吝指教

。
接下來要提幾項CPU相關技術之前,
還是不免要一路看看CPU的演進歷程,
才能從 “為什麼要有這種設計?”“這種設計能改善什麼?” 的角度,
知道各種技術的由來與用途。
下面這張圖是最基本的 CPU 運作流程,
藍色圓是代表一個一個基本指令,所有電腦上運作的程式都是由這種指令組成,
以上圖的例子來看,每4ms可以執行一個基本指令,相當於一秒可以執行250個指令。(4ms 只是舉例,沒有特殊意義。)
[管線 Pipeline]
如果可以將基本指令再細分成更小的工作單位,
以加法舉例 : ADD EAX, 5 (將暫存器 EAX 的值 + 5 後存回 EAX)
可以拆成
1. 讀取 EAX 的值 跟 5
2. 相加
3. 存回 EAX
這樣的好處是,原本必須要一個基本指令執行完後,才能再執行下一個基本指令,
拆成小工作單位後,當第一個基本指令完成第一項小工作後,
第二個基本指令就能先進來執行第一項小工作。
這種方式就像是工廠的生產線一樣,所以這項技術就稱為 Pipeline (管線)
下圖是將第一張圖的工作方式拆成兩個工作單位 (2階管線)
由於每個小工作單位都比原本整個大工作簡單,所以花費時間也較短(2ms),
整體來看就變成每隔2ms 就能執行一個工作,相當於每秒能執行 500 個指令。
像下圖將每個工作階段花費時間都降到 1ms 以下的話,
甚至能在一秒內執行1000個指令了,效率整整是原始方法的4倍。
照這個方式來看,如果能將管線(pipeline)不斷加深,
不就能夠不斷降低每個工作階段花費的時間,大幅提高工作效率了嗎?
如果生產線都不發生 “意外” 的話,這個理論是成立的,
但是其實我們執行的指令中,有時候會發生下面的情形:
ADD EAX, 5
ADD EAX, 6
當第二個指令要讀取 EAX 時,第一個指令卻還沒做完 (正在 +5),
這時候EAX的值是不能用的,所以第二個指令進入 Pipeline 就會出錯。
解決方法就是將第二個指令重置,等第一個指令將 EAX 計算好後,
再讓第二個指令重新進入pipeline。
下圖就是一個例子
從上圖還可以發現一點,就是當管線越深(工作分越細),一旦需要重置就會付出越多代價(cost)。
加上管線越深碰到這種情形的機會越大(因為工作線上未完成的指令越多),
所以當付出的代價高於提升的效率時,效能會不升反降。(而且重置就相當做白工,浪費能源)
接下篇...