为了账号安全,请及时绑定邮箱和手机立即绑定

x86的MOV真的可以“免费”吗?为什么我不能复制这个?

x86的MOV真的可以“免费”吗?为什么我不能复制这个?

C
素胚勾勒不出你 2019-06-21 16:01:55
x86的MOV真的可以“免费”吗?为什么我不能复制这个?我经常看到有人声称,由于注册重命名,所以在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 关注
  • 600 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信