我正在开发一个用于执行物理模拟的科学应用程序。使用的算法是 O(n3),因此对于大量数据需要很长时间来处理。该应用程序在大约 17 分钟内运行一次模拟,而我必须运行大约 25,000 次模拟。这大约是一年的处理时间。
好消息是模拟完全相互独立,因此我可以轻松更改程序以在多台计算机之间分配工作。
我可以看到多种解决方案来实现这一点:
- 获得一台多核计算机并在所有内核之间分配工作。不够我需要做的。
- 编写一个连接到多个“处理”服务器并在它们之间分配负载的应用程序。
- 获得一组便宜的 linux 计算机,并让程序将所有内容视为一个实体。
选项 2 相对容易实现,所以我不太会寻找如何实现它的建议(可以通过编写一个在给定端口上等待参数、处理值并返回结果的程序来完成作为序列化文件)。那将是网格计算的一个很好的例子。
但是,我想知道最后一个选项(传统集群)的可能性。在 linux 网格中运行 Java 程序有多难?所有独立的计算机是否都被视为具有多核的单台计算机,从而使程序适应变得容易?是否有任何好的资源指针可以让我开始?或者我让这变得过于复杂,我最好选择第 2 个选项?
编辑:作为额外信息,我对如何实现 Wired Magazine 的这篇文章中描述的内容很感兴趣:Scientific replace a supercomputer with a Playstation 3 linux cluster。绝对第二听起来像是要走的路……但凉爽因素。
编辑 2:计算非常受 CPU 限制。基本上对大矩阵有很多运算,例如逆和乘法。我试图为这些操作寻找更好的算法,但到目前为止我发现我需要的操作是 0(n3) (在通常可用的库中)。数据集很大(用于此类操作),但它是根据输入参数在客户端创建的。
我现在看到我对 linux 下的计算机集群如何工作有一个误解。我的假设是,它会以这样一种方式工作,即看起来您拥有所有可用计算机中的所有处理器,就像您拥有一台具有多核的计算机一样,但情况似乎并非如此。似乎所有这些超级计算机的工作方式是让节点执行由某个中央实体分配的任务,并且有几个不同的库和软件包可以轻松执行这种分配。
所以问题真的变成了,因为没有数字 3 这样的东西:创建集群 Java 应用程序的最佳方法是什么?