在iMac上OpenMP'慢'? (C ++)

时间:2010-09-17 21:20:07

标签: c++ openmp

我有一个使用OpenMP的小型C ++程序。它在带有VisualStudio 2010的Windows7,Core i7上运行良好。在带有Core i7和g ++ v4.2.1的iMac上,使用4个线程的代码运行速度比仅运行4个线程要慢得多。使用g ++的其他2台Red Hat机器上也会出现相同的“慢”行为。 这是代码:

   int iHundredMillion = 100000000;
   int iNumWorkers = 4;
   std::vector<Worker*> workers;

   for(int i=0; i<iNumWorkers; ++i)
   {
      Worker * pWorker = new Worker();
      workers.push_back(pWorker);
   }

   int iThr;

   #pragma omp parallel for  private (iThr)     // Parallel run
   for(int k=0; k<iNumWorkers; ++k)
   {
      iThr = omp_get_thread_num();
      workers[k]->Run( (3)*iHundredMillion, iThr );
   }

我正在用这样的g ++编译:

g++ -fopenmp -O2 -o a.out *.cpp

有人能告诉我在* nix平台上犯了什么愚蠢的错误吗?

2 个答案:

答案 0 :(得分:2)

我认为g ++编译器不像visual studio编译器那样优化。您可以尝试其他优化级别(如-O3)并查看它是否有所作为?

或者您可以尝试其他编译器。英特尔为非商业用途提供免费的Linux编译器。

http://software.intel.com/en-us/articles/non-commercial-software-development/

答案 1 :(得分:-1)

根据所提供的信息,我们无法回答,但有人猜测你的代码可能是因为它无法在多个线程上有效执行。

我没有对OMP进行过多次工作,但我相信允许使用的工作线程少于指定的工作线程数。在这种情况下,一些实现可能足够聪明,可以意识到代码无法高效并行化,只需在单个线程上运行,而其他人则天真地尝试在4个内核上运行它,并遭受性能损失(由于例如,虚假(或真实)共享

为了给你一个合理的答案,一些必要的信息是:

  • 实际时间(代码在单个线程上运行多长时间?4个线程使用OM多长时间?4个线程使用“常规”线程多长时间?
  • 数据布局:哪些数据分配到哪里以及何时访问?
  • 循环内部究竟发生了什么?我们目前所能看到的只是乘法和函数调用。只要我们不知道函数内部发生了什么,您也可以发布此代码:foo(42)并询问它为什么不返回预期结果。