【问题标题】:OpenMP minimum value arrayOpenMP 最小值数组
【发布时间】: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
  • 完整的工作代码会有所帮助;例如,您不会告诉任何有关数据类型与编译器身份的信息。

标签: c openmp minimum


【解决方案1】:

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

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

您可以通过减少而不是手动合并minl来改进代码:

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

注意:用于缩减的 min 运算符从 OpenMP 3.1 开始可用。

【讨论】:

  • Visual Studio 2017 说:'min': invalid operator token in OpenMP 'reduction' clause。有什么想法吗?
  • @Royi afaik Vs 仅支持 Openmp 2.0,该标准的古老版本。
  • 是的。似乎他们支持一些减少,但 min / max 不是其中之一。
猜你喜欢
  • 1970-01-01
  • 2016-09-10
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2017-02-13
  • 1970-01-01
  • 2012-02-11
相关资源
最近更新 更多