Openmp - for 里面的 for

Openmp - for's inside for's

我正在尝试将 "for" 与 openmp 并行化。 然而,结果 并行代码与非并行代码 是不同的。我认为它与循环外的 sum 变量的定义有关,但我不知道如何解决这个问题。

我想要的是并行化第一个 "for" 循环。

编辑:1

这是我能找到的最简单的示例。

//g++ -o test2 test2.cpp -fopenmp
//
//

#include <cmath>
#include <iostream>

using namespace std;

double f(double i, double j)
{
return i + j;
}

int main()
{
const int size = 256;
double sum = 0;

//will use openmp
#pragma omp parallel for
for(int i = 0; i < size; i = i + 1)
{
    for(int j = 0; j < size; j=j+1)
    {
        if(i != j)
        {
            sum = sum + f(i,j);
        }
    }

}

cout << "sum = " << sum << endl;


//not using openmp
sum = 0;
for(int i = 0; i < size; i = i + 1)
{
    for(int j = 0; j < size; j=j+1)
    {
        if(i != j)
        {
            sum = sum + f(i,j);
        }
    }

}

cout << "sum = " << sum << endl;  

}

您的问题是由多个线程执行对 sum 的访问。 IE。当第一个线程到达

sum=sum+f(i,j);

它获取 sum,进行计算,将结果写入 sum。当另一个线程同时到达该行时,它获取 sum 的旧值并转储其结果,覆盖第一个线程结果。

一个解决方案是设置

double increment=f(i,j);
#pragma omp critical
sum+=increment;

另请注意,您的代码结果不可预测,并且当您多次 运行 时会发生变化。

谢谢你的回答,终于可以了。

以下代码是 Christoph Solution 的工作代码。

//g++ -o test2 test2.cpp -fopenmp

#include <cmath>
#include <iostream>

using namespace std;

double f(double i, double j)
{
    return i + j;
}

int main()
{
  const int size = 256;

  double sum = 0;

//will use openmp
#pragma omp parallel for
for(int i = 0; i < size; i = i + 1)
{
    for(int j = 0; j < size; j=j+1)
    {
        if(i != j)
        {
            double increment = f(i,j);
            #pragma omp critical
            sum = sum + increment;
        }
    }

}

cout << "sum = " << sum << endl;


//not using openmp
sum = 0;
for(int i = 0; i < size; i = i + 1)
{
    for(int j = 0; j < size; j=j+1)
    {
        if(i != j)
        {
            sum = sum + f(i,j);
        }
    }

}

cout << "sum = " << sum << endl;  

 }