gpt4 book ai didi

c++ - 标量代码和并行代码之间的不同行为

转载 作者:太空狗 更新时间:2023-10-29 21:06:03 26 4
gpt4 key购买 nike

我想知道为什么以下代码在其标量和并行变体中会产生不同的结果:

#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 放在外循环是一团糟……完全错误的结果。

附言g++-4.4, 英特尔 i7, Linux

最佳答案

啊,现在我明白问题所在了。您的评论on the last question没有足够的上下文让我看到它。但现在很清楚了。

问题出在这里:

    x = i*step+xmin;
y = j*step+ymin;

xy 在并行区域之外声明,因此它们在所有线程之间共享。 (因此所有线程之间出现了令人讨厌的竞争条件...)

要修复它,将它们设为本地:

for ( int j=0; j<N; j++)
{
double x = i*step+xmin;
double y = j*step+ymin;
P[i][j]=x+y;
}

通过此修复,您应该能够将 #pragma 放在外循环而不是内循环上。

关于c++ - 标量代码和并行代码之间的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8340552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com