嗨,只是想知道这是否是正确的循环,但有两个减少的正确方法,这是正确的方法下面?这也可以减少两次以上.有一个更好的方法吗?还有没有机会将它与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) ...
私人线程变量将用于创建sum和result将使用相结合+,并在线程块的最后分配给原来的全局变量.
此外,变量y应标记为私有.
请参阅https://computing.llnl.gov/tutorials/openMP/#REDUCTION
您只需添加另一个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)
可以在指令上指定任意数量的约简条款,但列表项只能在该指令的reduction子句中出现一次.
在使用oMP v2.0的Visual C++上也是如此:还原VC++
| 归档时间: |
|
| 查看次数: |
30297 次 |
| 最近记录: |