首页 百科知识 基于独立内存的分布式计算

基于独立内存的分布式计算

时间:2022-10-01 百科知识 版权反馈
【摘要】:基于独立内存的并行计算可以用很多方法来实现,既需要有硬件环境,也需要有相应的软件实现。MPI顾名思义,其要解决的核心问题就是消息传递问题。MPI中,一个消息就好比一封信,而消息的内容即信的内容,在MPI中称为消息缓冲,而消息的接收/发送者即信的地址,在MPI中称为消息信封。MPICH是一个比较常用的版本,主要有如下6个基本函数。

19.3 基于独立内存的分布式计算

基于独立内存的并行计算可以用很多方法来实现,既需要有硬件环境,也需要有相应的软件实现。在硬件层面,从基于整个互联网层面的计算到高性能的集群系统都可以用来做并行计算的硬件载体,集群系统由于在各个不同的独立计算单元之间有着很好的搭配及很高的数据交换速度,但是,这种硬件环境对我们研究计算机围棋的人来说未免有些奢侈。对我们来说,最常见的可能就是局域网的环境,尽管其性能较集群无法相比,但是其网络状况较互联网来说却有保障得多,而且我们也很容易去找到这样一个可以利用的局域网环境。

在软件层面上,并行程序的实现主要有以下4个途径:①扩展编译器——扩展现有的编译器以便将串行程序转化为并行程序;②扩展串行编程语言——在现有语言的基础上增加新的操作以允许用户表达并行;③增加并行编程层——在现有串行语言上增加一个并行语言层;④创造一个并行语言——定义一个全新的并行语言和编译系统。

(1)扩展编译器

扩展编译器要解决的问题是如何并行执行函数语言程序或逻辑语言程序,将程序并行化,比如命令式的Fortran等。其优点是可以继续利用现有的大量代码,并且串行编程相对于并行编程来说更简单;而其缺点则是过分依赖编译器寻找并行性,必然比程序员直接进行并行化编程的效率低很多。

(2)扩展串行编程语言

扩展串行编程语言,通过开发一个子进程库,提供让用户能够创建和结束并行进程,并提供进程同步和通信功能的函数,还必须提供区分公共数据(所有进程共享)和私有数据(每个进程拥有一个副本)的手段,如消息传递接口(MPI)等。其优点是程序员能操纵并行处理器的底层函数,为他们的程序开发提供了最大的灵活性;而缺点则是由于编译器并没有参加并行代码的生成,导致程序易于编写却难于调试。

(3)增加并行编程层

增加并行编程层,是把一个并行程序分为上下两层,其中,下层包含计算的核心内容,在其中进行操纵自己的数据并产生结果,而上层则控制着进程的创建和同步,并负责将数据分布到各个进程中去。其缺点是要求程序员学习和使用一种新的并行编程系统。

(4)创造一个并行语言

创造一个并行语言,如occam,可以支持进程的并行和串行执行,以及进程之间的自动通信和同步;HDP(High Performance Fortran),用多种方法来支持数据并行程序;C*,增加shape语句,用于指定并行数据的组织方式。其缺点就是,一个新标准的采用需要实践,由此限制了代码的移植性,而且需要程序员学习新的语句。

综合上述考虑,扩展串行编程语言是一个从各方面讲都不错的选择,在这方面MPI应用得相对比较广泛。其中,MPI是一个库,而非一个语言;更进一步讲,MPI是一个规范,是语言无关的,MPI是一种消息传递编程模型,其最终目的就是解决进程间通信这一目的。

MPI(消息传递接口)顾名思义,其要解决的核心问题就是消息传递问题。MPI中,一个消息就好比一封信,而消息的内容即信的内容,在MPI中称为消息缓冲,而消息的接收/发送者即信的地址,在MPI中称为消息信封。在不同的机器间传递消息时,消息的发送方首先需要将消息打包,然后将打包好的消息发送过去,而消息的接收方在收到打包好的消息之后,需要对消息进行拆包操作,然后再对消息进行使用。

MPI的版本有很多,有MPICH、LAM(Local Area Multicomputer)、CHIMP等。MPICH是一个比较常用的版本,主要有如下6个基本函数。

①int MPI_Init(int*arg,char***argv),完成MPI的初始化工作,通过该函数进入MPI环境完成所有的初始化工作;

②int MPI_Finalize(void),通过该函数从MPI环境中退出,并释放其占有的资源;

③int MPI_Comm_rank(MPI_Comm comm.,int*rank),获取当前进程在指定通信域中的编号,将自身与其他程序区分;

④int MPI_Comm_size(MPI_Comm comm.,int*size),通过调用该函数获得指定通信域的进程个数,确定自身完成任务比例;

⑤int MPI_Send(void*buf,int count,MPI_Datatype dataytpe,int dest,int tag,MPI_Comm comm),用于发送一个消息到目标进程;

⑥int MPI_Recv(void*buf,int count,MPI_Datatype datatyepe,int source,int tag,MPI_Comm comm,MPI_Status*status),用于从指定进程接收一个消息。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈