omp 关键部分之后是否有隐式障碍
Is there an implicit Barrier after omp critical section
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之间是否存在任何性能差异
关键部分没有障碍,无论是在开头还是在结尾。关键部分本身就是一个同步构造,可防止多个线程同时访问相同的数据。如果您希望在退出并行区域之前获得正确的全局最小值,则需要在关键部分之后添加额外的屏障。如前所述,平行区域在末端有一个隐含的障碍。
如果有大量迭代,使用 nowait 将获得性能优势。
相关文章:
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- 在擦除或修改作为不同索引键的值时,boost::multi_index 迭代器是否无效?
- C++ 检查是否按下了键,而不是按住了
- C++视图的一侧与视图值的另一侧具有不同的键时,bimap 是否可能?怎么做?
- 如何检测击键是否被keybd_event或 SendInput 模拟?
- 是否有任何快捷键可以插入函数的定义
- 多重映射的每个元素是否同时包含键和值
- "std::multimap"是否保证每个键的实际值在相等范围内?
- 如何在 while 循环C++中检查 int 输入是否为空或用户按 Enter 键
- 是否可以保证输入<Type>实数时复杂对象的虚部设置为零?
- 在yaml-cpp中,是否可以获取文档中的顶级键名
- AVL 树是否可以对不同节点中的键具有相同的值?
- 使用 const char * 文字作为 std::map 键是否安全
- 此方法是否不适合在 std::unordered_map 中使用 2D 坐标作为键
- 检测是否按下了某个键,而不是检测它是否始终处于关闭状态
- Win32 检测窗口是否最大化/停靠到半屏(Win键 + 左/右)
- 在编译时间检查模板参数类型是否设置或多键,并且容器的元素类型是算术的
- c++ std map 的擦除功能是否释放了指针键的内存?
- 如何检查C++上是否按下了键
- 是否有一个更适合键值数据结构的QABSTRACTITEMMODEL类型类/接口