OpenMP最小值数组

我有原始代码:

min = INT_MAX; for (i=0;i<N;i++) if (A[i]<min) min = A[i]; for (i=0;i<N;i++) A[i]=A[i]-min; 

我想得到这个的并行版本,我做了这个:

 min = INT_MAX; #pragma omp parallel private(i){ minl = INT_MAX; #pragma omp for for (i=0;i<N;i++) if (A[i]<minl) minl=A[i]; #pragma omp critical{ if (minl<min) min=minl; } #pragma omp for for (i=0;i<N;i++) A[i]=A[i]-min; } 

并行代码是对的吗? 我想知道是否有必要在#pragma omp critical之前编写#pragma omp barrier,以便确保在计算全局最小值之前计算所有最小值。

代码是正确的。 没有必要添加#pragma omp barrier因为当一个线程进入临界区时不需要计算所有min_l 。 在循环区域的末尾还存在隐式屏障。

此外,您不一定需要显式声明循环迭代变量i private。

您可以使用简化而不是手动合并minl来改进代码:

 #pragma omp for reduction(min:min) for (i=0;i 

注意:自OpenMP 3.1起,可以使用min运算符进行缩减。