「OpenMP ブロックを並列実行する」の版間の差分

提供: C言語入門
移動: 案内検索
(ページの作成:「OpenMP の #pragma omp parallel で、1文、もしくは、ブロックを並列実行できます。 __TOC__ == 概要 == OpenMPでは、 #pragma omp parall...」)
 
(関連項目)
 
行140: 行140:
 
== 関連項目 ==
 
== 関連項目 ==
 
{{openmp}}
 
{{openmp}}
 +
* [[OpenMPでのアトミックな処理]]
 
<!-- vim: filetype=mediawiki
 
<!-- vim: filetype=mediawiki
 
-->
 
-->

2016年1月20日 (水) 19:07時点における最新版

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

関連項目