#pragma omp 指示文名 [指示句[[,]指示句]...]
※原則、指示文には1つの指示文名しか書けない ※指示句は指示節と呼ばれることもある
ブロック内を並列化する
#include <omp.h> #include <stdio.h> int main() { #pragma omp parallel { printf("hello openMP ! \n"); } return 0; }
+ | PhenomII 940(4コア)の場合の出力結果 |
※OpenMP指示文にnum_threads(10)とすると並列化数が10となるが、無しでコンパイラにて最適化される
forループを並列化する
#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コア)の出力結果 |
逐次プログラムを分割して並列処理する
#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コア)での実行結果 |
参考文献