x64处理器超标量特性初探

这是处理器相关信息

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个指令周期

(未完待续)

你可能感兴趣的:(x64汇编,超标量)