我们可以加速java中的CPU密集型任务吗?

时间:2012-01-06 18:00:25

标签: java parallel-processing

使用BigInteger查找2000的factorial是一项CPU密集型任务的任务,无论如何都要加速这样的过程吗?

Ex:找到2000! 由于它只是一个单独的任务,我认为这里不需要线程(因为运行此程序或在线程中运行此任务都必须执行此类CPU密集型操作)。

我听说Java 7为计算密集型任务引入了一种新的并行机制。 那么,我该如何在其中执行此类事情呢?

2 个答案:

答案 0 :(得分:12)

可以通过最终合并轻松地将因子拆分为两个任务。如果您愿意,这是某种map-reduce。

示例:

9! = (7*5*3*1) * (8*6*4*2)

所以你可以有两个任务。

这可以推广到任何数量的并行任务中。

此解决方案与Java无关,具体涉及将“常规”解决方案转换为并行解决方案。

答案 1 :(得分:2)

可以简单地向WolframAlpha提交一个查询,然后在几分之一秒内回复一个近似答案(at least for 2,000!,甚至10,000,000,000!),如果您只需要近似值大因子,可能绰绰有余。

以下是您自己challenges around calculating large factorials上的维基百科文章,其中一些您已经发现过。

您真正想要做的是尝试减少需要完成的工作总量。最简单的方法是将结果存储在表中,然后进行查找。包含所有这些值的表可能非常大,但如果存储不是您的情况的限制,那么这是一种方法。

简单地尝试并行化它不会使你在CPU上节省(除非你计算一个近似值,而不是精确的数字),因为你做了相同数量的总工作,但是把它分散出来。此外,并行化任何事情都需要一些开销(线程间/进程间通信,分布式内存,如果问题空间足够大,各种各样的东西)。并行化任何算法的地方是一个巨大的胜利,就是当你能够成功地将问题分解成更小的块时,并将这些块有效地分散出去以便有时间......

  • 发送出去的块
  • 计算了块数
  • 发回结果
  • 合并结果

...成本较低(按时间,金钱,储存,电力或任何有限的资源衡量)比做系列更便宜,和/或它提供一些价值(时间,金钱,存储等)。 已保存),以便有效弥补费用。

相关问题