
※ 引述《JohnLinq (林約翰)》之銘言:
: : 的介紹. 不得不佩服商業公司的宣傳與用字.
: : in-order 指的就是要配合 instruction fetch & execution pipeline.
:
: 我來說說我個人的一點粗淺理解,請多多包涵。
:
: 亂序執行是為了克服指令的「相關」與「移轉」,
: 失去亂序執行而回歸到in-order,則在遇到具有相關性的指令的時候,
: 整條流水線當中,後面的指令就必須等待前面的指令完成,才能夠接著被執行,
: 如此一來,就失去了流水線並行的本意。
:
: http://cache-www.intel.com/cd/00/00/38/79/387971_387971.gif
:
看這個圖, 這個 in-order scheduling 舉的例比較像是
instruction level parallelism
a=b*7
b=d*7
這兩個算式是不能對調次序執行的.
a=b*7
movl b,%eax
imul $7,%eax
movl %eax,a
b=d*7
movl d,%edx
imul $7,%edx
movl %edx,b
但配合 load/operation/store pipleline 是可以成為流水線式的並行
| T1 | T2 | T3 | T4
------------------------------------------------------------------------
put result stage | | | movl %eax,a| movl %edx,b
------------------------------------------------------------------------
integer multiply | |imul $7,%eax | imul $7,edx|
------------------------------------------------------------------------
get operand stage | movl b,%eax |movl d,%edx | |
-------------------------------------------------------------------------
本來 6 個動作時間, 但透過 pipleline 仍然維持次序, 卻只要四個時間.
這例子是利用較多的 register 只以一組 integer ALU 與獨立的memory load
memory store 兩個模組三者形成流水線(管線). 透過 pipleline parallelism
達到指令並行處理的效果. 這種方法可以想像成這 6 個指令被先快取進來, 再
按不同的功能分類, 再按同類依序(in-order)送進同一類的function unit
LOAD (movl b,%eax , movl d,%edx)
IMUL (imul $7,%eax , imul $7,%edx)
STORE (movl %eax,a , movl %edx,b)
這個方式可以用硬體電路協助檢查, 在預取 6 個指令下, 使原來的指令可以按
類仍然是按序, 但可跳躍交錯進行. 也就是讓原來的
load1/imul1/store1 ,/load2/imul2/store2
可以透過硬體標記自動變成
<load1, > / <imul1, load2> / <store1, imul2> / < ,store2>
盡量塞進空餘的 function unit pipleline.
Atom processor 則是去掉這個硬體協助跳躍多塞的額外輔助電路, 改為由
compiler 或 programer 自行按 pipleline function unit 自行按序調整.
電腦的執行一向是 "按序" , 按大家習慣的依序執行, 產生 "確定性" 的可
預期結果.
compiler 要做的是 in-order SCHEDULING , 協助先排一下次序時程.
使用 in-order 的相反詞 --亂序 是完全錯誤的. 亂序亂跑能得出同樣的
結果嗎 ?
--
※ 編輯: ggg12345 來自: 140.115.4.12 (08/03 14:42)
