我想知道为什么以下代码在其标量和并行变体中产生不同的结果:
#define N 10
double P[N][N];
// zero the matrix just to be sure...
for (int i=0; i<N; i++)
for(int j=0; j<N; j++)
P[i][j]=0.0;
double xmin=-5.0,ymin=-5.0,xmax=5.0,ymax=5.0;
double x=xmin,y=ymin;
double step= abs(xmax-xmin)/(double)(N - 1 );
for (int i=0; i<N; i++)
{
#pragma omp parallel for ordered schedule(dynamic)
for ( int j=0; j<N; j++)
{
x = i*step+xmin;
y = j*step+ymin;
P[i][j]=x+y;
}
}
此代码在其两个版本中产生的结果并不完全相同(标量版本只注释了#pragma ...
部分)。
我注意到,并行版本中P[i][j]
的元素的百分比与标量版本的元素有很小的不同,但我想知道为什么...
按照建议将#pragma
放在外循环上是一团糟......完全错误的结果。
P.S。 g ++ - 4.4,intel i7,linux
答案 0 :(得分:4)
问题在于:
x = i*step+xmin;
y = j*step+ymin;
x
和y
在并行区域之外声明,因此它们在所有线程之间共享。 (因此在所有线程中都是令人讨厌的竞争条件......)
要修复它,请将它们设为本地:
for ( int j=0; j<N; j++)
{
double x = i*step+xmin;
double y = j*step+ymin;
P[i][j]=x+y;
}
使用此修复程序,您应该能够将#pragma
放在外部循环而不是内部循环上。