OpenMP

提供: C言語入門
2016年1月21日 (木) 00:39時点におけるDaemon (トーク | 投稿記録)による版

移動: 案内検索
スポンサーリンク

OpenMP (Open Multi-Processing)とは、共有メモリ型マシンで並列プログラミングを可能にするAPIで、C言語, C++, Fortran などで使用できます。プラグマディレクティブ(#pragma)を用いて、コンパイラに命令文を与えます。OpenMPを使用するには、対応したコンパイラが必要です。例えば、gccコンパイラが対応しています。

読み方

OpenMP
おーぷん えむぴー
Open Multi-Processing
おーぷん まるちぷろせっしんぐ

概要

OpenMPは、プラグマディレクティブでコンパイラに命令を出します。OpenMPをサポートしないコンパイラでは、無視されます。OpenMPは、複数のノードにまたがった並列プログラムは記述できません。 OpenMPは、非常にループ指向で、アルゴリズムやデータ構造レベルのパラレリズムを扱えません。OpenMPは、Fortranやループ指向のC言語のコードに非常にマッチします。

OpenMPの特徴

  • 並列プログラムが簡単に記述できます。
  • 並列環境と非並列環境で同じソースコードが利用できます。

OpenMPが使えるコンパイラ

OpenMPが使えるコンパイラをいくつか列挙します。

  • gcc
  • icc (Intelコンパイラ)
  • Visual Studio

インストール

  • gcc 4.9をインストールします。

ヘッダファイル

#include <omp.h>

C言語でのOpenMPの利用例

openmp_hello.c

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
 
int
main(int argc, char *argv[])
{
#pragma omp parallel
        {
		// ここがコア数分並列に実行される。1コアだと1つです。
                printf("hello world\n");
        }
        exit(EXIT_SUCCESS);
}

openmp_for.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <omp.h>
 
int
main(int argc, char *argv[])
{
        size_t i;
#pragma omp parallel for
        for(i = 0; i < 10; ++i)
        {
		// ここが並列に処理されます。並列数は、コア数分です。
                sleep (1);
                printf("hello world: %lu\n", i);
        }
        exit(EXIT_SUCCESS);
}

コンパイル

FreeBSDでgcc 4.9の場合は、以下のコマンドラインでコンパイルします。

gcc49 -Wl,-rpath=/usr/local/lib/gcc49/ -fopenmp openmp_hello.c

実行方法

通常は、以下のコマンドで実行してください。

$ ./a.out

並列スレッド数を環境変数で設定することもできます。コアが1つしかない場合は、OpenMPを体験するために、明示的に設定してみてください。

$ env OMP_NUM_THREADS=16 ./a.out

関連項目




スポンサーリンク