多核技术给软件正确性带来的一些影响

1.
    最近发现一个问题,在AMD64位双核的CPU上运行IOMeter进行磁盘性能测试,测得的response time等数据为0,显然不符合逻辑。我下载了IOMeter的源代码(http://www.iometer.org/doc/downloads.html)进行调试,发现可能和一条汇编指令rdtsc有关。这条指令返回自CPU上电以来经历的时钟周期,是用来进行高精度计时的强有力工具。AMD64用的指令集是x86_64,难道x86_64的该指令和普通32位的x86指令不兼容?不会的,AMD当年推出AMD64的时候,强调的就是和x86完全兼容。
    我做了进一步的调试,发现IOMeter计算得到的IO处理时间竟然为负数。也就是说,对于同一个IO请求,完成的时候用rdtsc统计的时间小于开始的时候统计的时间。显然这个不符合常理。难道时光倒流了?………………突然,我想到我用的是双核,也许开始和完成时的时间统计是由不同的核处理的,这两个核的时间不一样?
    我在任务管理器中只给IOMeter的相关任务分配了1个CPU核,得到的结果一切正常。看来我的猜想是正确的。看来AMD64每个核心的时间是有点差别的。开机的时候,应该是先启动一个核心,再启动另外一个核心,然后两个核心都忠实地记录自己所运转的时间,它们互相之间没有进行同步。
    我在Intel Dual Core上面也测试了IOMeter,没有这个现象发生。网上看到有AMD64的双核补丁,打了这个补丁会解决该问题吗?我现在用的电脑是Intel CPU,只有等下次拿到AMD64再测试了。

 

2.
    多核优化给很多软件带来了性能上的提升,但是又带来一些新的问题。我试用Visual Stduio2005对IOMeter进行编译,发现VS会莫名其妙地退出。打开任务管理器,发现里面有两个cl.exe的进程。该进程正是VS的C++编译器。可是,为什么会出现cl.exe会出现两份呢?我仔细查看了VS的输出信息,看到有两个项目正在同时编译。
    原来,Visual Studio2005为双核进行了优化,如果一个解决方案里面有两个项目,这两个项目之间没有依赖关系,则编译的时候VS会同时处理两个项目,充分利用双核的并行处理能力。但是,如果这两个项目共享了一些文件(比如它们都会编译同一个文件,且生成的中间文件也放在相同的路径下),则同时运行的cl.exe就发生了冲突,直接让VS给挂掉了。这个问题很容易解决,给项目添加依赖关系,让两个项目按顺序编译。最好让两个项目的输出目录和中间目录不一样,进一步避免冲突。
    多核还算比较新的技术,虽然很多软件对它进行了优化,但是现阶段不可能面面俱到。我们在多核CPU上使用软件的时候,也要多加留意,进行适当的配置,从功能性和效率上充分发挥多核的能力。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值