openmp并行用于具有两个或多个缩减的循环
openmp parallel for loop with two or more reductions
Hi只是想知道这是否是进行常规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)
}
您可以通过指定多个用逗号分隔的变量来进行约简,即列表:
#pragma omp parallel for default(shared) reduction(+:sum,result) ...
将为sum
和result
创建专用线程变量,它们将使用+
组合并分配给线程块末尾的原始全局变量。
此外,变量y
应标记为private。
请参阅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;
}
来自OpenMP 4.5完整规范(2015年11月)
指令中可以指定任意数量的减少条款,但是列表项只能在该项的reduce子句中出现一次指令。
在使用oMP v2.0的Visual C++上也是如此:reduction VC++
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 如何在for循环中包含两个索引值的测试条件
- 如何使用OpenMP并行这两个循环
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 嵌套在循环中的两个循环的 big-O 表示法
- 使用一个循环与两个循环
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 比较两个字符串后卡在无限循环中
- 如何在循环中打印两个相邻的行,同时在 c++ 中将它们都保留在一行中
- 是否可以在 for 循环中添加两个浮点数?
- 在 for 循环中更新两个变量时遇到问题C++
- SDL GPU 为什么将两个图像分成两个单独的循环更快?
- 当数组位于两个循环之间时,您可以调用数组的 void 函数吗?
- 使用两个 for 循环生成以下星号
- 两个嵌套循环的运行时间复杂性:二次型还是线性
- 比较嵌套 for 循环中的两个 wchar 数组?
- 如何在一个循环中分离两个不同的数组?
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- 循环两个不同长度的向量时的优化