我的算法(求解泊松方程)是完全可并行化的 - 假设所有线程在每次迭代结束时同步。
Function f, fNext;
init(f);
#pragma omp parallel
for(int step=0; step<maxITER; step++) {
#pragma omp for
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
fNext(i,j) = someOperator( f(i,j) );
}
}
f = fNext;
}//Threads must synchronize here
#pragma omp for
在继续下一次迭代之前是否确保线程同步?
答案 0 :(得分:5)
是。从OpenMP Spec开始(例如,v 3.1,但从开始就开始),在“工作共享结构:”下
在循环结构的末尾有一个隐式屏障,除非 指定了一个nowait子句。
也就是说,在for循环结束时,除非你执行类似#pragma omp for nowait
的操作,否则会有一个隐含的障碍,这样在所有线程完成for循环之前,任何线程都不会执行f=fNext
。