OpenMP > 構文

OpenMP指示文

  • #pragma omp 〜に当たる部分。 続くブロックが並列化対象になる。
    #pragma omp 指示文名 [指示句[[,]指示句]...]
    

※原則、指示文には1つの指示文名しか書けない ※指示句は指示節と呼ばれることもある

#pragma omp parallel

ブロック内を並列化する

#include <omp.h>
#include <stdio.h>

int main()
{
#pragma omp parallel
  {
    printf("hello openMP ! \n");
  }
  return 0;
}
+ PhenomII 940(4コア)の場合の出力結果

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 <stdio.h>
    #include <omp.h>
    
    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コア)の出力結果 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 <stdio.h>
#include <omp.h>

int main()
{

#pragma omp parallel
#pragma omp sections
  {
    #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コア)での実行結果

PhenomII 940(4コア)での実行結果

nkym@linux-5z45:~/Documents/testOpenMP> ./a.out
section0:スレッド番号 = 0 , スレッド数 = 4
section1:スレッド番号 = 2 , スレッド数 = 4
section2:スレッド番号 = 1 , スレッド数 = 4


参考文献

  • OpenMP入門 マルチコアCPU時代の並列プログラミング(北山洋幸,2009,秀和システム)
最終更新:2011年03月04日 14:12