标量代码和并行代码的不同行为
Different behaviour between scalar and parallel code
我想知道为什么以下代码在其标量和并行变体中产生不同的结果:
#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
放在外环是一团糟…完全错误的结果。
注:linux
啊,现在我看到问题了。你对最后一个问题的评论没有足够的背景让我理解。但现在很清楚了。
问题在这里:
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
放在外部循环而不是内部循环上。
相关文章:
- 对于openMP来说,有什么建议可以将以下代码与openMP并行
- 并行和顺序运行代码时会产生不同的结果
- R-使用RCPP时如何并行C 代码
- 使用 OPENMP 并行化 C++ 代码
- 有人能帮我把这个C++代码并行化吗
- 在C 程序中并行化C代码模块
- 从并行线程在主 Maya 线程上执行代码
- 用于并行化代码的 TBB 教程/文档
- 如何在C 中使用OpenMP并行运行两组代码
- 需要帮助使用openmp并行化C++代码
- 令人尴尬的并行代码的性能较低
- 串行代码的并行MPI实现
- 循环的OpenMP和C++并行:为什么我的代码在使用OpenMP时会变慢
- C++内存中的并行MPI代码错误
- 如何以最少的重复管理并行和顺序版本代码
- 下面的代码是否运行两个子进程,从 C++ 中的单个父进程并行执行
- 如何制作更高级别的并行代码/脚本
- 并行运行代码,但使用 CMake 和/或 Make 按顺序运行部分
- 编译包含动态并行性的代码失败
- gcc能使我的代码并行吗