在 Xeon 上添加长整数需要多少个周期?
从计时试验来看,似乎需要 2 个时钟滴答。
/proc/info 说
型号名称:Intel(R) Xeon(R) CPU X5660 @ 2.80GHz
示例 c 代码(loop.02.c)
unsigned long i, j=0;
for(i=0; i<(0xFFFFFFFF);i++) j+=3;
汇编代码
21:loop.02.c **** for(i=0; i<(0xFFFFFFFF);i++) j+=3;
34 .loc 1 21 0
35 001e 48C745F0 movq $0, -16(%rbp)
35 00000000
36 0026 EB0A jmp .L2
37 .L3:
38 0028 488345F8 addq $3, -8(%rbp)
38 03
39 002d 488345F0 addq $1, -16(%rbp)
39 01
40 .L2:
41 0032 B8FEFFFF movl $4294967294, %eax
41 FF
42 0037 483945F0 cmpq %rax, -16(%rbp)
43 003b 76EB jbe .L3
因此循环执行5条指令:addq addq movl cmpq jbe
循环迭代 0xFFFFFFFF = 16^8 = 4294967296 = 4G 次
/usr/bin/time -f %e ./loop.02
产生 10.78 秒,几乎全部在循环中
4G*5条指令/10.78秒=1.85G条指令/秒
与广告宣传的 2.80GHz 周期/秒相比
平均 2.8/1.8 = 1.6 个周期/指令
如果循环中的 5 条指令中有 2 条指令需要 2 个周期,而其他指令需要 1 个周期,那么这个速率就是有意义的。
这是对计时结果的正确解释吗?
每条指令的周期数的规范在哪里?