我有一个使用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平台上犯了什么愚蠢的错误吗?
答案 0 :(得分:2)
我认为g ++编译器不像visual studio编译器那样优化。您可以尝试其他优化级别(如-O3)并查看它是否有所作为?
或者您可以尝试其他编译器。英特尔为非商业用途提供免费的Linux编译器。
http://software.intel.com/en-us/articles/non-commercial-software-development/
答案 1 :(得分:-1)
根据所提供的信息,我们无法回答,但有人猜测你的代码可能是因为它无法在多个线程上有效执行。
我没有对OMP进行过多次工作,但我相信允许使用的工作线程少于指定的工作线程数。在这种情况下,一些实现可能足够聪明,可以意识到代码无法高效并行化,只需在单个线程上运行,而其他人则天真地尝试在4个内核上运行它,并遭受性能损失(由于例如,虚假(或真实)共享
为了给你一个合理的答案,一些必要的信息是:
foo(42)
并询问它为什么不返回预期结果。