MPI编程(三)——MPI常用的六个接口
六个接口是最常用的,也是最基本的
1. MPI初始化
1 | MPI_INIT( ) |
初始化MPI系统,所有MPI程序的第一条可执行语句都是这条。在许多MPI系统中,第一个进程通过MPI_Init
来启动其他进程。
2. MPI结束
1 | MPI_FINALIZE( ) |
用于退出MPI系统,是MPI程序的最后一个调用,否则程序的运行结果不可预知。
3. 当前进程标识
1 | MPI_COMM_RANK(comm,rank) |
这一调用返回调用进程在给定的通信域中的进程标识号,有了这一标识号,不同的进程就可以将自身和其他的进程区别开来,实现各进程的并行和协作。
4. 通信域包含的进程数
1 | MPI_COMM_SIZE(comm,size) |
这一调用返回调用给定的通信域中所包含的进程的个数,不同的进程通过这一调用得知在给定的通信域中一共有多少个进程在并行执行。
5. 消息发送
1 | MPI_SEND(buf,count,datatype,dest,tag,comm) |
MPI_SEND将发送缓冲区中的count个datatype数据类型的数据发送到目的进程,目的进程在通信域中的标识号是dest,本次发送的消息标志是tag,使用这一标志,就可以把本次发送的消息和本进程向同一目的进程发送的其它消息区别开来。
MPI_SEND操作指定的发送缓冲区是由count个类型为datatype的连续数据空间组成,起始地址为buf 。注意这⾥不是以字节计数,⽽是以数据类型为单位指定消息的⻓度,这样就独⽴于具体的实现 ,并且更接近于⽤户的观点。
其中datatype数据类型可以是MPI的预定义类型,也可以是⽤户⾃定义的类型,将在后
⾯的部分介绍,通过使⽤不同的数据类型调⽤MPI_SEND,可以发送不同类型的数据。
6. 消息接收
1 | MPI_RECV(buf,count,datatype,source,tag,comm,status) |
MPI_RECV从指定的进程source接收消息,并且该消息的数据类型和消息标识和本接收
进程指定的datatype和tag相⼀致,接收到的消息所包含的数据元素的个数最多不能超过count。
接收缓冲区是由count个类型为datatype的连续元素空间组成,由datatype指定其类型,起始地址为buf。接收到消息的⻓度必须⼩于或等于接收缓冲区的⻓度,这是因为如果接收到的数据过⼤,MPI没有截断,接收缓冲区会发⽣溢出错误,因此编程者要保证接收缓冲区的⻓度不⼩于发送数据的⻓度。如果⼀个短于接收缓冲区的消息到达,那么只有相应于这个消息的那些地址被修改, count可以是零,这种情况下消息的数据部分是空的。
其中datatype数据类型可以是MPI的预定义类型,也可以是⽤户⾃定义的类型。通过指
定不同的数据类型调⽤MPI_RECV,可以接收不同类型的数据。
7. 返回状态status
返回状态变量status⽤途很⼴,它是MPI定义的⼀个数据类型,使⽤之前需要⽤户为它分
配空间。在C中,状态变量是由⾄少三个域组成的结构类型,这三个域分别是:MPI_SOURCE,MPI_TAG和MPI_ERROR。它还可以包括其它的附加域。这样通过对
status.MPI_SOURCE status.MPI_TAG和status.MPI_ERROR的引⽤,就可以得到返回状态中所包含的发送数据进程的标识,发送数据使⽤的tag标识和本接收操作返回的错误代码。
除了以上三个信息之外,对status变量执⾏MPI_GET_COUNT调⽤可以得到接收到的消
息的⻓度信息。
#例子
1 | //⼀个简单的发送和接收的例⼦ |