在omp关键部分之后是否存在隐含的omp障碍
例如,我可以将以下代码版本-1修改为版本-2。
版本-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)
}
}
版本-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)
我是否会为版本1和版本2获得相同的结果?
omp关键区域后是否存在隐含障碍?
编辑:很抱歉,如果示例很差..另外,我想知道版本1和版本2之间是否存在任何性能差异
答案 0 :(得分:13)
关键部分既没有障碍,也没有障碍,无论是在起点还是在终点。关键部分本身就是一个同步化构造,它可以防止多个线程同时访问相同的数据。如果您希望在退出并行区域之前拥有正确的全局最小值,则需要在临界区后添加一个额外的障碍。正如已经说过的那样,平行区域最后有一个隐含的障碍。
答案 1 :(得分:0)
如果存在大量迭代,您将通过使用nowait获得性能优势。