「OpenMP」の版間の差分
(→関連項目) |
|||
(同じ利用者による、間の4版が非表示) | |||
行1: | 行1: | ||
− | [[OpenMP]] (Open Multi-Processing) | + | [[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]]は、Fortranやループ指向のC言語のコードに非常にマッチします。 | ||
行15: | 行23: | ||
OpenMPが使えるコンパイラをいくつか列挙します。 | OpenMPが使えるコンパイラをいくつか列挙します。 | ||
* [[gcc]] | * [[gcc]] | ||
+ | * [[clang]] | ||
* icc (Intelコンパイラ) | * icc (Intelコンパイラ) | ||
* Visual Studio | * Visual Studio | ||
行81: | 行90: | ||
{{openmp}} | {{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 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