这是处理器相关信息
vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Core(TM) i3 CPU M 370 @ 2.40GHz stepping : 5 microcode : 4 cpu MHz : 933.000 cache size : 3072 KB
这是初始汇编程序
.file "test.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "a = %d" .text .p2align 4,,15 .globl main .type main, @function main: .LFB30: .cfi_startproc movl $.LC0, %edi subq $8, %rsp .cfi_def_cfa_offset 16 xorq %rax, %rax xorq %rdx, %rdx xorq %r8, %r8 xorq %r9, %r9 xorq %r11, %r11 movq $1000000000, %rcx .L0: # ---->>>>---- decq %rcx # ----<<<<---- jnz .L0 call exit .cfi_endproc .LFE30: .size main, .-main .ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-11)" .section .note.GNU-stack,"",@progbits
要测试的指令位于两行注释之间:
# ---->>>>---- decq %rcx # ----<<<<----
初始程序编译后执行耗时为0.85秒
测试1-1:在初始测试指令基础上添加1到3条nop指令
# ---->>>>---- nop nop decq %rcx nop # ----<<<<----
编译后执行耗时为0.85秒
测试1-1:在初始测试指令基础上添加4到7条nop指令
# ---->>>>---- nop nop nop nop nop decq %rcx nop nop # ----<<<<----
编译后执行耗时均为1.28秒
测试1-3:在初始测试指令基础上添加8到11条nop指令(代码略)
程序编译后执行耗时均为1.83秒
基于测试1的推论1:
1、x64处理器在循环执行指令时,存在一个最小时间粒度,在此时间粒度内,可以执行4条单周期指令 2、decq和nop一样都是单周期指令
在NGA论坛上有人提出nop指令会有副作用不利于测试,而且要排除乱序执行的干扰
测试代码1-4
# ---->>>>---- addq %rax, %rdx addq %rdx, %r8 addq %r8, %r9 decq %rcx # ----<<<<----
三条addq指令有数值依赖关系,无法被乱序或是并发执行
程序编译后执行耗时均为0.85秒,和3条nop的测试1-1的执行时间相同
现在进行第2阶段测试,针对adcq、shld、shl这三个指令
测试代码2-1
# ---->>>>---- addq %rax, %r8 nop adcq %rdx, %r9 adcq $0, %r11 nop decq %rcx # ----<<<<----
编译执行耗时1.26秒,据此推测
1、循环内指令耗时为8个指令周期 2、64位带进位加法指令adcq是个2周期指令
测试代码2-2
# ---->>>>---- nop shld $1, %r9, %r11 shld $1, %r8, %r9 shl $1, %r8 decq %rcx # ----<<<<----
编译执行耗时1.26秒,据此推测
1、循环内指令耗时8个指令周期 2、双精度左移指令shld耗时2.5个指令周期 3、左移指令shl耗时1个指令周期
(未完待续)