OpenMP 最小值数组
OpenMP minimum value array
我有原码:
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
私有。
您可以通过减少而不是手动合并 minl
:
来改进代码
#pragma omp for reduction(min:min)
for (i=0;i<N;i++)
if (A[i]<min)
min=A[i];
注意:min
缩减运算符自 OpenMP 3.1 起可用。
我有原码:
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
私有。
您可以通过减少而不是手动合并 minl
:
#pragma omp for reduction(min:min)
for (i=0;i<N;i++)
if (A[i]<min)
min=A[i];
注意:min
缩减运算符自 OpenMP 3.1 起可用。