亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

x86的MOV真的可以“免費”嗎?為什么我不能復制這個?

x86的MOV真的可以“免費”嗎?為什么我不能復制這個?

C
素胚勾勒不出你 2019-06-21 16:01:55
x86的MOV真的可以“免費”嗎?為什么我不能復制這個?我經??吹接腥寺暦Q,由于注冊重命名,所以在x86中MOV指令可以是免費的。為了我的生命,我無法在一個測試用例中驗證這一點。每一個測試用例我都試著揭穿它。例如,下面是我正在用VisualC+編譯的代碼:#include <limits.h>#include <stdio.h>#include <time.h>int main(void){     unsigned int k, l, j;     clock_t tstart = clock();     for (k = 0, j = 0, l = 0; j < UINT_MAX; ++j)     {         ++k;         k = j;     // <-- comment out this line to remove the MOV instruction         l += j;     }     fprintf(stderr, "%d ms\n", (int)((clock() - tstart) * 1000 / CLOCKS_PER_SEC));     fflush(stderr);     return (int)(k + j + l);}這將為循環生成以下程序集代碼(請隨意生成此代碼,您當然不需要VisualC+):LOOP:     add edi,esi     mov ebx,esi     inc esi     cmp esi,FFFFFFFFh     jc  LOOP現在我運行了幾次這個程序,當MOV指令被刪除時,我觀察到了相當一致的2%的差異:Without MOV      With MOV  1303 ms         1358 ms  1324 ms         1363 ms  1310 ms         1345 ms  1304 ms          1343 ms  1309 ms         1334 ms  1312 ms         1336 ms  1320 ms         1311 ms  1302 ms           1350 ms  1319 ms         1339 ms  1324 ms         1338 ms那又是怎么回事?為什么MOV不是“免費”的?對于x86來說,這個循環太復雜了嗎?有沒有單株有什么例子可以證明MOV像人們所說的那樣是自由的?如果是,那是什么?如果不是,為什么每個人都聲稱MOV是免費的?
查看完整描述

2 回答

?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

這里有兩項小測試,我認為這些測試最終證明了消除運動的證據:

__loop1:
    add edx, 1
    add edx, 1
    add ecx, 1
    jnc __loop1

對決

__loop2:
    mov eax, edx
    add eax, 1
    mov edx, eax
    add edx, 1
    add ecx, 1
    jnc __loop2

如果mov在依賴鏈中添加一個循環,預計第二個版本每次迭代大約需要4個周期。在我的Haswell上,每一次迭代都需要大約2個周期,如果沒有運動消除,這是不可能發生的。


查看完整回答
反對 回復 2019-06-21
  • 2 回答
  • 0 關注
  • 636 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號