看板 Programming 關於我們 聯絡資訊
※ 引述《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)