2008年11月16日 星期日

CPU 設計的藝術(III)

Pipe Line 簡介:

Pipe Line的觀念對CPU的運作相當重要. 因為指令Fetch進來之後, 其運作需要許多的時間, 如果每次都要等運作完一個指令, 再Fetch 新的指令進來, 似乎在效率上有所受限. 於是聰明的人類想到了Pipe Line 的方式: 把指令運作切分成幾個Stage, 每個Stage只做部份的工作, 就像工廠的生產線一樣. 當第一個指令從第一個stage運作到最後一個stage並結束後, 雖然其所花費的時間跟沒有切分stage是一樣的, 但是第二個指令卻可能已經跟著運作到最後一個stage了, 接著的每一個指令也都有機會緊密地跟著, 也就是說, 指令與指令的間隔時間被縮短了! 如果沒有切分stage, 則一個指令在運作時, 其它指令就只能等在外面. 若切成幾個stage來做, 則同一時間可以有好幾個指令在不同的stage運作, 其效率自然會大幅提升.

舉例來說, 如果一個指令的運作需要10ns的時間. 在不切Pipe-Line的CPU上運作, 就是每10ns執行完一道指令. 假如我們有100道指令,則需花費1000ns 才能運作完成. 但是, 如果我們將其執行的動作切成10個stage, 每一個stage只需要1ns的運作時間. 第一道指令雖然也要花10ns的時間才完成, 但是接著第二道指令卻只要再花1ns, 第三道指令跟著也是, 依此類推. 所以, 做完100道指令所要花的時間就等於: 10ns + 1ns *99 = 109ns. 這是多麼大的差距啊!

這時後肯定就有人會想, 那stage不就切愈多愈好了? 嗯, 似乎沒有這麼簡單而絕對的事情. 那是因為, 指令裡經常有"跳躍"的動作(branch or exception ...)這些"跳躍"會造成指令經常要停止Fetch或重新Fetch. 因為我們不會在程式要Fetch進來時, 就可以確切地知道它要跳到哪裡去執行. 所以, Pipe-Line 是不可能永遠地連續下去的. 當存在Pipe-Line裡面的指令要被Flush掉時, 切愈多stage的Pipe-Line反而需要花更多時間重新fetch code. 另外, 若stage的分工太細, 也會增加design的複雜度. 理想的Pipe-Line是每一個stage花的時間都一樣. 但是, 那是難以做到的事. 一定會有某一個stage是最花時間的. 以上面的例子來說, 若10ns切成10個stage來運作, 其中最花時間的stage可能是1.2ns, 不會剛好是1ns. 那麼, 整個Pipe-Line的運作就變成需要1.2ns * 10 = 12ns. 反而比原本的10ns 還多.

通常, Pipe-Line有兩種分析的方式, 我們以5級的Pipe-Line為例:

(1) 以時間為橫軸, 指令為縱軸:


uop123456789
uop1:FetchPDDecodeEXEWB
uop2: FetchPDDecodeEXEWB
uop3: FetchPDDecodeEXEWB
uop4: FetchPDDecodeEXEWB
uop5: FetchPDDecodeEXEWB


所以, 執行完5個指令需要9個cycle time, 而在第5個cycle時, 每一個stage就都有指令在運作: uop1在WB, uop2 在EXE, uop3在Decode, uop4在PD, uop5在Fetch....

(2) 以時間為橫軸, Pipe-Line Stage 為縱軸:

Stage123456789
Fetch:uop1uop2uop3uop4uop5
PD: uop1uop2uop3uop4uop5
Decode: uop1uop2uop3uop4uop5
EXE uop1uop2uop3uop4uop5
WBK uop1uop2uop3uop4uop5


How CPU works ?

沒有留言: