C++ 具有两个或多个缩减的openmp并行for循环

C++ 具有两个或多个缩减的openmp并行for循环,c++,c,openmp,C++,C,Openmp,大家好,我只是想知道这是否是一个正常的for循环的正确方法,但是有两个减少,这是下面的正确方法吗?如果减少两次以上,这是否也有效。有更好的方法吗? 还有没有机会将其与MPI_ALLREDUCE命令集成 heres the psuedo code #pragma omp parallel for \ default(shared) private(i) \ //todo first reduction(+:sum) //todo second r

大家好,我只是想知道这是否是一个正常的for循环的正确方法,但是有两个减少,这是下面的正确方法吗?如果减少两次以上,这是否也有效。有更好的方法吗? 还有没有机会将其与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)
      }
这里是psuedo代码
#pragma-omp并行\
默认(共享)私有(i)\
//todo首次减少(+:总和)
//todo秒减少(+:结果)
对于回路i
您可以通过指定多个以逗号分隔的变量来进行缩减,即列表:

#pragma omp parallel用于默认(共享)缩减(+:求和,结果).

将为
sum
result
创建私有线程变量,这些变量将使用
+
组合,并分配给线程块末尾的原始全局变量

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


请参见

您可以简单地添加另一个
缩减
子句:

#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;
}
#包括
#包括
int main(){
双和i=0,最大i=-1;
#pragma omp并行减少(+:求和i)减少(max:max\u i)
对于(int i=0;i max_i)
max_i=i;
}

std::如果要执行不同的操作,例如
+
max
,该怎么办?@mightyuhu看到我的回答了吗?GCC 7.1中不起作用。知道如何应用两种不同的归约吗?@Royi可能是因为第一个归约词后的逗号?我不记得逗号被用来区分omp参数。