有一个程序A,需要改成单机并行模式,在4核的电脑上跑。可是不管我是自己启动多个计算线程还是使用openmp,始终只有一个核占用全满,另几个CPU核占用率都是0。下面是我做的几个实验。编程环境vs2005,MS编译器。计算机是amdCPU4核,2G内存,windowsXP操作系统。并行测试程序采用一个50000000次的for循环计算pai值。
1、使用新建的vc工程(控制台或者win32应用程序),实现多线程或者使用openmp实现并行计算,所有CPU都充分利用了。计算速度线性提升。说明并行算法没有错误。
2、直接在A程序中加入并行的程序,发现只有1个核运行。调试时可以看到多个线程确实启动了,多个线程在争抢一个CPU核!
3、直接在A程序中main函数一开始就调用并行程序,结果一样,只用一个。唉
4、除了主程序main()外,把所有其他类、函数、文件,乱七八糟都移除,但是并没有改环境配置。编译执行,多个CPU都用上了。说明问题不是由于项目环境的设置产生的。
综上,初步怀疑是工程中某个文件使用#define定义了什么标识影响到多核的使用。这个程序很大,百万行代码量,光是#define就上千个,文件间相互引用频繁,难以采用排除的方式看出什么影响CPU。
另外,今天看到资料说可以使用进程线程的亲缘性给线程指定CPU,我还没有试,担心情况不容乐观。OS自己不给分,指定划分怕是是更玄。
其中疑惑,忘高手指点迷津,不胜感激,涕零ing...
1、使用新建的vc工程(控制台或者win32应用程序),实现多线程或者使用openmp实现并行计算,所有CPU都充分利用了。计算速度线性提升。说明并行算法没有错误。
2、直接在A程序中加入并行的程序,发现只有1个核运行。调试时可以看到多个线程确实启动了,多个线程在争抢一个CPU核!
3、直接在A程序中main函数一开始就调用并行程序,结果一样,只用一个。唉
4、除了主程序main()外,把所有其他类、函数、文件,乱七八糟都移除,但是并没有改环境配置。编译执行,多个CPU都用上了。说明问题不是由于项目环境的设置产生的。
综上,初步怀疑是工程中某个文件使用#define定义了什么标识影响到多核的使用。这个程序很大,百万行代码量,光是#define就上千个,文件间相互引用频繁,难以采用排除的方式看出什么影响CPU。
另外,今天看到资料说可以使用进程线程的亲缘性给线程指定CPU,我还没有试,担心情况不容乐观。OS自己不给分,指定划分怕是是更玄。
其中疑惑,忘高手指点迷津,不胜感激,涕零ing...
同喜同喜,发分了。
学到个教训,以后改程序发现问题不但#define的定义,还有全局函数的构造函数,都是在main之前执行。