一个隐含的屏障是有后OMP临界区是否有后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)
}
}
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)
我会得到两个版本1和版本2相同的结果?
omp临界区之后是否存在隐性障碍?
编辑:如果不好意思的例子是非常差..还有,我想知道是否会有版本1和版本2之间的性能差异
这可能不是最好的例子,因为离开平行区域时会有障碍。但很好的问题。 +1 – Mysticial
在您发布的设计示例中,v2比v1没有性能优势,但在现实世界中可能会有。 –