我正在开发用于执行物理模拟的科学应用程序。所使用的算法为O(n3),因此对于大量数据而言,需要很长时间才能处理。该应用程序将在大约17分钟内运行一次模拟,而我必须运行大约25,000次模拟。大约一年的处理时间。
好消息是,模拟彼此完全独立,因此我可以轻松地更改程序,以在多台计算机之间分配工作。
我可以看到实现此目的的多种解决方案:
选项2相对容易实现,因此我对如何实现它的建议并不多(可以通过编写一个程序在给定端口上等待参数,处理值并返回结果来完成)作为序列化文件)。那将是网格计算的一个很好的例子。
但是,我不知道最后一个选择的可能性,即传统集群。在linux网格中运行Java程序有多困难?是否将所有单独的计算机都视为具有多个内核的单台计算机,从而使程序易于调整?是否有任何好的资源指南可以让我开始使用?还是我使这个问题变得过于复杂了,所以我最好选择2号?
编辑:作为额外的信息,我对如何实现《连线杂志》这篇文章中所述的内容感兴趣:Scientific用Playstation 3 linux集群代替了超级计算机。绝对地,第二个听起来像是要走的路…但是凉爽因素。
编辑2:计算非常受CPU限制。基本上,在大型矩阵上有很多运算,例如逆和乘法。我试图为这些操作寻找更好的算法,但到目前为止,我发现我需要的操作为0(n3)(在通常可用的库中)。数据集很大(用于此类操作),但是它是根据输入参数在客户端上创建的。
现在,我发现我对Linux下的计算机集群的工作方式有误解。我假设它会以某种方式工作,就好像您拥有所有可用计算机中的所有处理器一样,就好像您有一台具有多个内核的计算机一样,但事实并非如此。似乎所有这些超级计算机都是通过执行由某个中央实体分发的任务的节点来工作的,并且有几种不同的库和软件包可以轻松地执行此分发。
因此,真正的问题是,因为没有数字3,创建一个集群Java应用程序的最佳方法是什么?
我会极力推荐Java并行处理框架,尤其是因为您的计算已经独立。我和这个本科生做了很多工作,效果很好。实施工作已经为您完成,因此我认为这是实现“第二个”目标的好方法。
http://www.jppf.org/