我正在尝试编写一个 C (gcc) 函数,该函数将在跨多个线程运行时计算双精度数组的最大值。我创建了一个 size 数组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);
然而,这会导致段错误,并且 valgrind 抱怨使用了未初始化的变量。for
事实证明,在所有线程进入构造之前,local_max 实际上并未在所有线程中更新。我想#pragma omp flush
应该这样做吗?如果我用 替换它#pragma omp barrier
,一切正常。
有人可以向我解释发生了什么吗?