<< 4 >>
インテル® C/C++ コンパイラー OpenMP* 活用ガイド
デュアルコア・マルチコア対応アプリケーション開発A
3. OpenMP* マルチスレッド並列プログラミング
OpenMP* は、マルチスレッド並列プログラミングのための API(Application Programming Interface) です。
OpenMP* API は 1997年に発表され、その後継続的にバージョンアップされている業界標準規格で、多くのハード
ウェアおよびソフトウェア・ベンダーが参加する非営利団体 (Open MP Architecture Review Board) によって管理され
ており、Linux*、UNIX*そして Windows* システムで利用可能です。OpenMP* は、C/C++ や Fortran と言ったコン
パイラー言語ではありません。また、OpenMP* 自身はコンパイラーではなく、コンパイラーに対する並列処理の機
能拡張を規定したものです。したがって、OpenMP* を利用するには、インテル® コンパイラーバージョン 9.0 のよ
うな OpenMP* をサポートするコンパイラーが必要です。OpenMP* の詳細については、OpenMP* のホームページ
http://www.openmp.org/ にその歴史も含めて、詳細な情報があります。最新の OpenMP* のリリースは、2005年
5月の OpenMP* 2.5 であり、この仕様では初めて、C/C++ と Fortran の双方の規格の統合がなされました。
図.3 OpenMP* リリースの歴史
3.1 プログラミングの特長
C/C++ や Fortran には並列処理のための API が無かったために、それを補うものとして規定されたのが OpenMP*
であるとも言えます。OpenMP* は、C/C++ や Fortran の言語規格に準拠しているため、OpenMP*を利用してもプロ
グラムの移植性や互換性を損なうことなく、並列処理を容易に適用することができます。
コンパイラーのサポート
OpenMP* を利用した並列プログラミングは、プログラムに対して OpenMP* で規定された宣言子を挿入し、コンパ
イル時にコンパイルオプションとして /Qopenmp スイッチ(Windows*)、-openmp スイッチ(Linux*) を指定することで
可能となります。コンパイラーは、ソースコード中の OpenMP* 宣言子で指示された範囲を並列化したことをメッセー
ジとして出力します。
明示的な並列化の指示
OpenMP* 宣言子は、コンパイラーに対して並列化のためのヒントを与えるのでなく、明示的に並列化を指示するも
のです。したがって、間違った宣言子を指定しても、コンパイラーはその指示に従って並列化を行います。また、デー
タの依存性などがあっても、コンパイラーは警告メッセージやエラーメッセージを出したり、その指示を無視することな
く忠実に並列化を行いますので、依存性があるループなどを OpenMP* で並列化した場合には、計算結果が不正に
なります。一方、OpenMP* を使用した場合、スレッドの生成や各スレッドの同期コントロールといった制御をユーザー
が 気にする必要はありません。
1997
1998
OpenMP*
C/C++ 1.0
1999
OpenMP*
Fortran 1.1
2000
2002
OpenMP*
C/C++ 2.0
2005
OpenMP*
Fortran
C/C++ 2.5
OpenMP*
Fortran 1.0
OpenMP*
Fortran 2.0