采用消息传递的并行程序可以用下面的图来表示:
消息传递模型的优点:
普遍性:消息传递模型与采用通信网络互连的分布式多处理器系统有相当直接的对应关系,因此,它可以应用在当前的大多数分布式并行计算机系统上,比如工作站网络(NOW)和PC集群系统。而对于共享存储的并行计算机系统,消息传递模型则可以利用硬件的特点来提高数据传输的速度。
表达能力:研究和实践已经表明,从并行算法的表达能力方面看,消息传递模型是一种相当完全的模型。它可以有效的控制数据的局部性,这是数据并行模型所缺乏的。
由于支持消息通信对系统的硬件和软件的要求都不高,因此消息传递模型在并行程序设计中被广泛采用。最简单的可以采用消息传递方式编程的并行计算机系统包括多个处理器,每个处理器有自己的存储器,他们用某种形式的互联网络连接在一起。因此,消息传递模型不仅可以用来编写分布内存并行计算机系统的程序,也可以用来编写集群系统上的程序。而在共享存储器系统中,消息传递可以用共享存储器来代替互连网络,因此,消息传递模型具有可以适应多种体系结构的要求。从软件的角度来说,采用消息传递的系统通常以消息传递库的形式出现,库中包含了发送了接收消息所需要的函数。这使得可以以现有的串行程序语言为基础来开发消息传递的程序。一个消息传递的库从严格意义上来说,只需要提供两个函数:一个用来发送消息,一个用来接收消息,但事实上,绝大多数最近出现的消息传递库比如CMMD,NX,MPL和MPI都提供了额外的函数调用来进行复杂的通信操作,比如在一组处理器中进行集合通信的操作。
然而对消息传递程序相对简单的硬件和软件的要求,通常会增加消息传递程序本身的开发的复杂性。采用消息传递的并行程序不仅需要显式的给出问题中可以提供的并行性,还需要显式的管理解决问题所需要的数据传输。相反的,依赖于编译器(并行编译器)来生成并行程序的方案要简单的多,比如用编译器来完成并行性开发和必要通信的自动生成,因为他们的输入通常是串行程序。但是,由于技术方面的原因,由并行编译器产生的并行程序的性能通常都很低。对分布存储的并行计算机系统来说,利用显式的消息传递模型来开发并行程序仍然是目前唯一有效的手段。
典型的消息传递程序都只有单个的可运行程序,这个程序在并行计算机系统的指定的处理器上运行,在程序中,处理器之间的通信只通过发送和接收消息来完成。消息的交换用来完成处理器之间的数据交换,工作分配和同步工作。
开发数据并行性的消息传递程序通常利用消息来在处理器之间传输所需的数据。而开发任务并行性的消息传递程序则利用消息来在处理器之间传递任务。比如,在一个并行程序中,某些处理器(生产者)会动态的产生一些任务,通过消息传递,这些任务被分配到其他的处理器上(消费者)去,消息被用来把任务从生产者进程传递到消费者进程。另外,当多个处理器需要到达某些特定的状态时,消息被用来在处理器之间传递必要的(同步)信息。比如在前面的生产者-消费者例子中,只有在消费者进程已经完成了所有分配给它的任务以后,生产者进程才会给这个消费者进程发送新的任务。这可以通过下面的方法来实现:当消费者进程完成了所有分配给它的任务之后,消费者进程需要给生产者进程发送一个请求分配任务的消息,这个消息既不包含数据也不包含任务,它只是用来同步生产者和消费者。
消息传递程序的基本操作主要是发送和接收消息。由于发送操作和接收操作在处理器对之间进行--一个发送消息而另外一个接收,所以被称为点到点通信操作。
从理论上来讲,这两个操作就足以实现任何的消息传递程序,所以这两个操作是消息传递库所需要提供的最小功能集。在实际的程序中,进程组(处理器组)之间经常需要以某种规则的模式来进行数据通信,比如,在许多的程序中,一个处理器需要把一些信息发送给所有的处理器(广播)。我们可以用基本的发送和接收操作来实现这个广播,但一个更好的方式是定义一个广播函数以便每次需要广播的时候就直接调用。由于这类操作需要被所有的参与其中的处理器并发的执行,所以也被称为集合通信操作。需要注意的是,这种广播的功能在(底层)实现的时候(也许)仍然需要使用点到点通信的操作,但对不同的系统结构来说,它的实际实现方式可以针对体系结构的特点进行优化。过去开发消息传递并行程序(特别是那些开发数据并行性的消息传递程序)的经验表明,对绝大多数消息传递程序来说,提供一组这样的集合通信操作往往可以有效的描述程序中出现的大多数通信模式。因此,目前大多数消息传递库都提供了一套函数来进行集合通信操作。这些操作的提供有效的简化了消息传递并行程序的开发、调试、维护并带来了更高的性能。
|