Chinaunix

标题: 碰到了一个有趣的小问题,关于CPU执行速度的 [打印本页]

作者: safedead    时间: 2014-11-09 14:26
标题: 碰到了一个有趣的小问题,关于CPU执行速度的
为了提高程序运行效率,写了个测试小程序,想测试下CPU不同运算指令的速度,然后我的脑子就凌乱了
先看代码:
        .cfi_startproc
        movl        $.LC0, %edi
        subq        $8, %rsp
        .cfi_def_cfa_offset 16
        xorq        %rax, %rax
        xorq        %rdx, %rdx
        not        %rax
        not        %rdx
        movq        $1000000000, %rcx
.next:
        shl        $1, %rax
        shl        $1, %rdx
        incq        %rdx
        decq        %rcx
        jnz        .next
        call        exit
        .cfi_endproc

用C解释这个汇编程序可以这么阅读
rax = 0xFFFFFFFFFFFFFFFF;
rdx = 0xFFFFFFFFFFFFFFFF;
rcx = 1000000000;

do {
    rax = rax << 1;
    rdx = rdx << 1;
    rdx++;
    rcx--;
} while (rcx != 0);

若将do while()改成空循环的话,C风格代码如下:
rcx = 1000000000;
do {
    rcx--;
} while (rcx != 0)

对应汇编代码则是:
        movq        $1000000000, %rcx
.next:
        decq        %rcx
        jnz        .next

第一个有趣的结果是:
空循环与循环体内不超过3条简单指令的循环相比,执行时间相同,这一点是否可以理解为此CPU对互不影响的指令,可以有限的并发执行
CPU为笔记本i3 M370,比较老的产品了。
这些简单指令包括但不限于: add(对应C语言的"+"), dec(对应C语言的"--"), inc(对应C语言的"++"), shl(对应C语言的"<<")

第二个结果是循环体内如果是mul(对应于C语言的整数乘法)或是adc(功能是带进位加法,这个C语言好像没有)
则执行时间是空循环的5倍,这一点是否可以理解为:此CPU执行整数带进位加法或是整数乘法,速度是普通加减法的四分之一(循环中有一次“--”,视为普通加减法)

假如编程中要考虑并发优化的话,貌似很费脑子呢,商业软件我知道有个Intel出品的高性能运算库,可以做到平常程序员做不到的很多优化,
自学的话,有没有相关书籍介绍下?
作者: folklore    时间: 2014-11-10 21:22
真的要想在汇编语言级进行优化, 要熟悉CPU的每个细节,
比如主存(总线)/CPU的主频。
比如指令的CPU周期数,
以及Cache大于, Catch内部算法等。
看起来
mov cx
loop
这类的指令在这个CPU中的分支预测可以比较成功。
mul指令要用乘法单元, 如果CPU中没有多个乘法运算单元, 显然是数据相关的。
而一个Mul指令要10几个机器周期。
addc指令大约是由于数据相关而导致迟滞。

最后:
http://bbs.chinaunix.net/thread-4158940-1-2.html
作者: 爻易    时间: 2014-11-12 15:54
短循环体,无内存操作,时间主要是耗费在跳转指令上。

要优化执行速度,需要将短循环展开。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2