OpenMP

OpenMPは、並列計算機環境において共有メモリ・マルチスレッド型の並列アプリケーションソフトウェア開発をサポートするために標準化されたAPIである。「OpenMP」は「open multiprocessing」の略である。

同様に並列コンピューティングに利用されるMPIでは、メッセージの交換をプログラム中に明示的に記述しなければならないが、OpenMPではディレクティブを挿入することによって並列化を行う。OpenMPが使用できない環境では、このディレクティブは無視されるため、並列環境と非並列環境でほぼ同一のソースコードを使用できるという利点がある。また、プラットフォーム固有のスレッドAPIを使わず、コンパイラによって暗黙的に生成されたスレッド実装によっては、スレッドを毎回起動・終了するのではなくスレッドプールが使われる。

2013年にリリースされたOpenMP 4.0では、多数の先進的な機能が追加された。SIMD命令を使った自動ベクトル化機能や、GPUなどのアクセラレータに並列処理を委譲する分散メモリ型のオフロード機能などがサポートされている。

2023年現在、FORTRANとC/C++について標準化が行われている。

1. OpenMPを用いたコード例
-----------------

以下はC言語における for ループを並列処理させる例である。 int main { int i;

pragma omp parallel forfor  { /*  */ } return 0; }<WtXmlEndTag /> OpenMPはループの反復処理を自動的に複数のスレッドに分割して並行処理できるようにする。例えば4つのスレッドを用いて処理を分割する場合、上記例ではインデックス[0, 2499], [2500, 4999], [5000, 7499], [7500, 9999]の各範囲をそれぞれのスレッドに分担させる、といった具合である。実際にいくつのスレッドを起動するのか、また各スレッドに対してどのように処理を振り分けるのかはOpenMP処理系およびプログラム実行環境などの条件に依存する。

以下は区分求積法を用いた円周率πの数値計算を、OpenMP並列リダクションによって行なうC++のコード例である。一部にC++11の機能が使われているが、OpenMPのディレクティブ自体は言語バージョンとは無関係であり、C++98/C++03でも利用できる。

include
include
include
include
include const double D_PI = 3.1415926535897932384626433832795;

// 区分求積法で π の近似値を求める。 // 1 /  を区間 [0, 1] で積分すると π/4 になるという定積分を利用する。

int main { const int DivNum = 1000 * 1000 * 1000; const double delta = 1.0 / DivNum;

std::cout << "OpenMP max threads count = " << omp_get_max_threads << std::endl;

const auto startTime = std::chrono::system_clock::now; double sum = 0;

pragma omp parallel for reductionfor  { const double x = ; const double area = delta * 1.0 / ; sum += area; } const double pi = sum * 4.0; const auto endTime = std::chrono::system_clock::now; std::cout << std::setprecision << "PI ~= " << pi << std::endl; std::cout << "Error [%] = " <<  / D_PI) << std::endl; std::cout << "Elapsed time [ms] = " << std::chrono::duration_cast.count << std::endl; return 0; }<WtXmlEndTag />#pragma omp parallel forは並列ループのディレクティブである。直後に続くreductionはen日本語の各種ドキュメントでは、clauseは「指示節」。GCC 5ではオフロード機能のサポートが追加された。GCC 6以降でC/C++用のOpenMP 4.5を、GCC 7以降でFortran用のOpenMP 4.5をサポートしている。GCC 9以降でOpenMP 5.0の初期サポートが始まっている。

Clang：バージョン3.7でOpenMP 3.1に対応した。Clang 3.7以前は派生プロジェクトが存在した。Clang 3.9でオフロード以外のOpenMP 4.5機能をすべてサポートした。
Microsoft Visual C++：Visual C++ 2017時点でOpenMP 2.0をサポートしている。Visual C++ 2019ではSIMDベクトル化機能を実験的にサポートする。
Intel C++ Compiler：バージョン12.1においてOpenMP 3.1をサポートしている。また、バージョン14.0においてOpenMP 4.0の機能を一部サポートしている。
Intel Fortran Compiler: バージョン18.0以降でOpenMP 5.0の機能の大部分をサポートしている。

2. 脚注
-----

2.1. 注釈
-------

2.2. 出典
-------

3. 関連項目
-------

オープン標準
OpenCL
OpenACC
スレッド 

4. より詳しく知るための本など
----------------

Rohit Chandra, Ramesh Menon, Leo Dagum, David Kohr, Dror Maydan and Jeff McDonald: //Parallel Programming in OpenMP//, Morgan Kaufmann, ISBN 978-1558606715 .
Barbara Chapman, Gabriele Jost and Ruud Van der Pas: //Using OpenMP: Portable Shared Memory Parallel Programming//, MIT Press, ISBN 978-0-262-53302-7 .
Ruud van der Pas, Eric Stotzer and Christian Terboven: //Using OpenMP -- The Next Step: Affinity, Accelerators, Tasking, and SIMD//, The MIT Press, ISBN 978-0262344005 . ※ OpenMP 4.5 の仕様を記述。
Timothy G. Mattson, Yun  He, and Alice Evelyn Konigs: //The OpenMP Common Core: Making OpenMP Simple Again//, The MIT Press, ISBN 978-0262538862 .
Tom Deakin and Timothy G. Mattson: //Programming Your GPU with OpenMP: Performance Portability for GPUs//, The MIT Press, ISBN 978-0-262547536 .
牛島 省:「OpenMPによる並列プログラミングと数値計算法」、丸善、ISBN 978-4621077177 .
[1]
[2]
菅原 清文：「C/C++ プログラマーのための OpenMP 並列プログラミング」、第2版、カットシステム、ISBN 978-4-87783-223-0 .
片桐孝洋：「並列プログラミング入門:サンプルプログラムで学ぶOpenMPとOpenACC」、東京大学出版会、ISBN 978-4130624565 .
[3]
北山洋幸：「OpenMP基本と実践―メニ―コアCPU時代の並列プログラミング手法」、カットシステム、ISBN 978-4877834494 .

5. 外部リンク
--------

[4]
[5]
[6]
[7]
[8]
[9]
[10]