考虑以下场景:
函数A创建一层OMP并行区域,每个OMP线程调用函数B,函数B本身包含另一层OMP并行区域。
那么,如果在函数 B 的并行区域内,存在一个 OMP 临界区域,那么,该区域对于函数 A 和 B 创建的所有线程来说是“全局”临界的,还是仅对于函数 B 是局部的?
如果 B 是预构建函数(例如静态或动态链接库)怎么办?
OpenMP 中的关键区域具有全局绑定,其范围扩展到具有相同名称的关键构造的所有出现(在这方面,所有未命名的构造共享相同的特殊内部名称),无论它们出现在代码中的何处。您可以在相应的内容中阅读有关每个构造的绑定的信息Binding的部分OpenMP 规范 http://openmp.org/wp/openmp-specifications/。为了critical
构造你有:
装订线组为critical
区域是所有线程。区域执行一次仅限于一个线程程序中的所有线程,而不考虑线程所属的团队。
(HI:强调我的)
这就是为什么强烈建议命名critical
应使用区域,特别是当受保护资源集不相交时,例如:
// This one located inside a parallel region in fun1
#pragma omp critical(fun1)
{
// Modify shared variables a and b
}
...
// This one located inside a parallel region in fun2
#pragma omp critical(fun2)
{
// Modify shared variables c and d
}
命名区域可以消除两个不相关的关键构造相互阻塞的可能性。
至于问题的第二部分,为了支持 OpenMP 规范的动态范围要求,关键区域通常使用在运行时解析的命名互斥体来实现。因此,在预构建的库函数和代码中可能存在同名关键区域,并且它将按预期工作只要两个代码使用相同的 OpenMP 运行时,例如两者都是使用相同的编译器套件构建的。通常无法保证跨套件 OpenMP 兼容性。另外如果在B()
存在未命名的关键区域,它将干扰代码其余部分中的所有未命名的关键区域,无论它们是否属于同一库代码或属于用户代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)