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

pyC*_*hon 16 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)
      }
Run Code Online (Sandbox Code Playgroud)

dev*_*vil 27

您可以通过指定由逗号分隔的多个变量(即列表)来进行缩减:

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

私人线程变量将用于创建sumresult将使用相结合+,并在线程块的最后分配给原来的全局变量.

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

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


Azm*_*sov 9

您只需添加另一个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;
}
Run Code Online (Sandbox Code Playgroud)

来自OpenMP 4.5完整规范(2015年11月)

可以在指令上指定任意数量的约简条款,但列表项只能在该指令的reduction子句中出现一次.

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

  • @Royi也许是因为第一个减少项后面的逗号?我不记得使用逗号来区分 omp 参数。 (3认同)