【问题标题】:Parallel computing for integrals [closed]积分的并行计算[关闭]
【发布时间】:2010-04-13 11:36:02
【问题描述】:

我想通过拆分积分范围来减少耗时积分的计算时间。我正在使用 C++、Windows 和四核 Intel i7 CPU。

如何将其拆分为 4 个并行计算?

【问题讨论】:

    标签: c++ parallel-processing


    【解决方案1】:

    你的积分算法是什么?

    在数学上,范围积分是部分积分的总和,因此并行化似乎微不足道。

    【讨论】:

    • 从数学上讲,这是一个无限的和,可以解释耗时的部分;)说真的,在实际使用中,使用的算法比简单的std::accumulate() 更复杂
    • 好吧,小心对浮点数求和。失去精度。
    • 感谢您的回复。集成只是对值求和,但我认为我遇到了更深的麻烦:代码是用 Borland c++ v5.02 编写的,显然我首先必须迁移到支持并行计算的编译器。这个问题我单独提一下……
    【解决方案2】:

    使用OpenMP。 gcc 支持它。 Visual C++ 支持它。

    【讨论】:

    • ...Intel C++ 支持,大家都支持。
    • 你是对的。由于是windows下开发,我假设用Visual C++编译...
    【解决方案3】:

    正如其他人所说,我相信您会知道集成就是求和,并行化应该很容易 我知道您使用的是 C++,但是否有可能使用 go?使用goroutines 来完成这类工作非常容易。但我知道如果这段代码要发给客户,你会不愿意使用 go,因为它还没有在野外进行测试。如果这是一个个人项目,那就去吧(没有双关语)。

    【讨论】:

      【解决方案4】:

      分两部分解决:

      1) 您将采用哪种并行化方法:MPI、OpenMP、线程、您有什么?和

      2) 如何修改算法。

      在四核 Windows 机器上,我建议 OpenMP 作为我对此第一部分的回答。第二部分的答案取决于您使用的算法。例如,如果您使用蒙特卡洛技术,并行化是微不足道的。如果您正在使用某种数值求积,那么确保其他人已经确定的极端情况都不会成为严重问题就变得不那么简单了。但是,如果您可以排除病态积分,那应该不会太难

      【讨论】:

        【解决方案5】:

        我建议你看看英特尔的线程构建块。

        http://www.threadingbuildingblocks.org/

        尤其是parallel_reduce

        【讨论】:

          【解决方案6】:

          您将遇到的问题是边界条件。

          很容易认为数值求积可以分解为多个域,但你不知道内部边界条件是什么。

          将积分分解为子域听起来像是有限元、有限差分或边界元解。您已经将一个复杂的域分解为多个部分,将其转换为矩阵,并在已知的边界条件下对其进行求解。

          我认为这不像将域分解为子域并将每个子域分配给一个处理器那么简单,但我可能错了。

          【讨论】:

            【解决方案7】:

            您可以使用 Trapezoidal rule(或任何其他 Newton-Cotes 公式)计算积分。为了获得更好的结果,您可以对区间进行分段并对每个分段使用梯形规则。该公式可以在链接的文章中找到。

            由于每个计算相互独立,因此您可以并行执行它们。最简单的方法是 OpenMP(如上所述)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-09-02
              • 1970-01-01
              • 1970-01-01
              • 2018-04-11
              • 1970-01-01
              • 2022-01-19
              • 1970-01-01
              相关资源
              最近更新 更多