C++ 具有两个或多个缩减的openmp并行for循环
大家好,我只是想知道这是否是一个正常的for循环的正确方法,但是有两个减少,这是下面的正确方法吗?如果减少两次以上,这是否也有效。有更好的方法吗? 还有没有机会将其与MPI_ALLREDUCE命令集成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
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参数。