`
isiqi
  • 浏览: 16023295 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

构建自己的基于 Java 的超级计算机

阅读更多

如果您曾想过构建自己的超级计算机,但却对用 C 语言进行并行编程望而生畏,那么伪远程线程可以帮您解决这一问题。这种获奖的 Java 编程模型极大地简化了集群上的并行编程,并使超级计算走出实验室,使每一位 Java 程序员都能使用它。
在过去的三年里,并行集群已在改变着超级计算的面貌。一旦价值数百万美元的单体机占了主导,并行集群很快就会成为超级计算机的选择。可以想像得到,开放源码圈内的高涨热情已导致产生了数百 -- 如果不是数千的话 -- 并行集群项目。第一个同时也是最著名的开放源码集群系统是 Beowulf。在 NASA 赞助下,由 Thomas Sterling 和 Donald Becker 在 1994 年发布的 Beowulf,开始是作为一个 16 节点演示集群推出的。今天,Beowulf 已有数百种实现,从 Oak Ridge 国家实验室的 Stone SouperComputer 到 Aspen 系统公司的定制构建的商业性集群(请参阅参考资源)。

对 Java 程序员不利的是,多数集群系统都是围绕基于 C 语言的软件消息传递 API — 如消息传递接口(MPI)或并行虚拟机(PVM)— 来实现的。用 C 语言进行并行编程不是件容易的事,因此我设计了一个替代方案。本文将说明如何综合运用 Java 线程和 Java 远程方法调用(RMI)来创建自己的基于 Java 的超级计算机。

请注意,本文假定您有 Java 线程和 RMI 的应用知识。

超级计算机内有什么?
超级计算机的定义是:由八个或更多的节点组成、作为单个高性能机器工作的集群。基于 Java 的超级计算机包含一个作业调度器和任意数量的运行服务器(也称为主机)。作业调度器生成多个线程,每个线程包含执行不同子任务的代码。各个线程将其代码迁移到不同的运行服务器上。然后,每个运行服务器执行迁移给它的代码并将结果返回给作业调度器。最后,作业调度器将各个线程的结果组合起来。

这种并行集群系统之所以被称为伪远程线程,是因为线程是在作业调度器上调度的,但线程内的代码却是在远程计算机上执行的。

该系统有哪些组件?
组件一词是指组成“伪远程线程”并行集群系统的逻辑模块。该系统包含以下组件:


Job dispatcher(作业调度器) 是执行控制的机器。它生成不同的线程,每个线程都包含此集群要处理的主任务的一个子任务。每个线程内的代码都被发送到一台远程计算机去执行。线程在作业调度器上调度,所以理论上讲,该机器不应该用于执行任何子任务。


SubTask 是一个用户定义类,该类定义主任务的一个数据或功能独立的部分。您可以为主任务的不同部分定义不同的类。类名 SubTask 是一个示例。您可以为一个 SubTask 类取任何名字,不过这个名字应该能描述分配给它的子任务。在定义 SubTask 类时,您必须实现 JobCodeInt 接口以及 jobCode() 方法,下面对其进行说明。


JobCodeInt 是一个 Java 接口。您必须在定义子任务的类中实现该接口和 jobCode() 方法。jobCode() 方法描述了将在远程执行的代码。如果您打算在远程使用某个本地资源,您必须在 jobCode() 方法外部初始化这个资源。比方说,您要将一组图像发送到远程处理,就必须在 jobCode() 方法外部初始化 Image 对象。您可以在该方法中调用标准 Java 库中的类,因为远程计算机上存在这些库。


RunServer 是一个 Java 对象,该对象允许远程过程调用其方法。它的一个方法以实现了 JobCodeInt 接口的对象作为参数。 RunServer 就在运行该对象的计算机(运行服务器)上执行该对象内的代码,并将计算结果作为 Object 类的一个实例返回。Object 是 Java 类层次结构中最高一级的类。


PseudoRemThr 是一个 Java 类,该类封装了一个线程并接受给定 SubTask 类的一个实例。它选择一台远程主机,并将 SubTask 实例发送到这台主机上执行。如果您要利用某台主机上可用的特定资源(诸如数据库或是打印机),则可以指定主机。


HostSelector 是一个模块。如果您没有指定远程主机,PseudoRemThr 类就会调用 HostSelector 模块来选择特定的主机。如果没有空闲的主机,HostSelector 会返回负载最小的远程计算机。如果某个远程计算机是一个多处理器系统,HostSelector 可能会不止一次地返回该主机名。目前,HostSelector 无法根据给定任务的复杂程度来选择主机。
伪远程线程的工作方式
要使用伪远程线程,您必须实现作业调度器和运行服务器。本节将说明如何实现各个部分。

实现作业调度器
首先,将主任务分解为数据或功能独立的子任务。针对每个子任务,定义一个实现 JobCodeInt 接口(从而实现 jobCode() 方法)的类。在 jobCode() 方法中,定义各给定子任务要执行的代码。

请注意,您不能调用作业调度器上用户定义的的本地资源。请在该方法外部初始化所有这类资源。例如,您可以在 SubTask 类的构造函数中初始化这类资源。

创建类 PseudoRemThr 的若干实例,并将 SubTask 的实例传递给 PseudoRemThr 的各个实例。如果您要明确指定一台远程主机,您可以通过调用 PseudoRemThr 对象的另一个构造函数来完成。

等待这些线程完成。调用 getResult() 方法来获取 PseudoRemThr 的各个实例的执行结果。如果计算没有完成,结果返回一个值为 false 的 Boolean 对象;否则,将返回 Object 类的一个实例,其中包含了计算结果。您必须将此实例转换为您所希望的类类型。将所有的子任务结果组合为最终结果。

实现运行服务器
实现运行服务器是一项简单的工作:

启动 RMI 注册程序。
启动 RunServer。
运行服务器在启动时接通作业调度器,并通知作业调度器它已准备就绪,可以接受要执行的任务了。

一个计算示例
现在该测试这一模型了。以下计算示例使用两台计算机并行运行。一台是运行 Windows 98 的 333 MHz Pentium II 计算机,另一台是运行 Windows 2000 专业版的 500 MHz Pentium III 计算机。

为了计算从 1 到 10^9 的所有整数的平方根之和,我创建了 Sqrt 类,它计算 dblStart 和 dblEnd 之间所有整数的平方根之和。

Sqrt 实现 JobCodeInt 接口,因此也实现了 jobCode() 方法。在 jobCode() 方法中,我定义了完成这一计算的代码。

构造函数用于将数据传递给 Sqrt 类,并初始化作业调度器上的所有本地资源。必须将要计算其平方根之和的整数的起止点发送给构造函数。清单 1 是 Sqrt 类的定义

清单 1. 定义 Sqrt 类

//Sqrt 类计算 dblStart 和 dblEnd 之间的所有整数的平方根之和。
//计算在 jobCode() 方法内完成
//该类实现 JobCodeInt 接口,且实现代码位于 jobCode() 方法内
//在构造函数中将数据传递给该类,并初始化作业调度器上的本地资源。
//本例中,要计算其平方根之和的整数序列的起止点被发送给 Sqrt 类
public class Sqrt implements JobCodeInt
{

double dblStart, dblEnd, dblPartialSum;

public Sqrt(double Start,double End)
{
dblStart = Start;
dblEnd = End;
}

public Object jobCode()
{
dblPartialSum = 0;
for(double i=dblStart;i<=dblEnd;i++)
//可调用标准的 Java 函数和对象。
dblPartialSum += Math.sqrt(i);

//返回结果,一个标准 Java 类的对象。
return (new Double(dblPartialSum));
}
}





JobDispatcher 类创建 Sqrt 类的两个实例。然后分解主任务,将一项子任务分配给一个 Sqrt 对象(Sqrt1),并将余下的子任务分配给另一个 Sqrt 对象(Sqrt2)。接下来,JobDispatcher 创建 PseudoRemThr 类的两个对象,并将 Sqrt 对象作为参数分别传递给它们。接下来就等待线程执行。

一旦线程执行完毕,就可从每个 PseudoRemThr 实例获得部分结果。将各部分结果组合起来即可得到最终结果,如清单 2 所示。

清单 2. 工作中的 JobDispatcher

//此类可以命名为您选择的任何名称
//这里选用 JobDispatcher 只是为了方便

public class JobDispatcher
{
public static void main(String args[])
{
double fin = 10000000; //代表 10^9
double finByTen = fin/10; //代表 10^8
long nlStartTime = System.currentTimeMillis();
//范围从 1 到 3*10^8
Sqrt sqrt1 = new Sqrt(1,finByTen*3);
//范围从 ((3*10^8)+1) 到 10^9
Sqrt sqrt2 = new Sqrt((finByTen*3)+1,fin);

//以下创建 PseudoRemThr 类的两个实例。 //此构造函数的参数如下所示。 //第一个参数:代表子任务的某个类的实例
//第二个参数:执行这一子任务的远程主机
//第三个参数:PseudoRemThr 实例的描述性名称。
PseudoRemThr psr1 = new
PseudoRemThr(sqrt1,"//192.168.1.1:3333/","Win98");
PseudoRemThr psr2 = new
PseudoRemThr(sqrt2,"//192.168.1.2:3333/","Win2K");

psr1.waitForResult(); //等待执行结束//获取每个线程的结果
Double res1 = (Double)psr1.getResult();
Double res2 = (Double)psr2.getResult();
double finalRes = res1.doubleValue() + res2.doubleValue();

long nlEndTime = System.currentTimeMillis();
System.out.println("Total time taken: " + (nlEndTime-nlStartTime));
System.out.println("Sum: " + finalRes);
}
}




性能评价
此计算的总执行时间在 120,000 毫秒到 128,000 毫秒之间。如果在不分解任务的情况下在本地运行同样的任务,执行时间将在 183,241 到 237,641 毫秒之间。

最初,主任务包括计算从 1 到 10^7 的所有整数的平方根之和。为测试性能,我将计算范围扩大到 10^8,最终扩大到 10^9。

随着任务量的增加,远程并行执行和本地执行所需时间的差别也越来越明显。这就是说,当执行大型任务时,远程并行执行消耗的时间较少。远程并行执行并不适合小型任务,因为机器间通信的系统开销不容忽视。随着任务量的增加,机器间通信的开销与在单个机器上执行全部任务的开销相比逐渐变得微不足道。因此,我得出以下结论:伪远程线程系统能很好地完成需要进行大量计算的任务。

使用伪远程线程有哪些优点?
因为伪远程线程是一种基于 Java 的系统,它可以用于实现包含多种操作系统的集群,或异构集群。使用伪远程线程,您就避免了转换原有 C/C++ 代码的麻烦,而且还能利用 Java 标准库及其各种扩展库。此外,伪远程线程使您不必关心内存管理。当然,其缺点就是系统性能与 JRE 性能直接相关。

发展方向
现在相当多的商业应用程序都是用 Java 平台创建的,并考虑到为了利用并行性需要转换原有的 C/C++ 代码的实际困难,现在可能是基于 Java 的超级计算进入商业领域的时候了。在开始创建基于 Java 的应用程序时就将并行性和负载均衡考虑在内是个不错的开端。

互联网就是异构集群的一个很好的例子,因此伪远程线程可以在因特网中部署,将 Web 转换为一个单一的、基于 Java 的超级计算机(要了解这一概念的细节,请参阅参考资源)。然而,从实际应用出发,您应注意到在一个专门执行单一任务的同构集群中将获得最佳结果。

最后,从日常应用出发,伪远程线程使得将局域网(LAN)-- 诸如校园网和家庭网 -- 转换为微型的超级计算机变得相当简单。这就是 Beowulf 系统开创的用法。有了伪远程线程,Java 编程人员也可以创建自己的超级计算机了。

参考资源

"Linux clustering cornucopia"(developerWorks, 2000 年 5 月)为您指点迷津,让您了解当前 Linux 上可用的开放源码集群解决方案和保密源码集群解决方案。


要了解关于分布式操作系统的详细信息,请查看 Andrew S. Tanenbaum 的 Modern Operating Systems(Prentice Hall 出版公司,1992 年 2 月)。


要了解关于并行编程的详细信息,请参阅 Gregory V. Wilson 的 Practical Parallel Programming(麻省理工学院出版社,1995 年 12 月)。


要进一步理解集群,请参阅 Scalable Computing Laboratory 的 Cluster Cookbook。


有关运用 Java 技术和 Web 进行超级计算的深层探讨,请参阅 Laurence Vanhelsuw 的 "Create your own supercomputer with Java?"(JavaWorld, 1997 年 1 月)。


Linux Documentation Project 托管着 Beowulf HOWTO 文档。


访问 Beowulf 网站,以了解 Beowulf 项目的详细信息。


请参阅关于 Oak Ridge 国家实验室著名的 Stone SouperComputer 的详细信息。


Aspen 系统公司是目前提供定制集群解决方案的少数厂商之一。

分享到:
评论

相关推荐

    基于JAVA超级玛丽游戏GUL 设计软件源码+WORD毕业论文文档.zip

    Java建立在TCP/IP网络平台上,提供了用HTTP和FTP协议传送和接收信息的库函数,使用其相关技术可以十分方便的构建分布式应用系统。 5. 健壮性 Java致力与检查程序在编译和运行时的错误,并自动回收内存,减少了内存...

    java源码包---java 源码 大量 实例

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    基于JAVA JSP计算机等级考试查询系统的毕业设计,采用j2sdk1.4.1-07版本进行开发,使用RESIN服务器当做测试服

    计算机等级考试查询系统主要解决不同类型的用户怎样进行不同类型的查询,即超级管理员、系管理员和学生用户怎样进行不同权限的查询。这样限定权限便于管理,而且查询结果一目了然。 当然在开发软件系统的漫长过程中...

    java源码包4

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包3

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包2

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式...

    基于JAVA JSP+SQL计算机等级考试查询系统的毕业设计,采用j2sdk进行开发,使用RESIN服务器当做测试服务器,采用m

    计算机等级考试查询系统主要解决不同类型的用户怎样进行不同类型的查询,即超级管理员、系管理员和学生用户怎样进行不同权限的查询。这样限定权限便于管理,而且查询结果一目了然。 当然在开发软件系统的漫长过程中...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式...

    Java课程设计-基于JavaWeb和Mysql实现的宿舍管理系统源码带数据库+详细说明文档.zip

    Java课程设计-基于JavaWeb和Mysql 实现的宿舍管理系统源码带数据库+详细说明文档.zip 本系统采用MVC+J2EE+MYSQL实现,使用是Tomcat10.0作为WEB服务器,提供适应性强的Internet服务器功能,具有很高的执行效率。其中...

    超级有影响力霸气的Java面试题大全文档

    它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是...

    计算机毕业设计javassm网络硬硬盘系統网站程序源码数据库mysql.zip

    本系统基于SSM(Spring+SpringMVC+MyBatis)框架,适用于毕业设计,采用javaweb,基于B/S模式,Myeclipse或者eclipse idea为开发工具,mysql数据库,感兴趣的朋友们可以下载研究一下。 二、功能介绍 本系统主要包含了等系统...

    基于vue+Springboot的网上书城与其对应的后台管理系统源码+sql数据库+项目说明(高分毕设).zip

    * MyBatis:基于Java的持久层框架。 * Mybatis-plus:MyBatis (opens new window)的增强工具。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机...

    基于SpringBoot+ORM-Mybatis+SpringMVC和多种组件构建的企业信息化开发基础平台源码+项目说明.zip

    1、基于SpringBoot+ORM-Mybatis+SpringMVC和多种组件构建的企业信息化开发基础平台源码+项目说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、...

    本科毕业设计开题报告(计算机协会信息管理系统的设计与实现V5)

    Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球...

    本科毕业设计开题报告(飞翔的小鸟游戏的设计与实现V3)

    飞翔的小鸟游戏使用的开发工具是一个开放源代码的、基于Java的可扩展开发平台eclipse来开发实现。Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件...

    win7 超级终端

    1、将自己的启动信息、过程信息主动发到运行有超级终端的主机; 2、将接收到的字符返回到主机,同时发送需要显示的字符(如命令的响应等)到主机。 终端,即计算机显示终端,是计算机系统的输入、输出设备。...

Global site tag (gtag.js) - Google Analytics