【发布时间】:2017-04-24 21:49:26
【问题描述】:
我有原码:
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,以便确保在计算全局最小值之前计算所有最小值。
【问题讨论】:
-
不,这是不对的。尽管可以使用critical,但为此目的,OpenMP 4.0 中添加了#pragma omp for reduction(min: ....)。几乎有足够的理由使用最新的实现。
-
如果我想不减少,我需要改变什么?
-
您似乎犹豫是否要设置内部 simd 缩减和外部并行线程缩减(如果问题足够大,这是一个好方法)。单线程 simd 减少可能高达 N
-
完整的工作代码会有所帮助;例如,您不会告诉任何有关数据类型与编译器身份的信息。