6

我正在开发一个用于执行物理模拟的科学应用程序。使用的算法是 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 应用程序的最佳方法是什么?

4

8 回答 8

5

我强烈推荐 Java 并行处理框架,特别是因为您的计算已经是独立的。我和这个本科生做了很多工作,效果很好。实现的工作已经为您完成,所以我认为这是实现“第二”目标的好方法。

http://www.jppf.org/

于 2008-12-02T11:03:44.003 回答
3

3号不难做到。它需要开发两个不同的应用程序,客户端和主管。客户端几乎就是您已经拥有的,一个运行模拟的应用程序。但是,它需要进行更改,以便它使用 TCP/IP 或其他方式连接到主管并请求一组模拟参数。然后它运行模拟并将结果发送回主管。主管侦听来自客户的请求和每个请求,从数据库获取未分配的模拟并更新数据库以指示项目已分配但未完成。模拟完成后,主管用结果更新数据库。如果主管将数据存储在实际数据库(MySql 等)中,则可以轻松地在数据库中查询模拟的当前状态。

于 2008-12-02T11:29:53.577 回答
2

在 Linux 集群上分配计算的最简单方法是使用 MPI。我建议您下载并查看 MPICH2。免费。 他们的主页在这里

如果您的模拟完全独立,则不需要 MPI 的大部分功能。您可能需要编写几行 C 代码来与 MPI 交互并开始执行您的脚本或 Java 程序。

于 2008-12-05T20:49:29.857 回答
2

您应该查看Hazelcast,这是 Java 最简单的 peer2peer(无集中式服务器)集群解决方案。尝试使用 Hazelcast Distributed ExecutorService 在集群上执行您的代码。

问候,

-塔利普

于 2009-05-15T06:09:53.167 回答
1

您已经提出了建议,但取消了它的资格:多核。如果你有足够的核心,你可以选择多核。一个热门话题是 GPGPU 计算。特别是。如果您有许多必须执行相同计算的独立任务,则 NVIDIA 的 CUDA 是一种非常优先的方法。GTX 280 为您提供 280 个内核,可同时计算多达 1120 - 15360 个线程。一对可以解决你的问题。如果它真正可实现取决于您的算法(数据流与控制流),因为所有标量处理器都以 SIMD 方式运行。

缺点:它将是 C/C++,而不是 java

于 2008-12-02T11:59:44.763 回答
1

你的算法优化到什么程度?你在使用原生 BLAS 库吗?通过从幼稚的库切换到优化的库,您可以获得大约一个数量级的性能提升。一些,如 ATLAS 也会自动将计算分布在系统上的多个 CPU 上,以便自动涵盖项目符号 1。

AFAIK 集群通常不被视为单个实体。它们通常被视为单独的节点,并使用 MPI 和 SCALAPACK 之类的东西进行编程,以将矩阵的元素分布到多个节点上。如果您的数据集无论如何都适合一个节点上的内存,这并不能真正帮助您。

于 2008-12-02T15:32:27.613 回答
1

你看过兵马俑吗?

对于工作分配,您需要使用Master/Worker 框架

于 2009-01-27T07:44:58.963 回答
1

十年前,我工作的公司研究了一个类似的虚拟化解决方案,当时 Sun、Digital 和 HP 都支持它,但只使用具有硬件热插拔等的最先进的超级计算机。从那时起,我听说 Linux 支持您正在寻找的解决方案 #3 的虚拟化类型,但我自己从未使用过它。

Java原语和性能

但是,如果您进行矩阵计算,您希望在本机代码中进行,而不是在 Java 中(假设您使用的是 Java 原语)。尤其是缓存未命中是非常昂贵的,并且在阵列中交错会降低性能。矩阵和本机代码中的非交错内存块将为您提供大部分加速,而无需额外的硬件。

于 2009-06-15T17:33:26.703 回答