有一个程序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.   

    #pragma omp parallel shared
      

  2.   

    这种方法用过。使用#pragma omp parallel for 方法循环一个50000000的计算,如果在新建的工程或者别的测试工程中都可以实现多核并行,只有在这个程序中(torque)中,同样的代码就是不并行。我指定了4个线程进行计算,并使用omp_get_num_threads查询可以看到确实启动了多个线程,但多线程争抢一个CPU核。还有其他宏定义会影响这个吗?另外,如果我不使用openmp,使用createthread来启用多个线程同时计算也有同样问题。
      

  3.   

    SetThreadAffinityMask用来设置cpu亲缘性
      

  4.   

    啊,找到了!原来是程序一个类的构造函数中指定了一句话SetProcessAffinityMask( GetCurrentProcess(), 1 );找了n多天,终于明白了!
    同喜同喜,发分了。
      

  5.   

    ft,帖子发出不到5天,还不让放分。感谢jiangsheng 和WingForce 帮忙,打算4/6分成加分 :) 稍等几天
    学到个教训,以后改程序发现问题不但#define的定义,还有全局函数的构造函数,都是在main之前执行。