OpenMP最小值数组

时间:2016-12-09 12:00:54

标签: c openmp minimum

我有原始代码:

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,以便确保在计算全局最小值之前计算所有最小值。

1 个答案:

答案 0 :(得分:2)

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

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

您可以使用缩减代替手动合并minl

来改进代码
#pragma omp for reduction(min:min)
for (i=0;i<N;i++)
  if (A[i]<min)
    min=A[i];

注意:自从OpenMP 3.1以来,min减少运算符可用。