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;
}
我正在尝试将 "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;
}