gpt4 book ai didi

c++ - 并行减少(例如求和)hpx::futures 的 vector

转载 作者:太空狗 更新时间:2023-10-29 22:54:41 26 4
gpt4 key购买 nike

我们目前正在尝试为数值模拟实现红黑高斯-赛德尔求解器。

为此,我们将模拟区域划分为大小相等的子网格。我们能够在具有正确依赖关系和 hpx::dataflow 的每个子网格上异步执行压力方程的红黑循环。目的。

但现在我们有以下问题:在每第 n 个循环之后,我们必须执行残差计算以确定我们是否已经收敛。

因此最佳解决方案是,我们单独/异步地开始每个局部残差计算,然后对 hpx::future<double> 的 vector 求和.借助 HPX future 的理念,可以得出最佳解决方案,即我们尽快总结所有要素。

但到目前为止,我们只能提出以下代码:

#include <hpx/hpx_main.hpp>
#include <hpx/hpx.hpp>
#include <memory>
#include <iostream>

class A {
public:
double residual() {
// Calculate actual local residual
return 1.0;
}
};

int main() {
// Create instances
std::vector<A> vec(3);
std::vector<hpx::shared_future<double>> res(vec.size());

// asynchronous launch resdiual calculation
for (size_t i = 0; i < res.size(); ++i) {
res[i] = hpx::async( &A::residual, &vec[i] );
}

double residual = 0.0;
for (size_t i = 0; i < res.size(); ++i) {
residual += res[i].get();
}

std::cout << "residual: " << residual << std::endl;

return 0;
}

这远非最佳。在最坏的情况下,它的表现就像一个全局屏障,然后是对所有元素的纯顺序求和。

所以我们的问题是我们如何才能像并行一样实现这个“HPX”?

2019 年 2 月 2 日更新:

我们已经重写了代码,因此我们无法完全异步地开始残差计算,而是通过 hpx::dataflow 基于数据依赖性目的。

  // asynchronous launch resdiual calculation
for (size_t i = 0; i < res.size(); ++i) {
res[i] = hpx::dataflow( hpx::util::unwrapping(&A::residual), &vec[i], *DEPENDENCIES* );
}

是否也可以使用数据流对象调用@Mike van Dyke 代码,或者是否有其他解决方案?

(提示:由于 template argument deduction/substitution failed 错误,我没有让您的代码正常工作)

最佳答案

您可以使用transform_reduce 模式来实现您想要实现的目标:

std::vector<A> vec(300);
double res = hpx::parallel::transform_reduce(hpx::parallel::execution::par,
vec.begin(), vec.end(), \\ (1)
0, [](double a, double b){ return a + b; }, \\ (2)
[](const A& a_ref){ return a_ref.residual(); }); \\ (3)

此代码将计算 vec (1) 中每个 A 的残差 (3),然后对所有结果求和 (2)。

关于c++ - 并行减少(例如求和)hpx::futures<double> 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54469381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com