複数のスレッドで実行しているときにdoubleの配列の最大値を計算するC(gcc)関数を作成しようとしています。サイズの配列を作成しますomp_get_num_threads
。この配列には、この小さな配列を最終的に最大化する前に、各スレッドの極大値を格納します。コードは(多かれ少なかれ)次のとおりです。
int i;
double *local_max;
double A[1e10]; //made up size
#pragma omp parallel
{
#pragma omp master
{
local_max=(double *)calloc(omp_get_num_threads(),sizeof(double));
}
#pragma omp flush //so that all threads point
//to the correct location of local_max
#pragma omp for
for(i=0;i<1e10;i++){
if(A[i]>local_max[omp_get_thread_num()])
local_max[omp_get_thread_num()]=A[i];
}
}
free(local_max);
ただし、これはsegfaultにつながり、valgrindは初期化されていない変数の使用について不平を言います。結局のところ、local_maxは、for
構成に入る前にすべてのスレッドで実際に更新されるわけではありません。私#pragma omp flush
はそれをすべきだと思いましたか?に置き換えると#pragma omp barrier
、すべて正常に動作します。
誰かが私に何が起こっているのか説明してもらえますか?