use*_*128 4 c c++ multithreading openmp
考虑以下场景:
函数A创建一层OMP并行区域,每个OMP线程调用一个函数B,函数B本身又包含一层OMP并行区域。
然后,如果在函数 B 的并行区域内,有一个 OMP 关键区域,那么,该区域对于函数 A 和 B 创建的所有线程是“全局”关键的,还是仅对函数 B 是局部的?
如果 B 是预先构建的函数(例如静态或动态链接库)怎么办?
OpenMP 中的关键区域具有全局绑定,其范围扩展到所有具有相同名称的关键构造(在这方面,所有未命名构造共享相同的特殊内部名称),无论它们出现在代码中的何处。您可以在OpenMP 规范的相应绑定部分中了解每个构造的绑定。对于构造,您有:critical
为一个
critical区域设置的绑定线程是所有线程。区域执行一次仅限于程序中所有线程中的一个线程,而不考虑线程所属的团队。(你好:强调我的)
这就是为什么强烈建议使用命名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
}
Run Code Online (Sandbox Code Playgroud)
命名区域消除了两个不相关的关键构造可能相互阻塞的可能性。
至于您问题的第二部分,为了支持 OpenMP 规范的动态范围要求,通常使用在运行时解析的命名互斥体来实现关键区域。因此,在预构建的库函数和您的代码中可能有同名的关键区域,只要两个代码都使用相同的 OpenMP 运行时,它就会按预期工作,例如,它们都是使用相同的编译器套件构建的。通常不能保证跨套件 OpenMP 兼容性。此外,如果B()存在未命名的临界区,则会干扰其余代码中所有未命名的临界区,无论它们是否属于属于用户代码的相同库代码。
| 归档时间: |
|
| 查看次数: |
1776 次 |
| 最近记录: |