OpenMP

OpenMP(オープンエムピー)は、共有メモリ型マルチプロセッサ環境における並列アプリケーション開発を容易にするためのAPIです。これは「Open MultiProcessing」の略であり、並列処理を効率的に行うための標準規格として広く利用されています。

OpenMPの特徴



OpenMPの最大の特徴は、ディレクティブ(指示文)をソースコードに挿入することで、コンパイラが自動的に並列化を行う点です。これにより、プログラマーは複雑なスレッド管理を意識することなく、並列処理を実装できます。また、OpenMPが利用できない環境ではディレクティブが無視されるため、同じソースコードを並列環境と非並列環境の両方で使用できるという利点があります。

OpenMPは、プラットフォーム固有のスレッドAPIに依存せず、コンパイラが生成するスレッドを利用して処理を分散します。これにより、プログラムの可搬性が向上し、異なる環境への移植が容易になります。MPI(Message Passing Interface)と比較すると、OpenMPでは異なるスレッドが同じメモリ領域を共有できますが、MPIでは明示的なメッセージ交換が必要です。このため、SMP(Symmetric Multi-Processing)環境では、OpenMPは効率的なデータアクセスが可能ですが、メモリアクセスの局所性が低くなる傾向があります。

ただし、並列化の効率はコンパイラに依存するため、MPIに比べてチューニングによる性能向上が限定的になる場合があります。また、頻繁なメモリアクセスが発生するプログラムでは、MPIの方が高速な場合もあります。

OpenMPの利用状況



OpenMPは並列プログラミングで広く利用されているAPIの一つですが、共有メモリに対するアクセスがUniform Memory Accessに近いハードウェアシステムでは、スケーラビリティに限界があります。そのため、現在のスーパーコンピューターでは、OpenMP単独ではなく、分散メモリ環境で高いスケーラビリティを発揮するMPIと組み合わせた、ハイブリッドMPI+OpenMPが利用されることが一般的です。

OpenMPの進化



2013年にリリースされたOpenMP 4.0では、SIMD命令を利用した自動ベクトル化機能や、GPUなどのアクセラレータに並列処理を委譲するオフロード機能など、多くの先進的な機能が追加されました。これにより、OpenMPはより多様なハードウェア環境に対応できるようになりました。

対応言語



現在、OpenMPはFORTRANとC/C++の標準化が進められています。これらの言語でOpenMPを使用することで、様々なプラットフォームで並列処理を実装できます。

OpenMPを用いたコード例



以下にC[[言語]]とC++でのOpenMPのコード例を示します。

C[[言語]]での並列処理の例


c

include


include



int main() {
int i;
#pragma omp parallel for
for (i = 0; i < 10000; i++) {
// 並列処理されるコード
printf("Thread %d, i = %d
", omp_get_thread_num(), i);
}
return 0;
}


この例では、`#pragma omp parallel for`ディレクティブによって、`for`ループが複数のスレッドに分割され、並列実行されます。例えば、4つのスレッドを使用する場合、ループの各反復がスレッドに均等に分散されます。どの程度スレッドを起動し、どのように処理を分配するかは、OpenMP処理系(コンパイラ)や実行環境に依存します。

C++での並列リダクションの例


cpp

include


include


include


include



double calculate_pi(int num_steps) {
double step = 1.0 / num_steps;
double sum = 0.0;
#pragma omp parallel for reduction(+:sum)
for (int i = 0; i < num_steps; i++) {
double x = (i + 0.5) step;
sum += 4.0 / (1.0 + x
x);
}
return sum step;
}

int main() {
int num_steps = 1000000;
double pi = calculate_pi(num_steps);
std::cout << "PI = " << pi << std::endl;
return 0;
}


この例では、区分求積法を用いて円周率πを計算しています。`#pragma omp parallel for reduction(+:sum)`ディレクティブを使用しており、`reduction`句によって、各スレッドが計算した部分的な`sum`の値を最終的に合算します。これにより、スレッド間での排他制御を記述することなく、安全に並列処理を行えます。

OpenMPプログラムでは、コンパイルオプションやディレクティブのコメントアウト/コメント解除により、マルチスレッド版とシングルスレッド版の速度性能比較を簡単に行うことが可能です。

対応コンパイラ



OpenMPは様々なコンパイラでサポートされており、以下にいくつかの例を挙げます。

GCC: バージョン4.9以降でOpenMP 4.0、GCC 6以降でOpenMP 4.5、GCC 9以降でOpenMP 5.0の初期サポート
Clang: バージョン3.7以降でOpenMP 3.1、バージョン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の機能をサポート

参考文献



以下は、OpenMPに関する書籍や資料です。

洋書


Rohit Chandra, Ramesh Menon, Leo Dagum, David Kohr, Dror Maydan and Jeff McDonald: Parallel Programming in OpenMP, Morgan Kaufmann, ISBN 978-1558606715 (2000年10月).
Barbara Chapman, Gabriele Jost and Ruud Van der Pas: Using OpenMP: Portable Shared Memory Parallel Programming, MIT Press, ISBN 978-0-262-53302-7 (2007年10月).
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 (2017年10月27日). ※ OpenMP 4.5 の仕様を記述。
Timothy G. Mattson, Yun (Helen) He, and Alice Evelyn Konigs: The OpenMP Common Core: Making OpenMP Simple Again, The MIT Press, ISBN 978-0262538862 (2019年11月19日).
Tom Deakin and Timothy G. Mattson: Programming Your GPU with OpenMP: Performance Portability for GPUs, The MIT Press, ISBN 978-0-262547536 (2023年11月7日).

和書


牛島 省:「OpenMPによる並列プログラミングと数値計算法」、丸善、ISBN 978-4621077177 (2006年5月).
黒田久泰:「C[[言語]]によるOpenMP入門」、東京大学情報基盤センター スーパーコンピューティングニュース、Vol.9, No. Special Issue 1 (2008), pp.149-168
佐藤三久:「OpenMP並列プログラミング入門」、筑波大学計算科学センター(2010)
菅原 清文:「C/C++ プログラマーのための OpenMP 並列プログラミング」、第2版、カットシステム、ISBN 978-4-87783-223-0 (2012年6月).
片桐孝洋:「並列プログラミング入門:サンプルプログラムで学ぶOpenMPとOpenACC」、東京大学出版会、ISBN 978-4130624565 (2015年5月29日).
片桐孝洋:「OpenMPの基礎」、名古屋大学情報基盤センター、計算科学技術特論A第3回(2017年度)
北山洋幸:「OpenMP基本と実践―メニ―コアCPU時代の並列プログラミング手法」、カットシステム、ISBN 978-4877834494 (2018年10月1日).

関連項目



オープン標準
OpenCL
OpenACC
スレッド (コンピュータ)

外部リンク



OpenMP
Specifications - OpenMP
OpenMP Architecture Review Board: OpenMP Application Programming Interface Specification Version 5.0, (2018年11月)
OpenMP入門 - Fortran利用者向け (NAG社)
HPCプログラミングセミナーで使用する資料の公開ページです。
「OpenMPによるマルチコア・メニィコア並列プログラミング入門」(東京大学情報基盤センター講習会資料)
* Victor Eijkhout : Parallel Programming for Science Engineering The Art of HPC, volume 2 (HTML version)

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。