OpenMP指示文
- #pragma omp ~に当たる部分。
続くブロックが並列化対象になる。#pragma omp 指示文名 [指示句[[,]指示句]...]
※原則、指示文には1つの指示文名しか書けない
※指示句は指示節と呼ばれることもある
#pragma omp parallel
ブロック内を並列化する
#include
#include
int main()
{
#pragma
{
printf("hello openMP ! \n");
}
return 0;
}
PhenomII 940(4コア)の場合の出力結果
nkym@linux-5z45:~/Documents/testOpenMP> ./a.out
hello openMP !
hello openMP !
hello openMP !
hello openMP !
※OpenMP指示文にnum_threads(10)とすると並列化数が10となるが、無しでコンパイラにて最適化される
#pragma omp for
forループを並列化する
- omp_get_thread_num()
スレッド番号 - omp_get_num_threads()
スレッド数#include #include int main(void) { int a[] = {1,2,3,4,5,6,7,8,9,10}; int b[10] = {0}; int i; #pragma omp parallel { #pragma omp for for(i = 0; i < 10; i++){ b[i] = a[i]; printf("i = %d,スレッド番号=%d,スレッド数=%d\n" ,i, omp_get_thread_num(),omp_get_num_threads()); } } for(i = 0; i < 10; i++){ printf("b[%d] = %d\n",i,b[i]) } return 0; }PhenomII 940(4コア)の出力結果
nkym@linux-5z45:~/Documents/testOpenMP> ./a.out i = 3,スレッド番号=1,スレッド数=4 i = 4,スレッド番号=1,スレッド数=4 i = 5,スレッド番号=1,スレッド数=4 i = 9,スレッド番号=3,スレッド数=4 i = 0,スレッド番号=0,スレッド数=4 i = 1,スレッド番号=0,スレッド数=4 i = 2,スレッド番号=0,スレッド数=4 i = 6,スレッド番号=2,スレッド数=4 i = 7,スレッド番号=2,スレッド数=4 i = 8,スレッド番号=2,スレッド数=4 b[0] = 1 b[1] = 2 b[2] = 3 b[3] = 4 b[4] = 5 b[5] = 6 b[6] = 7 b[7] = 8 b[8] = 9 b[9] = 10
#pragma omp sections
逐次プログラムを分割して並列処理する
#include
#include
int main()
{
#pragma
#pragma
{
#pragma omp section
{
printf("section0:スレッド番号 = %d , スレッド数 = %d \n",
omp_get_thread_num(),omp_get_num_threads());
}
#pragma omp section
{
printf("section1:スレッド番号 = %d , スレッド数 = %d \n",
omp_get_thread_num(),omp_get_num_threads());
}
#pragma omp section
{
printf("section2:スレッド番号 = %d , スレッド数 = %d \n",
omp_get_thread_num(),omp_get_num_threads());
}
}
return 0;
}
PhenomII 940(4コア)での実行結果
nkym@linux-5z45:~/Documents/testOpenMP> ./a.out
section0:スレッド番号 = 0 , スレッド数 = 4
section1:スレッド番号 = 2 , スレッド数 = 4
section2:スレッド番号 = 1 , スレッド数 = 4
参考文献
- OpenMP入門 マルチコアCPU時代の並列プログラミング(北山洋幸,2009,秀和システム)