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
运算符进行缩减。