おいも貴婦人ブログ

生物系博士課程満期退学をしたAIエンジニアのブログ。

はじめてのOpenMP(1)

OpenMPを使って簡単なプログラムを書いてみました。

  • #pragma omp parallel num_threads(4):OpenMPの始まりとスレッド数の指定する。
  • #pragma omp for:OpenMPを使って、forを各スレッドに分割する。
  • omp_get_thread_num():スレッドの番号を取得する。
  • omp_get_num_threads():総スレッド数を取得する。
  • #pragma omp for内でprintfできない。これはprintf()関数がスレッドセーフでないからかな?
#include <stdio.h>
#include <omp.h>

int main(void){
    int a[10];
    int b[10];
    int c[10];
    int d[10];
    int i;

    for(i=0;i<10;i++){
        a[i]=i;
        b[i]=0;
        c[i]=i;
        d[i]=0;
        
    }
#pragma omp parallel num_threads(4)
    {
#pragma omp for
        for(i=0;i<10;i++){
            b[i]=a[i];
            //printf("i=%d,thread=%d,num_thuread=%d\n",i,omp_get_thread_num(),omp_get_num_threads());
            c[i]=omp_get_thread_num();
            d[i]=omp_get_num_threads();
        }
    }
    for(i=0;i<10;i++)
        printf("i=%d,thread=%d,num_thuread=%d\n",i,c[i],d[i]);
    return 0;
}

結果

i=0,thread=0,num_thuread=4
i=1,thread=0,num_thuread=4
i=2,thread=0,num_thuread=4
i=3,thread=1,num_thuread=4
i=4,thread=1,num_thuread=4
i=5,thread=1,num_thuread=4
i=6,thread=2,num_thuread=4
i=7,thread=2,num_thuread=4
i=8,thread=2,num_thuread=4
i=9,thread=3,num_thuread=4