【问题标题】:VC OpenMP nested parallel loops strange resultsVC OpenMP 嵌套并行循环奇怪的结果
【发布时间】:2013-01-29 13:38:26
【问题描述】:

VC++,测试嵌套循环的 OpenMP 并行性,但结果很奇怪:

  • 没有性能提升
  • 对于大循环,SUM 计算错误。如果只有5个嵌套循环,那就没问题了。

结果如下:

Sum=450000000000.000000 Serial time:        117376.852855
Sum=228067994200.000000 Parallel time:      117391.867931

这是工作代码:

#include "stdafx.h"
#include <omp.h>
#include <ppl.h>

double Serial(), Parallel();

int _tmain(int argc, _TCHAR* argv[])
{
printf("Sum=%f Serial time:        %lf\n",Serial(),omp_get_wtime() );
printf("Sum=%f Parallel time:      %lf\n",Parallel(),omp_get_wtime() );

return 0;
}

double Serial()
{
double sum=0.;
int n=10;

for (int i01=0; i01<n; i01++){
for (int i02=0; i02<n; i02++){
for (int i03=0; i03<n; i03++){
for (int i04=0; i04<n; i04++){
for (int i05=0; i05<n; i05++){
for (int i06=0; i06<n; i06++){
for (int i07=0; i07<n; i07++){
for (int i08=0; i08<n; i08++){
for (int i09=0; i09<n; i09++){
for (int i10=0; i10<n; i10++){

sum+=i01+i02+i03+i04+i05+i06+i07+i08+i09+i10;

}}}}} }}}}}
return sum;
}

double Parallel()
{
double sum=0.;

#pragma omp parallel for shared(sum)
for (int i01=0; i01<10; i01++){
for (int i02=0; i02<10; i02++){
for (int i03=0; i03<10; i03++){
for (int i04=0; i04<10; i04++){
for (int i05=0; i05<10; i05++){
for (int i06=0; i06<10; i06++){
for (int i07=0; i07<10; i07++){
for (int i08=0; i08<10; i08++){
for (int i09=0; i09<10; i09++){
for (int i10=0; i10<10; i10++){

sum+=i01+i02+i03+i04+i05+i06+i07+i08+i09+i10;

}}}}} }}}}}
return sum;
}

【问题讨论】:

    标签: performance visual-c++ parallel-processing openmp nested-loops


    【解决方案1】:

    你猜对了sum应该是共享的,但实际上它是一个归约变量,必须放在reduction子句中:

    #pragma omp parallel for reduction(+:sum)
    

    另一种选择(较慢)是使增量原子化。在这种情况下,原子操作将是一种过度杀伤,但它们有助于更复杂的情况,当简单的归约不适用时,例如在对数组进行归约时:

    #pragma omp atomic update
    sum+=i01+i02+i03+i04+i05+i06+i07+i08+i09+i10;
    

    update 子句来自 OpenMP 3.1。 Visual Studio 仅支持 2.0,因此它不会理解它,但你永远不会知道 - 有一天你可能想要迁移到更好的编译器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多