Edited at

Visual C++ 2015 にてOpenMP適用

Visual C++ 2015 の既存アプリへOpenMPを適用する方法を記載します。

Qiitaへは練習がてらの初投稿です。

Hello World的な簡易な内容ですみません。適宜拡充できればと思います


1.OpenMPとは

OpenMPは、C / C++ / FortranにてマルチプロセスでのプログラムをサポートするAPIです。

複雑な事前準備をすることなく、Visual Studioへの簡易設定とプログラム上の並列化したい箇所へOpenMP適用のおまじないを記載することで、実行プログラムに高速化の恩恵を受けれます。(論理的には適用箇所へNコアでN倍の高速化が期待できますが、実際にはプログラムの依存関係、メモリ帯域幅、ファイル書込等の並列化できないリソースなどの制約によりN倍にはなることはほぼないです)


2. Visual Studio 2015の環境設定

Visual Studuio 2015でC++ アプリのプロジェクト作成後

プロジェクトのプロパティから

-> 構成プロパティ

-> C/C++

-> 言語

-> [OpenMPのサポート] を「はい」にする

image.png


3. プログラムへのOpenMP適用

for文へのOpenMP適用方法


変更前

以下の様なfor文があった場合に、for文の直前へ一行おまじないを入れることで実行時の並列化が可能です。

int a[100000];

for (int i = 0; i < 100000; i++) {
a[i] = 2 * i;
}


変更後

for文の前に「#pragma omp parallel for」の一行を足すだけで並列化が可能です。

int a[100000];

#pragma omp parallel for
for (int i = 0; i < 100000; i++) {
a[i] = 2 * i;
}

この際に、

- for文のカウンタ i は符号付整数である。

- カウンタ i の増分は整数の加算 or 減算である

- ループ内は continue以外のジャンプ(break、exit、goto)は許容されていない

等の制約があます。満たさないとコンパイル時にエラーとなります。

サンプルソースは GitHub に配置しました。

以上、初投稿により簡単ですみませんが、随時拡充したいと思います。