最近は、CPUコアが複数になっているため、通常のアプリケーションでも並列化プログラミングを求められることが増えてきた。
そこで、Visual C++でOpenMpを使った並列プログラミングの実装方法について勉強することにした。

OpenMPを利用するためには、以下の手順を踏む。
1.includeで"omp.h"を読み込む。
2.並列化する処理をOpenMP指示文("#pragma omp"から始まる命令等)を指定し、並列化する処理を処理ブロックで囲む。
 (OpenMP指示文には、いくつかの種類があり、用途によって使い分ける)

まずは、単純な例について記載する。
《事前準備》
1.Visual Studio 2008を起動する。
2.プロジェクトを作成する。
 [Visual C++]の[Win32 コンソール アプリケーション]で「空のプロジェクト」とする。
3.プロジェクトのプロパティを変更する。
 1)[プロジェクト]-[XXXXXプロパティ]を開く。
 2)[構成プロパティ]-[C/C++]-[コマンドライン]を選択する。
 3)[追加のオプション]に「/openmp」を追加する。
4.システム環境設定を行う。(以下は、Windows Vistaの場合)
 1)「マイコンピュータ」にカーソルを合わせて右クリックする。
 2)ポップアップメニューから[プロパティ]を選択する。
 3)システムの詳細設定を選択する。
 4)[詳細設定]タブを選択する。
 5)[環境変数]ボタンを押す。
 6)システム環境変数の一覧の下にある[新規]ボタンを押す。
 7)以下を入力して、[OK]ボタンを押す。
  変数名:OMP_NUM_THREADS
  変数値:4

《コード》
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]){
//プロセッサ数を取得する
printf("Processer Count = %d\n", omp_get_num_procs());

//スレッド数を設定する
//omp_set_num_threads(2);

printf("Start!\n");

//並列処理することを明示化する
#pragma omp parallel
{
//このブロック内の処理は並列化される
printf("Parallel Process. No=%d\n", omp_get_thread_num());
}

printf("End!\n");

system("pause");
}

上記のサンプルを実行すると、コンソールに以下のような実行結果が表示される。
私が試した環境(Core 2 Duo)の実行結果は、以下の通り。

Processer Count = 2
Start!
Parallel Process. No=3
Parallel Process. No=2
Parallel Process. No=1
Parallel Process. No=0
End!

最初の「Processer Count」は、プロセッサ数を表示している。
・omp_get_num_procs()は、プロセッサ数を返す関数で、Core 2 Duo等、コアが複数あるCPUの場合は、コア数を返す。
・omp_get_thread_num()は、実行中のスレッド番号を返す関数である。

【補足事項】
・公式サイト(OpenMP.org
・Visual Studio 2008 Professionalを利用している場合は、そのままOpenMpを利用できる。
・Express Editionを利用する場合は、Windows Platform SDKがあれば、利用できるようになる。
・並列数は、環境変数「OMP_NUM_THREADS」で指定する。
 または、プログラム中で「omp_set_num_threads(並列数);」を指定する。