多核技术给软件正确性带来的一些影响
2008-10-18 11:21
169 查看
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上使用软件的时候,也要多加留意,进行适当的配置,从功能性和效率上充分发挥多核的能力。
最近发现一个问题,在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上使用软件的时候,也要多加留意,进行适当的配置,从功能性和效率上充分发挥多核的能力。
相关文章推荐
- 5年前给我职业生涯带来重大影响力的开发架构、开发思想(软件分层架构、UML的重要性)
- 5年前给我职业生涯带来重大影响力的开发架构、开发思想(软件分层架构、UML的重要性)
- 5年前给我职业生涯带来重大影响力的开发架构、开发思想(软件分层架构、UML的重要性)
- 5年前给我职业生涯带来重大影响力的开发架构、开发思想(软件分层架构、UML的重要性)
- 影响软件测试的一些因素
- 5年前给我职业生涯带来重大影响力的开发架构、开发思想(软件分层架构、UML的重要性)
- 5年前给我职业生涯带来重大影响力的开发架构、开发思想(软件分层架构、UML的重要性)
- 从供应链角度看SOA给软件行业带来的影响
- 多线程false sharing带来的影响和一些优化.
- 关于单例模式这种比上面1、2都好一些,既实现了线程安全,又避免了同步带来的性能影响。
- 让你提前认识软件开发(41):编程时首先达到正确性,其次考虑效率
- 【软件测试】整理了一些软件测试相关的网站
- 我认为不错的关于软件开发中的一些道理
- 6月18日的一些事:百度上线杀毒软件,360发布随身WiFi
- 一些常用软件
- 注意服务器系统日期对防病毒软件的影响
- CSDN博客给我带来的一些诱惑和选择机会(二):HR“邀请于我”,猎头“有求于我”
- 影响软件测试的几个误区
- 软件测试中让人讨厌的一些事情
- 【软件自动化测试-QTP实战技能 10】== QTP用到的一些特殊方法