如何创建一个Linux集群以在Java中运行物理模拟?

6
我正在开发一个科学应用程序,用于进行物理模拟。所使用的算法是O(n3),因此对于大量数据集,处理时间非常长。该应用程序在大约17分钟内运行模拟,并且我必须运行大约25,000个模拟。那将需要一年左右的处理时间。
好消息是,这些模拟完全独立于彼此,因此我可以轻松地更改程序以在多台计算机之间分配工作负载。
我可以看到多种解决方案来实现这一点:
1.获取多核计算机并在所有核心之间分配工作负载。不足以满足我的需求。 2.编写一个连接到多个“处理”服务器并在它们之间分配负载的应用程序。 3.获取便宜的Linux计算机群,并使程序将所有内容视为单个实体。
选项2相对容易实现,因此我不太需要有关如何实现此操作的建议(只需编写等待给定端口上的参数、处理值并将结果返回为序列化文件的程序即可)。那将是网格计算的一个很好的例子。
然而,我对最后一个选项(传统集群)的可能性感到好奇。在linux网格中运行Java程序有多难?所有单独的计算机是否被视为具有多个内核的单个计算机,从而使其易于适应该程序?是否有任何好的资源指针可以让我入门?或者我是否过于复杂化了,最好选择第二个选项?
编辑:作为额外信息,我对如何实现类似Wired Magazine中描述的内容感兴趣:Scientific replaced a supercomputer with a Playstation 3 linux cluster。明显第二个选项听起来是正确的选择...但酷炫因素。
编辑2:计算非常CPU密集。基本上涉及大量的矩阵操作,例如求逆和乘法。我试图寻找更好的算法来执行这些操作,但到目前为止,我发现我需要的操作是0(n3)(在通常可用的库中)。数据集很大(对于这样的操作),但它是基于输入参数在客户端上创建的。
我现在明白了Linux下计算机集群的工作原理。我曾经认为,它的工作方式就好像你拥有一个具有多个内核的计算机一样,所有计算机上的处理器都可用。但事实并非如此。所有这些超级计算机都是通过节点执行由某个中央实体分配的任务来工作的,并且有几种不同的库和软件包可轻松执行此分发。
因此,问题真正变成了:没有第三种方法,那么创建集群Java应用程序的最佳方法是什么?

仿真是CPU限制还是I/O限制?是否有大型输入数据集? - bajafresh4life
8个回答

5
我非常推荐Java并行处理框架,特别是在您的计算已经独立的情况下。我在本科时就做了很多与此相关的工作,它非常有效。实现的工作已经为您完成,因此我认为这是实现“2号目标”的好方法。 http://www.jppf.org/

有趣的框架,肯定会让实现第二个变得更简单。 - Mario Ortegón

3

第三步并不难。它需要开发两个不同的应用程序,客户端和监管者。客户端基本上就是您已经拥有的应用程序,运行模拟。然而,它需要进行修改,以便使用TCP/IP或其他协议连接到监管者,并请求一组模拟参数。然后,它运行模拟并将结果发送回监管者。监管者监听来自客户端的请求,并为每个请求从数据库中获取未分配的模拟,并更新数据库以指示该项目已分配但未完成。当模拟完成时,监管者会使用结果更新数据库。如果监管者将数据存储在实际数据库(如MySql等)中,则可以轻松查询模拟的当前状态。这应该能够很好地扩展,直到向所有客户端提供模拟数据所需的时间等于执行模拟所需的时间。


这仍然是第二个,但它更或多或少是我所设想的,只是使用文件而不是数据库。 - Mario Ortegón

2
在Linux集群上分发计算的最简单方式是使用MPI。我建议您下载并查看MPICH2。它是免费的。他们的主页在这里 如果您的模拟完全独立,您不需要大多数MPI的功能。您可能需要编写几行C代码来与MPI进行接口,并启动脚本或Java程序的执行。

还要考虑OpenMPI(open-mpi.org) - Todd Gamblin
我不会说MPI是“最简单”的方法。在我看来,JPPF也很不错。虽然,我有点偏爱它。 :) - BobbyShaftoe

2
你应该去看看Hazelcast,它是Java中最简单的点对点(无集中式服务器)集群解决方案。试试Hazelcast分布式ExecutorService来在集群上执行你的代码。
祝好,
-talip

1

1

你已经提到了它,但是否决了它:多核。如果你有足够的核心,你可以选择多核心。目前一个热门话题是GPGPU计算。特别是NVIDIA的CUDA是一种非常有前途的方法,如果你有许多独立的任务需要进行相同的计算。一块GTX 280可以为你提供280个核心,可以同时计算1120-15360个线程。两块显卡就可以解决你的问题。如果它真的可行取决于你的算法(数据流与控制流),因为所有标量处理器都以SIMD方式运行。

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


这个需要多少钱? - Mario Ortegón
看看你最喜欢的硬件经销商。NVIDIA GTX 280 当然是顶级产品,售价400欧元,但你不需要最先进的显卡。CUDA支持几乎所有最近的显卡,例如性能出色的GTS 8800,售价不到80欧元。 但对于这个问题非常重要:你的算法是什么样子? - flolo

1

你的算法有多优化?是否使用原生BLAS库?从朴素库切换到优化库可以获得大约一个数量级的性能提升。一些库(如ATLAS)还可以自动将计算分布在系统上的多个CPU上,因此可以自动处理第1个问题。

据我所知,集群通常不被视为单个实体。它们通常被视为单独的节点,并使用MPI和SCALAPACK等技术将矩阵的元素分布到多个节点上进行编程。如果数据集无论如何都适合单个节点的内存中,则这并不能帮助您太多。


我正在使用JAMA,据我所知它不是一个优化的库。那么似乎唯一的选择就是第二个选项。我希望Linux集群能像单个实体一样处理。 - Mario Ortegón

1

十年前,我所在的公司曾考虑过类似的虚拟化解决方案,当时 Sun、Digital 和 HP 都支持该解决方案,但只有最先进的超级计算机才具备硬件热插拔等功能。此后,我听说 Linux 支持您正在寻找的虚拟化类型,但我自己从未使用过。

Java 原语和性能

然而,如果您要进行矩阵计算,您需要使用本地代码而不是 Java(假设您正在使用 Java 原语)。特别是缓存未命中非常昂贵,而在数组中交错排列会降低性能。在矩阵和本地代码中使用非交错的内存块将为您带来大部分加速,而无需额外的硬件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接