「OpenMP」の版間の差分

提供: C言語入門
移動: 案内検索
(ページの作成:「OpenMP (Open Multi-Processing)とは、共有メモリ型マシンで並列プログラミングを可能にするAPIで、C言語, C++, Fortran などで使用でき...」)
 
 
(同じ利用者による、間の7版が非表示)
行1: 行1:
[[OpenMP]] (Open Multi-Processing)とは、共有メモリ型マシンで並列プログラミングを可能にするAPIで、C言語, C++, Fortran などで使用できます。プラグマディレクティブ(#pragma)を用いて、コンパイラに命令文を与えます。[[OpenMP]]を使用するには、対応したコンパイラが必要です。例えば、[[gcc]]コンパイラが対応しています。
+
[[OpenMP]] (Open Multi-Processing)とは、共有メモリ型マシンで並列プログラミングを可能にするAPIで、'''C言語''', '''C++''' , Fortran などで使用できます。プラグマディレクティブ(#pragma)を用いて、コンパイラに命令文を与えます。[[OpenMP]]を使用するには、対応したコンパイラが必要です。例えば、[[gcc]]コンパイラが対応しています。
  
 
'''読み方'''
 
'''読み方'''
行7: 行7:
  
 
== 概要 ==
 
== 概要 ==
 +
インテル(Intel) や AMD の CPU (プロセッサ)は、マルチコア化、メニーコア化が進んでいます。その背景には、集積回路(LSI)のトランジスタ数が18ヶ月ごとに倍になる、という「ムーアの法則」が鈍化しました。CPUの性能はダイサイズの平方根に比例する、という「ポラックの法則」は、効率の良いものではありませんでした。その結果、消費電力を半分に下げても、クロック数は80%に下がり、性能は10%程度に下落するが、マルチコア化すれば、十分に性能が得られる、ということで、マルチコア化に進んでいきました。
 +
 +
パソコンやサーバがマルチコア化していく中で、プログラムがマルチコアに対応していなかったら、せっかく、CPUが進化したのに、その性能を活かすことができません。
 +
 +
マルチコア・メニーコアのCPUの性能を引き出すには、プログラムのマルチプロセス化かマルチスレッド化などの並列プログラミングが必要になります。マルチプロセス化やマルチスレッド化は、プログラミングが難しかったり、OSごとのポータビリティが低いといった問題があります。並列化できない環境で、そのプログラムを使うこともできません。
 +
 +
[[OpenMP]] では、並列プログラミングを簡単にする機能を提供してくれます。
 +
 
[[OpenMP]]は、プラグマディレクティブでコンパイラに命令を出します。[[OpenMP]]をサポートしないコンパイラでは、無視されます。[[OpenMP]]は、複数のノードにまたがった並列プログラムは記述できません。
 
[[OpenMP]]は、プラグマディレクティブでコンパイラに命令を出します。[[OpenMP]]をサポートしないコンパイラでは、無視されます。[[OpenMP]]は、複数のノードにまたがった並列プログラムは記述できません。
 +
[[OpenMP]]は、非常にループ指向で、アルゴリズムやデータ構造レベルのパラレリズムを扱えません。[[OpenMP]]は、Fortranやループ指向のC言語のコードに非常にマッチします。
 
== OpenMPの特徴 ==
 
== OpenMPの特徴 ==
 
* 並列プログラムが簡単に記述できます。
 
* 並列プログラムが簡単に記述できます。
行14: 行23:
 
OpenMPが使えるコンパイラをいくつか列挙します。
 
OpenMPが使えるコンパイラをいくつか列挙します。
 
* [[gcc]]
 
* [[gcc]]
 +
* [[clang]]
 
* icc (Intelコンパイラ)
 
* icc (Intelコンパイラ)
 
* Visual Studio
 
* Visual Studio
行77: 行87:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
== 関連項目 ==
 
== 関連項目 ==
 +
* [[C言語のマルチスレッドプログラミング]]
 
{{openmp}}
 
{{openmp}}
 +
* [[OpenMPでのアトミックな処理]]
 +
* [[OpenMPでSIMDを有効にする]]
 +
* [[gccはOpenMPでNVIDIAのGPUにオフロードできるか?]]
 +
* [[OpenMPのプログラムをclangでコンパイルする方法]]
 
<!-- vim: filetype=mediawiki
 
<!-- vim: filetype=mediawiki
 
-->
 
-->

2017年9月5日 (火) 23:45時点における最新版

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

読み方

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

概要

インテル(Intel) や AMD の CPU (プロセッサ)は、マルチコア化、メニーコア化が進んでいます。その背景には、集積回路(LSI)のトランジスタ数が18ヶ月ごとに倍になる、という「ムーアの法則」が鈍化しました。CPUの性能はダイサイズの平方根に比例する、という「ポラックの法則」は、効率の良いものではありませんでした。その結果、消費電力を半分に下げても、クロック数は80%に下がり、性能は10%程度に下落するが、マルチコア化すれば、十分に性能が得られる、ということで、マルチコア化に進んでいきました。

パソコンやサーバがマルチコア化していく中で、プログラムがマルチコアに対応していなかったら、せっかく、CPUが進化したのに、その性能を活かすことができません。

マルチコア・メニーコアのCPUの性能を引き出すには、プログラムのマルチプロセス化かマルチスレッド化などの並列プログラミングが必要になります。マルチプロセス化やマルチスレッド化は、プログラミングが難しかったり、OSごとのポータビリティが低いといった問題があります。並列化できない環境で、そのプログラムを使うこともできません。

OpenMP では、並列プログラミングを簡単にする機能を提供してくれます。

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

OpenMPの特徴

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

OpenMPが使えるコンパイラ

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

  • gcc
  • clang
  • 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

関連項目