私が探しているのは、並列 for ループからすべてのデータを 1 つの変数に収集する最良の方法は何かということです。OpenMP には、スキャッター ルーチンとギャザー ルーチンを持つ OpenMPI を最初に学習し始めたときに見慣れているものとは異なるルーチンがあるようです。
PI の計算 (恥ずかしい並列ルーチン)
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_STEPS 100
#define CHUNKSIZE 20
int main(int argc, char *argv[])
{
double step, x, pi, sum=0.0;
int i, chunk;
chunk = CHUNKSIZE;
step = 1.0/(double)NUM_STEPS;
#pragma omp parallel shared(chunk) private(i,x,sum,step)
{
#pragma omp for schedule(dynamic,chunk)
for(i = 0; i < NUM_STEPS; i++)
{
x = (i+0.5)*step;
sum = sum + 4.0/(1.0+x*x);
printf("Thread %d: i = %i sum = %f \n",tid,i,sum);
}
pi = step * sum;
}
編集: 配列 sum[*NUM_STEPS / CHUNKSIZE*] を使用して、配列を 1 つの値に合計するか、何らかのブロッキング ルーチンを使用して各反復の積を合計する方がよいようです