1.3 点对点通信
点对点通信是MPI中最常用的基础通信模式。一个进程发送数据,另一个进程接收数据。发送进程需要指定发送的数据、接收数据的进程号和通信域。考虑到一些老式消息传递系统,每个消息还有一个消息号,消息号的数据类型为单精度非负整数。同理,接收进程需要指定数据接收地址、数据来源进程号、通信域和消息号。另外,可能需要提供一个消息状态参数,用于保存数据接收的状态信息。
针对早期的消息传递系统和多数文件I/O库,用包含地址和字节数的二元数组指定数据缓冲区。MPI将该二元数组扩展成三元数组,三元数组包含地址、数据类型和数据个数(指定数据类型的个数,而非字节数)。在简单例子中,MPI中数据类型与基本编程语言的数据类型相似。例如,用C语言指定10个整数类型数据的缓冲区,MPI的语句表达方式为(address,10,MPI_INT)。这种方法方便程序编写者指定数据,因为程序编程者无需知道每一种数据类型的具体字节数。同时,该方法使MPI程序能够在混合硬件平台上运行,即使该混合硬件平台数据类型的字节数不一致(这是MPI库的重要特性)。另外,如1.4节所述,MPI允许在内存中指定不连续的数据缓冲区。
在MPI_Send函数参数中,通信域中的进程号指定数据发送到具体哪个进程,并提供通信文本。消息号是一个非负整数类型,其最大值取决于MPI的具体实现方式,但至少为32 767。
MPI_Recv接收函数与发送函数的参数类似。不同之处在于接收函数允许指定接收数据缓冲区大小大于实际发送的数据大小。消息号和数据来源进程号可用具体数字指定(例如消息号为15和数据来源进程号为3),也可使用通配符类型的数值(例如消息号为MPI_ANY_TAG和数据来源进程号为MPI_ANY_SOURCE)。MPI_ANY_TAG允许用户发送一个额外整数类型的数据(例如具体消息号数值);MPI_ANY_SOURCE通过非确定性算法确定进程号。状态参数的消息值由发送数据的进程提供。若不需要状态信息,可通过MPI_STATUS_IGNORE进行指定。
图1-2是0号进程向MPI_COMM_WORLD通信域中其他所有进程发送相同数据的程序示例。该程序示例是MPI的基本或者标准发送模式,MPI还提供其他数据发送模式,例如同步发送模式、就绪发送模式和缓冲发送模式。在1.5节中,将介绍非阻塞式通信模式。