OpenMP ブロックを並列実行する
提供: C言語入門
スポンサーリンク
OpenMP の #pragma omp parallel で、1文、もしくは、ブロックを並列実行できます。
目次
概要
OpenMPでは、 #pragma omp parallel を使用することで、1文、もしくは、ブロックを並列に実行できます。並列に実行される範囲を並列リージョンと呼びます。 以下の例では、プラグマディレクティブに続くブロックがCPUのコア数だけ並列に実行されます。つまり、コアの数だけ、helloe world が表示されます。
int main(int argc, char *argv[]){ #pragma omp parallel { printf("hello world\n"); } return 0; }
CPUのコアが1つしかなければ、 hello world は、1回だけ表示されます。
スレッド数を指定する方法
並列に実行するスレッド数は、環境変数、もしくは、プログラムの中で指定できます。
omp_set_num_threadsでスレッド数を指定する
プログラムの中で、スレッド数を指定する場合には、 omp_set_num_threads() を使用します。以下の例では、16スレッドで動作することになります。
omp_set_num_threads(16);
環境変数 OMP_NUM_THREADS でスレッド数を指定する
環境変数 OMP_NUM_THREADS でもスレッド数が指定できます。
$ env OMP_NUM_THREADS=16 ./a.out
ヘッダファイル
#include <omp.h>
ブロックの経列実行の例
ソースコード openmp_hello1.c
/* * hello.c * Copyright (C) 2014 kaoru <kaoru@bsd> * * Distributed under terms of the MIT license. */ #include <stdio.h> #include <stdlib.h> #include <omp.h> int main(int argc, char *argv[]) { #pragma omp parallel { printf("hello world\n"); } exit(EXIT_SUCCESS); }
コンパイル
$ gcc49 \ -Wl,-rpath=/usr/local/lib/gcc49 -fopenmp openmp_hello1.c -o openmp_hello1
実行例
CPUが2coreの場合は、2つのスレッドが動作します。
% ./openmp_hello1 hello world hello world
実行例 環境変数でスレッド数を指定する
以下の実行例は、OMP_NUM_THREADSでスレッド数を指定した例です。
$ time env OMP_NUM_THREADS=8 ./a.out hello world hello world hello world hello world hello world hello world hello world hello world env OMP_NUM_THREADS=8 ./a.out 0.00s user 0.01s system 80% cpu 0.007 total
omp_set_num_threadsの使用例
ソースコード openmp_hello2.c
/* * hello.c * Copyright (C) 2014 kaoru <kaoru@bsd> * * Distributed under terms of the MIT license. */ #include <stdio.h> #include <stdlib.h> #include <omp.h> int main(int argc, char *argv[]) { omp_set_num_threads(16); #pragma omp parallel { printf("hello world\n"); } exit(EXIT_SUCCESS); }
コンパイル
$ gcc49 \ -Wl,-rpath=/usr/local/lib/gcc49 -fopenmp openmp_hello2.c -o openmp_hello2
実行例
omp_set_num_threadsで指定したスレッドの数だけ、並列リージョンが実行されています。
% ./openmp_hello2 hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world
関連項目
- OpenMPとは
- OpenMP ブロックを並列実行する
- OpenMP for文を並列実行する
- OpenMPでのアトミックな処理
ツイート
スポンサーリンク