2013-07-11 79 views
-1

我有一个简单的代码准备测试。这是代码中最重要的部分:OpenMP - 章节指令;比Windows慢的Linux

#pragma omp parallel sections 
{ 
#pragma omp section 
{ 
for (int j=0;j<100000;j++) 
    for (int i=0;i<1000;i++) a1[i]=1; 
} 
#pragma omp section 
{ 
for (int j=0;j<100000;j++) 
    for (int i=0;i<1000;i++) a2[i]=1; 
} 
} 

我用MinGW编译器编译程序,结果如我所料。由于我打算只在Linux上使用计算机,因此我在Linux上编译了代码(使用同一台计算机)。我使用了gcc 4.7.2和intel 12.1.0编译器。该计划的效率显着下降。它比顺序程序慢(omp_set_num_threads(1)

我也尝试过使用私有数组在线程中,但效果是类似的。

有人可以提出任何解释吗?

+0

奇怪的代码,它应该用于评估,就是这样吗? – alexbuisson

+0

什么是你的windows和Linux硬件配置?你确定在gcc命令行上有-fopenmp吗? – alexbuisson

+0

谢谢你的回复。我用命令编译代码:g ++ -fopenmp name.cpp。我将检查硬件配置。 – user2572031

回答

0

我不完全理解你的代码要达到什么目的,但效率的差异可能是由于你正在使用的编译器不知道如何处理代码段落内部分。

首先,尝试不同的编译器。从我的经验来看,gcc-4.8.0在OpenMP上效果更好,所以也许你可以尝试一下。

其次,使用优化标志!如果您衡量的是性能,则只能使用-O1 -O2或-O3。后者会给你最好的性能,但需要一些数学函数的快捷方式,这使得浮点运算略微不太准确。

g++ -fopenmp name.cpp -O3 

你可以this page更多阅读了关于编译器标志,如果您有兴趣。

作为最终音符,不知道你是多么经验丰富的使用OpenMP,但在OpenMP的循环打交道时,你通常会使用以下方法:

#pragma omp parallel for 
for(int i=0; i<N; ++i) 
    doSomething(); 

此外,如果您正在使用嵌套循环,然后你可以使用collapse指令,告知你的编译器把你的嵌套循环到一个单一的一个(这可能会导致更好的性能)

#pragma omp parallel for collapse(2) private(i, j) 
for(int i=0; i<N; ++i) 
    for(int j=0; j<N; ++j) 
     doSomething(); 

有一些事情你应该知道使用崩溃的时候,你可以阅读关于here。我个人更喜欢手动将它们转换为单一循环,因为从我的经验来看,这证明效率更高。