我希望通过拆分积分范围来减少耗时积分的计算时间。我正在使用C ++,Windows和四核Intel i7 CPU。
如何将其拆分为4个并行计算?
答案 0 :(得分:3)
您的整合算法是什么?
数学上,积分超出范围是积分的总和,因此并行化似乎微不足道。
答案 1 :(得分:2)
使用OpenMP。 gcc支持它。 Visual C ++支持它。
答案 2 :(得分:1)
正如其他人所说的那样,我相信你会知道整合就是总结,所以parellization应该很容易 我知道你使用的是C ++,但是有可能使用go吗?使用goroutines来完成这类工作非常容易。但我明白,如果这个代码是针对客户的,那么你将不愿意使用go,因为它仍然没有在野外进行测试。如果是个人项目,那就去吧(没有双关语)。
答案 3 :(得分:1)
分为两部分:
1)你要采取什么样的并行化方法:MPI,OpenMP,线程,你有什么用?和
2)如何修改算法。
在四核Windows机器上,我建议使用OpenMP作为我对第一部分的回答。第二部分的答案取决于您使用的算法。例如,如果您使用的是蒙特卡罗技术,那么并行化就是微不足道的。如果你正在使用某种数值求积法,那么确保其他人没有发现的任何一个角点案件都成为严重问题就不那么容易了。但是,如果你可以排除病理积分,那就不应该太难了
答案 4 :(得分:0)
答案 5 :(得分:0)
你遇到的问题是边界条件。
很容易认为数值求积可以分解成几个域,但你不知道内部边界条件是什么。
将积分分解为子域开始听起来像有限元,有限差分或边界元解。你已经采取了一个复杂的领域,分成几块,把它变成一个矩阵,并根据你所知的边界条件解决它。
我认为这不像将域名分解为子域并将每个域分配给处理器那么简单,但我可能错了。
答案 6 :(得分:0)
您可以使用Trapezoidal rule(或任何其他Newton-Cotes公式)计算积分。要获得更好的结果,您可以对时间间隔进行分段,并对每个段使用梯形规则。该公式可以在链接的文章中找到。
由于每个计算都独立于另一个,因此可以并行执行。最简单的方法是OpenMP(如上所述)。