OpenMP 並列プログラミング1の続きです。

for文で並列化してみましょう。

forループの前に#pragma omp parallel forを追加するだけです。

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

int main()
{

int i;

#pragma omp parallel for
for (i = 0; i < 5; i++) {
printf("i = %d: thread number = %d\n", i, omp_get_thread_num());
}

return 0;
}
$ ./openmp1
i = 4: thread number = 3
i = 3: thread number = 2
i = 2: thread number = 1
i = 0: thread number = 0
i = 1: thread number = 0 

$ ./openmp1
i = 0: thread number = 0
i = 1: thread number = 0
i = 3: thread number = 2
i = 4: thread number = 3
i = 2: thread number = 1

iの並びがランダムになっています。 


並列プログラミングのサンプルソースを読んでみました。OpenMPのポイントです。

一時的な変数にはprivate, 結果を残す変数にはreductionを変数に付ける。

配列を加算するプログラム。
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#define MAX 50000

int *box;

int main()
{
int i, total = 0;

box = malloc(MAX * sizeof(int));
for (i = 0; i <= MAX; i++) {
box[i] = i;
}

#pragma omp parallel
{
printf("thread = %d, %d\n", omp_get_thread_num(), omp_get_num_threads());

#pragma omp for reduction(+:total)
for (i = 0; i <= MAX; i++) {
total += box[i];
}
}
printf("total = %d\n", total);
return 0;
}

$ gcc openmp2.c -o openmp2 -fopenmp
$ ./openmp2
thread = 0, 4
thread = 2, 4
thread = 3, 4
thread = 1, 4
total = 1250025000
 
結果を残すのでtotal変数にはreduction(+:total)を付けています。
変数totalをスレッドで共有する必要があります。

実験でreductionなしにして、 #pragma omp for に変更してみてください。
間違った結果が帰ってきます。

参考サイト
OpenMP チュートリアル 

OpenMP* を使用したワークシェアリング