[英]Does a CMP+JE consume more clock cycles than a single MUL?
我正在運行x86處理器,但我相信我的問題很籠統。 我對CMP + JE
序列與單個MUL
操作所消耗的時鍾周期的理論差異感到好奇。
在C偽代碼中:
unsigned foo = 1; /* must be 0 or 1 */
unsigned num = 0;
/* Method 1: CMP + JE*/
if(foo == 1){
num = 5;
}
/* Method 2: MUL */
num = foo*5; /* num = 0 if foo = 0 */
不要太過深入地研究偽代碼,它純粹是在闡明這兩種方法背后的數學邏輯。
我實際比較的是以下兩個指令序列:
方法1:CMP + JE
MOV EAX, 1 ; FOO = 1 here, but can be set to 0
MOV EBX, 0 ; NUM = 0
CMP EAX, 1 ; if(foo == 1)
JE SUCCESS ; enter branch
JMP FINISH ; end program
SUCCESS:
MOV EBX, 5 ; num = 5
FINISH:
方法2:MUL
MOV EAX, 1 ; FOO = 1 here, but can be set to 0
MOV ECX, EAX ; save copy of FOO to ECX
MUL ECX, 5 ; result = foo*5
MOV EBX, ECX ; num = result = foo*5
似乎單個MUL
(總共4條指令)比CMP + JE
(總共6條指令)效率更高,但是對於指令來說,時鍾周期的消耗是相等的-即,完成一條相同指令所需的時鍾周期數還有其他指示嗎?
如果實際消耗的時鍾周期取決於機器,那么單個MUL
通常比大多數處理器上的分支方法快嗎,因為它需要的總指令更少?
現代的CPU性能比僅計算每條指令的周期數要復雜得多。 您需要(至少)考慮以下所有因素:
所有這些都會受到周圍代碼的嚴重影響。
因此,從本質上講,幾乎不可能執行這樣的微基准測試並獲得有用的結果!
但是,如果我不得不猜測,我會說沒有JE的代碼通常會更有效,因為它消除了分支,從而簡化了分支預測行為。
通常,在現代x86處理器上, CMP
和MUL
指令都將占用一個整數執行單元一個周期( CMP
本質上是一個SUB
,它丟棄結果並僅修改標志寄存器)。 但是,現代x86處理器也具有流水線,超標量和亂序,這意味着性能不僅取決於此基礎周期成本。
如果不能很好地預測分支,則分支錯誤預測損失將淹沒其他因素,並且MUL
版本的性能將明顯更好。
另一方面,如果可以很好地預測分支, 並且在隨后的計算中立即使用num
,則分支版本在平均情況下可能會表現更好。 那是因為當正確預測分支時,它可以使用比較結果num
的預測值開始推測性地執行下一條指令(而在MUL
情況下,隨后使用num
將對MUL
結果-在退出該結果之前將無法執行)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.