OpenMP
ウィキペディア フリーな encyclopedia
OpenMP(オープンエムピー)は、並列計算機環境において共有メモリ・マルチスレッド型の並列アプリケーションソフトウェア開発をサポートするために標準化されたAPIである[2]。「OpenMP」は「open multiprocessing」の略である[2]。
開発元 | OpenMP ARB |
---|---|
最新版 | |
プラットフォーム | クロスプラットフォーム |
対応言語 | C/C++, Fortran |
種別 | 並列プログラミングAPI、言語拡張 |
公式サイト |
www |
テンプレートを表示 |
同様に並列コンピューティングに利用されるMPIでは、メッセージの交換をプログラム中に明示的に記述しなければならないが、OpenMPではディレクティブ(指令)を挿入することによって並列化を行う。OpenMPが使用できない環境では、このディレクティブは無視されるため、並列環境と非並列環境でほぼ同一のソースコードを使用できるという利点がある。また、プラットフォーム固有のスレッドAPIを使わず、コンパイラによって暗黙的に生成されたスレッド[注釈 1]を利用してタスクを振り分けることになるため、並列プログラムを簡潔に記述できるだけでなく、複数の環境に移植しやすくなる。
MPIとの比較では、OpenMPは異なるスレッドが同一のデータを同じアドレスで参照できるのに対して、MPIでは明示的にメッセージ交換を行わなければならない。そのため、OpenMPは、SMP環境においては大きなデータの移動を行なわずにすむので高い効率が期待できる。ただし並列化の効率はコンパイラに依存するので、チューニングによる性能改善がMPIほど高くならないという問題がある。また、OpenMPはMPIに比べてメモリアクセスのローカリティが低くなる傾向があるので、頻繁なメモリアクセスがあるプログラムでは、MPIの方が高速な場合が多い[要出典]。
OpenMPは、並列プログラミングにおいて最も広く利用されているAPIであるが、共有メモリに対してUniform Memory Access(英語版)に近いアクセスができるハードウェアシステムアーキテクチャでは、スケーラビリティに限界がある[2]。そのため、現在のほとんどのスーパーコンピューターでは、OpenMP単独ではなく、分散メモリ環境で高いスケーラビリティを発揮するMPIと組み合わせた、ハイブリッドMPI+OpenMPが利用されている[2][5]。
2013年にリリースされたOpenMP 4.0では、多数の先進的な機能が追加された[6]。SIMD命令を使った自動ベクトル化機能(omp simd
)や、GPUなどのアクセラレータに並列処理を委譲する分散メモリ型のオフロード機能などがサポートされている[7][8]。