您只是想知道这是否是正确的循环方式,但有两次减少,这是正确的方法吗?这也可以减少两次以上。有一个更好的方法吗? 还有没有机会将它与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)
}
答案 0 :(得分:26)
您可以通过指定由逗号分隔的多个变量(即列表:
)来进行缩减 #pragma omp parallel for default(shared) reduction(+:sum,result) ...
将为sum
和result
创建专用线程变量,这些变量将使用+
进行组合,并分配给线程块末尾的原始全局变量。
此外,变量y
应标记为私有。
答案 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++