OpenMPとは
OpenMPとは
OpenMP(Open Multi-Processing)とは共有メモリ型マシンで並列プログラミングを可能にする API(Application Programming Interface) で、FORTRAN、C/C++から利用できます。OpenMPの特徴は次の通りです。
デバッグしながらの並列化作業が可能ですので、 導入への敷居が低いものとなっています。 |
![]() |
OpenMPの並列処理
OpenMPでは、マルチコアCPUの複数コアを利用し、複数のスレッドを処理します。各スレッドは並列領域を開始時に生成され(fork)、並列領域が終了すると マスタースレッドのみの逐次処理となります(join)。

FORTRAN では !$omp parallel で開始し、 !$omp end parallel で終了します。
C/C++ では #pragma omp parallel { } で囲んだ部分が並列領域となります。
また、OpenMP は共有メモリ型ですので、MPI のようにプロセス間でデータをコピーする必要はありません。
例えば、Hello! を出力するプログラムをOpenmpで並列化するには、次のようにディレクティブを追加します。
FORTRAN
program main !$omp parallel print *, "Hello!" !$omp end parallel stop end |
C/C++
#include <stdio.h> #include <omp.h> int main { #pragma omp parallel { printf( "Hello! ¥n" ); } } |
ループの並列計算
OpenMPでプログラムを高速化するには、ループを並列処理することがほとんどになると思います。例として、次のように、配列 b と配列 c の和を配列 a に書き込む計算を考えます。
FORTRAN
do i = 1, 100 a(i) = b(i) + c(i) enddo |
C/C++
for( i=0; i<100; i++) { a[i] = b[i] + c[i] } |
C/C++ではforループの前に #pragma omp for を記述します。
FORTRAN
!$omp parallel !$omp do do i = 1, 100 a(i) = b(i) + c(i) enddo !$omp enddo !$omp end parallel |
C/C++
#pragma omp parallel { #pragma omp for for( i=0; i<100; i++) { a[i] = b[i] + c[i] } } |
(上の例では、4コアの場合、各スレッドが i を25ずつ担当)
そのため、プログラムによっては、数行のディレクティブを挿入するだけで、 最大コア数倍までの高速化が期待できます。
高速化・並列化事例ページで紹介しているものも、プログラムの大きな変更はなしに高速化できています。
ただ、実際のプログラムでは、うまく並列化できない、性能がなかなか上がらない、といったこともあるかと思います。
その場合は、お気軽にご相談ください。お客様のプログラムに合った並列化方法をご提案いたします。
弊社ではOpenMPの入門セミナーを開催しています。 並列化、OpenMPの説明を始め、円周率の計算やマンデル・ブロの計算を例に主なディレクティブを紹介しています。 本セミナーの知識で大抵のプログラムはOpenMPで並列化できますので、 ご興味ある方は是非ご参加ください。 セミナー開催予定が無い場合でも、セミナー資料、デモプログラムはいつでも配布しておりますので、ご希望の方はお問い合わせください。 |
![]() |
高速化・並列化サービス カタログ高速化・並列化サービスのカタログです。 ( PDF形式, 全4ページ, 849KB )
OpenMPを用いた Fortranコードの並列化基礎セミナー 一部資料OpenMPを用いた Fortranコードの並列化基礎セミナーの一部資料です。 ( PDF形式, 全32ページ, 2.26MB )
続きの資料、デモプログラムをご希望の方は、お気軽にお問い合わせください。高速化・並列化事例01早稲田大学草鹿研究室と共同で行った、流体と化学反応の連成解析コードの並列化に関する資料です。 ( PDF形式, 全4ページ, 439KB )