Walter さん、私は他のディスカッションで現在の状況を説明しただけでなく、情報源 (つまり、OpenMP 言語委員会の一員である私の同僚) から直接情報を提供したと思います。
OpenMP は、FORTRAN および C への軽量のデータ並列追加として設計され、後に C++ イディオム (ランダムアクセス反復子に対する並列ループなど) および明示的なタスクの導入によるタスク並列処理に拡張されました。可能な限り多くのプラットフォーム間で移植可能であり、3 つの言語すべてで本質的に同じ機能を提供することを目的としています。その実行モデルは非常に単純です。シングルスレッド アプリケーションはスレッドのチームを並列領域でフォークし、内部でいくつかの計算タスクを実行してから、チームを結合してシリアル実行に戻します。ネストされた並列処理が有効になっている場合、並列チームの各スレッドは後で独自のチームをフォークできます。
OpenMP の主な用途はハイ パフォーマンス コンピューティングであるため (結局、そのディレクティブと実行モデルはハイ パフォーマンス Fortran から借用されました)、OpenMP 実装の主な目標は効率であり、他のスレッド パラダイムとの相互運用性ではありません。一部のプラットフォームでは、OpenMP ランタイムがプロセス スレッドを制御する唯一のランタイムである場合にのみ、効率的な実装を実現できます。また、OpenMP には、他のスレッド構造ではうまく機能しない可能性がある特定の側面もあります。たとえば、OMP_THREAD_LIMIT
2 つ以上の並列並列領域をフォークするときに設定されるスレッド数の制限などです。
OpenMP 標準自体は、他のスレッド パラダイムの使用を厳密に禁止していませんが、相互運用性を標準化していないため、そのような機能のサポートは実装者次第です。つまり、最上位の OpenMP 領域の安全な同時実行を提供する実装もあれば、提供しない実装もあるということです。x86 の実装者がサポートを約束しているのは、そのほとんどが他の実行モデル (Cilk と TBB を使用する Intel、C++11 を使用する GCC など) の支持者でもあり、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 の範囲外です。