OpenMPの背景知識 - OpenMPとは

いちごパック > OpenMPの解説 > OpenMPの背景知識 - OpenMPとは

プログラミングとマルチコアCPU

C++やJavaなどプログラミング言語の多くは、 1つのプロセッサコアで実行するソースコードが書きやすいよう設計されています。 例えばC++言語で、1から100までの和を求めるプログラムを書くと次のようになります。
int result = 0;
for ( int ichigonum = 1; ichigonum <= 100; ichigonum++ )
  result += ichigonum;
このプログラムでは、結果resultを求めるために、 1つのプロセッサコアが100回のループを実行します。
一方、プロセッサコアの動作速度を上げるよりも、 動作速度の低いプロセッサコアを並べてプログラムの設計により実行速度を上げるほうが、 同じ速度を達成するハードルが低いことが知られています。 そのため、CPUの多くは複数のコアを備えています。
ループの実行を1つのプロセッサコアで行う先のプログラムでは、 例えば2つのコアを備えたCPUで実行しても、CPU性能の1/2しか使えません。 2つのコアで並列実行できるプログラムを書けるなら、CPU性能を100%活用できます。
1から100までの和を求めるプログラムは、 1から50までの和を求めるプログラムと、51から100までの和をプログラムに分けることができます。 この2つのプログラムを並列実行させれば、CPU性能を100%活用できます。
int result1 = 0;
for ( int ichigonum = 1; ichigonum <= 50; ichigonum++ )
  result1 += ichigonum;
int result2 = 0;
for ( int ichigonum = 51; ichigonum <= 100; ichigonum++ )
  result2 += ichigonum;
それぞれのプログラムで求めた結果の和を求めれば、1から100までの和になります。
int result = result1 + result2;
OpenMPは、このような並列実行するプログラムを書く方法の1つです。

OpenMPとは

OpenMPとは、並列実行できるプログラムを書くための、既存のプログラミング言語の拡張機能です。 現在入手可能なC/C++コンパイラの多くがOpenMPに対応しています。
OpenMPはC/C++言語、Fortran言語から使えますが、ここではC/C++言語について説明します。 OpenMPでは、C/C++言語の#pragmaと呼ばれる拡張機能と、ライブラリ関数を提供しています。 #pragmaはコンパイラ依存の拡張命令であり、C/C++が#pragmaを解釈できない場合は無視されます。
OpenMPの#pragmaは次の形をしています。
#pragma omp <OpenMPの各種命令>
OpenMPの#pragmaは、その最初に必ずompが入ります。 ompを忘れるとコンパイラはその#pragmaを無視しますので、ご注意ください。 また、OpenMPライブラリ関数のプロトタイプはomp.hで与えられます。
例えば1から100までの和を求めるプログラムを2並列で実行するためには、
  • 2つの和計算を並列実行する命令
  • 個々の結果待ちを行う命令
  • 最後に結果の和を1つのプロセッサコアで実行する命令
  • が必要になります。 OpenMPはそれぞれを実現するための#pragma ompを持っており、 OpenMPを利用したプログラミングでは#pragma ompを駆使して並列実行可能なコードを書いていきます。
    #pragma ompの詳細については後続のページで説明していきます。

    関連ページ

  • OpenMPの解説 目次
  • 次の項目: ビルドと実行環境