openmp并行for循环,有两个或更多的减少

时间:2012-02-22 02:01:18

标签: c++ c openmp

您只是想知道这是否是正确的循环方式,但有两次减少,这是正确的方法吗?这也可以减少两次以上。有一个更好的方法吗? 还有没有机会将它与MPI_ALLREDUCE命令集成?

heres the psuedo code

      #pragma omp parallel for \
      default(shared) private(i) \
      //todo first  reduction(+:sum)
      //todo second reduction(+:result)

      for loop i < n; i ++; {
        y = fun(x,z,i)
        sum += fun2(y,x)
        result += fun3(y,z)
      }

2 个答案:

答案 0 :(得分:26)

您可以通过指定由逗号分隔的多个变量(即列表:

)来进行缩减

#pragma omp parallel for default(shared) reduction(+:sum,result) ...

将为sumresult创建专用线程变量,这些变量将使用+进行组合,并分配给线程块末尾的原始全局变量。

此外,变量y应标记为私有。

请参阅https://computing.llnl.gov/tutorials/openMP/#REDUCTION

答案 1 :(得分:6)

您只需添加另一个reduction子句:

#include <iostream>
#include <cmath>

int main(){
    double sum_i = 0, max_i = -1;
    #pragma omp parallel for reduction(+:sum_i) reduction(max:max_i)
    for (int i=0; i<5000; i++){
        sum_i += i;
        if (i > max_i)
            max_i = i;
    }
    std::cout << "Sum = " << sum_i << std::endl;
    std::cout << "Max = " << max_i << std::endl;
    return 0;
}

来自OpenMP 4.5 Complete Specifications (Nov 2015)

  

可以在指令中指定任意数量的约简条款,但是   列表项只能在减少子句中出现一次   指令。

在使用oMP v2.0的Visual C ++上也是如此:reduction VC++