在omp临界区之后是否存在隐含的omp障碍
例如,我可以将以下代码版本-1修改为版本-2.
VERSION-1
int min = 100;
#pragma omp parallel
{
int localmin = min;
#pragma omp for schedule(static)
for(int i = 0; i < 1000; i++)
localmin = std::min(localmin, arr[i]);
#pragma omp critical
{
min = std::min(localmin, min)
}
}
Run Code Online (Sandbox Code Playgroud)
VERSION-2
int min = 100;
#pragma omp parallel
{
int localmin = min;
#pragma omp for schedule(static) nowait
for(int i = 0; i < 1000; i++)
localmin = std::min(localmin, arr[i]);
#pragma omp critical
{
min = std::min(localmin, min)
}
} // will I get the right "min" after this (because I have included nowait)
Run Code Online (Sandbox Code Playgroud)
对于版本1和版本2,我会得到相同的结果吗?
在omp关键区域之后是否存在隐含障碍?
编辑: 对不起,如果示例很差..另外,我想知道版本1和版本-2之间是否会有任何性能差异
Hri*_*iev 13
关键部分既没有障碍,也没有障碍,无论是在起点还是在终点.关键部分本身就是一个同步化构造,它可以防止多个线程同时访问相同的数据.如果您希望在退出并行区域之前拥有正确的全局最小值,则需要在临界区后添加一个额外的障碍.正如已经说过的那样,平行区域最后有一个隐含的障碍.