この記事は、インテル® デベロッパー・ゾーンに公開されている「A Survey of OpenMP* Features Implemented in Intel® Fortran and C++ Compilers」の日本語参考訳です。
インテル® コンパイラーの開発者は、OpenMP* ARB (Architecture Review Board) のアクティブなメンバーであり、Fortran および C++ コンパイラーのリリースごとに新しい OpenMP* 機能を実装しています。この記事では、現在のコンパイラーで利用可能な OpenMP* の機能をまとめています。
インテル® Fortran コンパイラー 19.1
OpenMP* 5.0 の新機能:
- SIMD ディレクティブの IF 節
- SIMD ディレクティブの NONTEMPORAL 節
- SIMD と TARGET SIMD 構造の inclusive/exclusive scan 操作
インテル® Fortran コンパイラー 19.0
OpenMP* 5.0 の機能の大部分をサポート。
-qopenmp-simd コンパイラー・オプションはデフォルトでオンです。
このバージョンで追加された機能:
- OpenMP* 4.5 仕様のユーザー定義リダクションがサポートされました。
!$omp declare reduction(reduction-identifier: type-list : combiner) [initializer-clause]
- F2008 標準では BLOCK / ENDBLOCK 構造が追加されました。これにより、OMP 領域内でこの構造を利用できるようになりました。
- !$OMP SIMD ディレクティブの ASSERT 節
- ベクトル化に失敗したときに、報告するかどうかをコンパイラーに指示します。非推奨の !DIR$ SIMD ASSERT と似ています。
インテル® Fortran コンパイラー 18.0
OpenMP* 5.0 の機能の大部分をサポート。
OpenMP* 5.0 のタスク・リダクション向けの言語機能がサポートされました。
- TASKGROUP に TASK_REDUCTION 節が追加されました。
- TASK 句に IN_REDUCTION 節が追加されました。
- TASKLOOP に REDUCTION と IN_REDUCTION 節が追加されました。
OpenMP* SIMD ディレクティブの新しいキーワード monotonic、overlap および lastprivate:
!$omp ordered simd overlap(overlap_index) !$omp ordered simd monotonic([var:step]s) !$omp simd lastprivate(conditional:[vars])
インテル® Fortran コンパイラー 17.0
バージョン 17.0.1 では、OpenMP* 監視スレッド (ヘルパースレッド) が生成されません。
OpenMP* 4.0 および 4.5 の次の機能がサポートされました。
- TARGET ENTER DATA
- TARGET EXIT DATA
- TASKLOOP
次の節もサポートされました。
- OMP TARGET および OMP TARGET UPDATE ディレクティブの DEPEND 節
- OMP TARGET および OMP TARGET UPDATE ディレクティブの NOWAIT 節
- OMP SIMD ディレクティブの SIMDLEN 節
- OMP ORDERED ディレクティブの SIMD 節
- OMP DECLARE SIMD (proc-name) ディレクティブの PROCESSOR (cpuid) 節
- OMP TARGET ディレクティブの DEFAULTMAP (TOFROM:SCALAR) 節
- プログラマーが OpenMP* SIMD で YMM/ZMM レジスターを使用できる、OMP DECLARE SIMD の拡張が含まれています。PROCESSOR (cpuid) 節は、指定したプロセッサー向けのルーチンのベクトルバージョンを生成するようにコンパイラーに指示します。
- DO ループの反復をチームのスレッド間でどのように分割するかについて、ユーザー制御を強化する SIMD 修飾子と NONMONOTONIC 修飾子の OMP DO SCHEDULE 節の拡張が含まれています。
- OpenMP* 4.5 で追加された for / do ループを並列化する新しい loop 構造がサポートされました。
- “taskloop” は、動的な分割統治ループ分割を可能にします。
- “doacross” は、ループ伝播依存があるループの並列化を可能にします。
omp declare simd ディレクティブの linear 節に新しい修飾子が拡張されました。
linear (linear-list [ : linear-step] ) ここで、linear list は次のいずれかです。 list 修飾子 (list) の場合 修飾子は次のいずれかです。 ref val uval
インテル® C++ コンパイラー 19.1
OpenMP* 5.0 の機能:
- simd ディレクティブの if 節
- simd ディレクティブの nontemporal 節
インテル® C++ コンパイラー 19.0
OpenMP* 5.0 向けの言語機能がサポートされました。
“-qopenmp-simd” コンパイラー・オプションはデフォルトでオンです。
包括的な scan 向けの明示的な構文:
#pragma omp simd reduction[parallel](inscan, operator:list) #pragma omp scan inclusive(item-list)
排他的な scan 向けの明示的な構文:
#pragma omp simd reduction[parallel](inscan, operator:list) #pragma omp scan exclusive(item-list)
- プリフィクス sum はベクトルの実行中に正しく計算されます。
- サンプル実装 (英語)
OpenMP* 並列プラグマ向けのユーザー定義インターフェイス (UDI):
#pragma omp declare induction ( induction-id : induction-type :step-type : inductor ) [collector( collector )]
インテル® C++ コンパイラー 18.0
simd コンテキストの ordered ブロック向けの monotonic と overlap キーワードが追加されました。
#pragma omp ordered simd monotonic() #pragma omp ordered simd overlap(expr) #pragma omp simd reduction(=: list)
OpenMP* 5.0 の機能:
TASKGROUP に TASK_REDUCTION 節が追加されました。
TASK に IN_REDUCTION 節が追加されました
TASKLOOP に REDUCTION と IN_REDUCTION 節が追加されました
OpenMP* 4.0 以降の新機能をサポート。
taskloop 構造の機能:
#pragma omp taskloop[clause[[,]clause]..]
インテル® C++ コンパイラー 17.0
OpenMP* 4.0 以降の新機能をサポート。
以下をサポート:
#pragma omp for linear (list [ : linear-step ])
list は list または修飾子(list) のいずれか。
linear 節の ref、val、uval 修飾子をサポート
例: linear(ref(p))、linear(val(i):1)、linear(uval(j):1)
以下をサポート:
#pragma omp simd simdlen(n) #pragma omp ordered [simd]
配列全体のリダクション:
int x[n]; #pragma omp simd reduction(+:x)
processor 節の拡張を #pragma omp declare simd に追加 (OpenMP* 4.5 の正式な機能ではありません)
#pragma omp for schedule 節の SIMD 修飾子と NONMONOTONIC 修飾子をサポート:
for ループの反復をチームのスレッド間でどのように分割するかについて、ユーザー制御を強化する SIMD 修飾子と NONMONOTONIC 修飾子の schedule 節の拡張が含まれています。
reduction 節で部分配列をリスト項目としてサポート:
reduction(reduction-identifier:list)
リスト項目が部分配列の場合、reduction 節がセクションの個々の要素に適用されると見なして処理されます。プライベートの部分配列の要素は、連続して割り当てられます。
参考資料
OpenMP* 仕様 (英語)
OpenMP* アプリケーション・プログラミング・インターフェイス バージョン 5.0 (2018 年 11 月) (英語)
OpenMP* アプリケーション・プログラミング・インターフェイス バージョン 4.5 (2015 年 11 月) (英語)
OpenMP* アプリケーション・プログラミング・インターフェイス バージョン 4.0 (2013 年 7 月) (英語)
使い方に関する追加情報は、各製品のデベロッパー・ガイドおよびリファレンスを参照してください。
インテル® Fortran コンパイラー・デベロッパー・ガイドおよびリファレンス (現在のリリース) (英語)
インテル® C++ コンパイラー・デベロッパー・ガイドおよびリファレンス (現在のリリース) (英語)
製品とパフォーマンス情報
1実際の性能は利用法、構成、その他の要因によって異なります。
詳細は、www.Intel.com/PerformanceIndex (英語) を参照してください。