第三章 点对点通信 |
3.1 介绍
由进程完成的消息的发送和接收是基本的MPI通信机制。基本的点对点通信操作是send 和receive 。他们的用法在下面例子中解释。
#include "mpi.h"
main( argc, argv )
int argc;
char **argv;
{
char message[20];
int myrank;
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
if (myrank == 0) /* 对 0 进程的程序 */
{
strcpy(message,"Hello, there");
MPI_Send(message, strlen(message), MPI_CHAR, 1, 99,MPI_COMM_WORLD);
}
else /* 对 1 进程的程序 */
{
MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status); printf("received :%s:", message);
}
MPI_Finalize();
}
在这个例子中, 进程0 (myrank = 0)使用发送操作MPI_SEND给进程1 发送消息。这个操作在发送存储器中指定一个缓存,消息数据取自这个缓存。在上例中,这个发送缓存是在进程0 中包含变量message 的存储空间。发送缓存的位置、尺寸和类型由发送操作的前三个参数指定。被发送的消息将包含这个变量的13个符号。另外,发送操作把消息和一个信封联系起来。这个信封指定消息的目的地,并包含由receive操作为选择一个特定消息而使用的识别信息。发送操作的后三个参数为所发送的消息指定信封。
进程1 用接收操作MPI_RECV接收这个信号。将被接收的消息按着其信封的值被选择, 消息数据被存入接收缓存。在上面的例子中,接收缓存是由进程1 的存储器中包含串message的存储空间。接收操作的前三个参数指定接收缓存的位置、尺寸和类型。之后的三个参数用于选择将来的消息。最后的参数用于返回所接收消息的信息。
下一节描述阻塞发送和接收操作。我们讨论发送、接收、阻塞通信语义、类型匹配要求、在异构环境中类型匹配,和更一般的通信模式。非阻塞通信在下一部分,然后类通道结构和发送-接收操作。其次,我们考虑一般的数据类型,它我们能有效地转换异构的和非连续的数据。最后,我们以消息的显示打包和解包调用结束本章。
Copyright: NPACT |