【发布时间】:2010-04-13 11:36:02
【问题描述】:
我想通过拆分积分范围来减少耗时积分的计算时间。我正在使用 C++、Windows 和四核 Intel i7 CPU。
如何将其拆分为 4 个并行计算?
【问题讨论】:
我想通过拆分积分范围来减少耗时积分的计算时间。我正在使用 C++、Windows 和四核 Intel i7 CPU。
如何将其拆分为 4 个并行计算?
【问题讨论】:
你的积分算法是什么?
在数学上,范围积分是部分积分的总和,因此并行化似乎微不足道。
【讨论】:
std::accumulate() 更复杂
使用OpenMP。 gcc 支持它。 Visual C++ 支持它。
【讨论】:
正如其他人所说,我相信您会知道集成就是求和,并行化应该很容易 我知道您使用的是 C++,但是否有可能使用 go?使用goroutines 来完成这类工作非常容易。但我知道如果这段代码要发给客户,你会不愿意使用 go,因为它还没有在野外进行测试。如果这是一个个人项目,那就去吧(没有双关语)。
【讨论】:
分两部分解决:
1) 您将采用哪种并行化方法:MPI、OpenMP、线程、您有什么?和
2) 如何修改算法。
在四核 Windows 机器上,我建议 OpenMP 作为我对此第一部分的回答。第二部分的答案取决于您使用的算法。例如,如果您使用蒙特卡洛技术,并行化是微不足道的。如果您正在使用某种数值求积,那么确保其他人已经确定的极端情况都不会成为严重问题就变得不那么简单了。但是,如果您可以排除病态积分,那应该不会太难
【讨论】:
【讨论】:
您将遇到的问题是边界条件。
很容易认为数值求积可以分解为多个域,但你不知道内部边界条件是什么。
将积分分解为子域听起来像是有限元、有限差分或边界元解。您已经将一个复杂的域分解为多个部分,将其转换为矩阵,并在已知的边界条件下对其进行求解。
我认为这不像将域分解为子域并将每个子域分配给一个处理器那么简单,但我可能错了。
【讨论】:
您可以使用 Trapezoidal rule(或任何其他 Newton-Cotes 公式)计算积分。为了获得更好的结果,您可以对区间进行分段并对每个分段使用梯形规则。该公式可以在链接的文章中找到。
由于每个计算相互独立,因此您可以并行执行它们。最简单的方法是 OpenMP(如上所述)。
【讨论】: