免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2652 | 回复: 2
打印 上一主题 下一主题

[C] 碰到了一个有趣的小问题,关于CPU执行速度的 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-09 14:26 |只看该作者 |倒序浏览
为了提高程序运行效率,写了个测试小程序,想测试下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出品的高性能运算库,可以做到平常程序员做不到的很多优化,
自学的话,有没有相关书籍介绍下?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 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

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
3 [报告]
发表于 2014-11-12 15:54 |只看该作者
短循环体,无内存操作,时间主要是耗费在跳转指令上。

要优化执行速度,需要将短循环展开。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP