yohhoyの日記

技術的メモをしていきたい日記

OpenMP 4.0仕様リリース

2013年7月 OpenMP 4.0仕様リリース記事 OpenMP 4.0 Specifications Released より抄訳。

OpenMP 4.0 APIの新機能は下記を含みます:

アクセラレータのサポート。さまざまな種類の計算デバイスをサポートするため、OpenMP 4.0 API仕様の取り組みにおいては全ての大手ベンダが参画しました。OpenMP APIでは、別の計算デバイスへ移動すべきデータや計算処理コードの範囲を記述する仕組みを提供します。アクセラレータ提案に対するプロトタイプが既にいくつか実装されています。

並列化ループおよび逐次処理をベクトル化するSIMDコンストラクト。今日では主要なプロセッサチップにSIMD演算ユニットが搭載されており、これらへアクセスするポータブルなサポートが不可欠です。OpenMP 4.0 APIでは、SIMD命令によってループ中の複数反復処理を並行実行できることの記述や、SIMDレーンをまたいで呼び出し可能な関数バージョンを記述する仕組みを提供します。

エラー処理。OpenMPアプリケーションの回復性と安定性を向上させるため、OpenMP 4.0 APIではシステムレベル、ランタイムレベル、ユーザ定義エラーのもとでのエラー処理能力を定義します。条件付きキャンセルやユーザ定義キャンセルポイントに基づき、並列OpenMP実行を適切に中断する機能が定義されました。

スレッド・アフィニティ。OpenMP 4.0 APIではどのOpenMPスレッドで実行するかを定義する仕組みを提供します。プラットフォーム特有データとアルゴリズム固有の特質は分離されていて、決定的(deterministic)な動作かつ簡潔に利用できます。ユーザへの利点として、局所性(locality)の改善、偽共有(false sharing)の削減、メモリ帯域幅の向上があげられます。

タスクの拡張。OpenMP 4.0 APIではタスクベース並列サポート機能を拡張します。深いタスク同期*1をサポートするためタスクをグループ化でき、検索処理などで協調的にタスク処理完了を反映できるよう、タスクグループは中断させることができます。またタスク依存性の指定を行うことにより、タスク間同期が新たにサポートされました。

Fortran 2003サポート。Fortran 2003標準は多くのモダンなコンピュータ言語機能を取り込みました。言語仕様にあるこれらの機能によって、ユーザはFortran 2003準拠プログラムを並列化できます。これはFortran 2003で最も人気があるFortan言語とC言語間の相互運用機能を含みます。

ユーザ定義リダクション。これまでのOpenMP APIでは、ベース言語の演算子と組込みの関数しかサポートしませんでした。OpenMP 4.0 APIではユーザ定義のリダクション操作も新たにサポートします。

逐次一貫なアトミック。特定のストレージ位置がアトミックにアクセスされるとき、プログラマから逐次一貫性(sequential consistency)を強制できる指示節(clause)が追加されました。*2

*1:訳注:従来の taskwait 指示文では「子タスク完了待ち」しかできなかったが、OpenMP 4.0で追加された taskgroup 指示文により「子タスクとその全子孫タスクの完了待ち」ができるようになった。

*2:訳注:従来の atomic 指示文では明示的な flush 操作を必要とする“弱いメモリモデル”を採用していたが、seq_cst 指示節を付与することで逐次一貫性モデルを表現できるようになった。この動作はC11/C++11で導入されたmemory_order_seq_cstアトミック操作と同じセマンティクスを持つ。