Walter,我相信我不仅在其他讨论中告诉了您当前的情况,而且还直接从源头(即我的同事,他是 OpenMP 语言委员会的成员)为您提供了信息。
OpenMP 被设计为 FORTRAN 和 C 的轻量级数据并行补充,后来扩展到 C++ 习惯用法(例如,随机访问迭代器上的并行循环)和引入显式任务的任务并行性。它的目的是尽可能跨平台移植,并在所有三种语言中提供基本相同的功能。它的执行模型非常简单——单线程应用程序在并行区域中分叉线程团队,在内部运行一些计算任务,然后将团队重新加入串行执行。如果启用了嵌套并行,来自并行团队的每个线程都可以在以后派生出自己的团队。
由于 OpenMP 的主要用途是高性能计算(毕竟,它的指令和执行模型是从高性能 Fortran 借来的),任何 OpenMP 实现的主要目标是效率,而不是与其他线程范例的互操作性。在某些平台上,只有当 OpenMP 运行时是唯一控制进程线程的运行时,才能实现高效实现。此外,OpenMP 的某些方面可能无法与其他线程结构很好地配合使用,例如OMP_THREAD_LIMIT
在分叉两个或更多并发并行区域时设置的线程数限制。
由于 OpenMP 标准本身并没有严格禁止使用其他线程范例,但也没有标准化与此类的互操作性,因此支持此类功能取决于实现者。这意味着某些实现可能会提供顶级 OpenMP 区域的安全并发执行,而某些实现可能不会。x86 实现者承诺支持它,可能是因为他们中的大多数也是其他执行模型的支持者(例如 Intel 的 Cilk 和 TBB,GCC 的 C++11 等),而 x86 通常被认为是一个“实验性”平台(其他供应商通常要保守得多)。
OpenMP 4.0 在其使用的 C++ 特性方面也没有比 ISO/IEC 14882:1998 更进一步(SC12 草案在这里)。该标准现在包括诸如可移植线程亲和性之类的东西——这绝对不能与其他线程范例很好地配合,这些范例可能会提供与 OpenMP 冲突的自己的绑定机制。OpenMP 语言再次针对 HPC(数据和任务并行的科学和工程应用程序)。C++11 结构针对通用计算应用程序。如果你想要花哨的 C++11 并发东西,那么只使用 C++11,或者如果你真的需要将它与 OpenMP 混合,那么如果你想保持可移植性,那么坚持使用 C++98 的语言特性子集。
我对首先使用 OpenMP 调用一些代码,然后在相同数据结构上使用 C++11 并发调用一些其他代码的情况特别感兴趣。
没有明显的原因可以说明您不希望发生什么,但这取决于您的 OpenMP 编译器和运行时。有使用 OpenMP 进行并行执行的免费和商业库(例如 MKL),但总是有警告(尽管有时隐藏在其用户手册中很深)可能与多线程代码不兼容,这些代码提供了有关何时何地可能的信息。与往常一样,这超出了 OpenMP 标准的范围,因此也超出了 YMMV 的范围。