并行计算 MPI 函数总结

发布于 2021-06-06  4 次阅读


MPI_Init

int MPI_Init(int* argc, char** argv[]);
MPI_Init(&argc, &argv);    // argc, argv form main

    告知MPI系统进行所有必要的初始化设置。例如,系统可能需要为消息缓冲区分配存储空间,为进程指定进程号等。在调用MPI_Init前不应该调用其他MPI函数。

MPI_Finalize

int MPI_Finalize();

    告知MPI系统MPI已经所使用完毕,为MPI而分配的所有资源都可以释放。

MPI_Comm_size

int MPI_Comm_size (MPI_Comm comm ,int* size )

int numprocs;
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);      // get number of processes

    获得进程个数 size。
    指定一个通信子,也指定了一组共享该空间的进程, 这些进程组成该通信子的group(组)。
    获得通信子comm中规定的group包含的进程的数量。

MPI_Comm_rank

int MPI_Comm_rank (MPI_Comm comm ,int* rank)

int myid;
MPI_Comm_rank(MPI_COMM_WORLD, &myid);  // get current process id

    得到本进程在通信空间中的rank值,即在组中的逻辑编号(该 rank值为0到p-1间的整数,相当于进程的ID。)

MPI_Send

int MPI_Send(
    void *buff, int count, MPI_Datatype datatype,
    int dest, int tag, MPI_Comm comm
)

MPI_Send(message, strlen(message), MPI_CHAR, 1,99,MPI_COMM_WORLD);

    void *buff:你要发送的变量。
    int count:你发送的消息的个数(注意:不是长度,例如你要发送一个int整数,这里就填写1,如要是发送“hello”字符串,这里就填写6(C语言中字符串未有一个结束符,需要多一位))。
    MPI_Datatype datatype:你要发送的数据类型,这里需要用MPI定义的数据类型,可在网上找到,在此不再罗列。
    int dest:目的地进程号,你要发送给哪个进程,就填写目的进程的进程号。
    int tag:消息标签,接收方需要有相同的消息标签才能接收该消息。
    MPI_Comm comm:通讯域。表示你要向哪个组发送消息。

MPI_Recv

int MPI_Recv(
    void *buff, int count, MPI_Datatype datatype,
    int source, int tag, MPI_Comm comm, MPI_Status *status
)

MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);

    void buff:你接收到的消息要保存到哪个变量里。
    int count:你接收消息的消息的个数(注意:不是长度,例如你要发送一个int整数,这里就填写1,如要是发送“hello”字符串,这里就填写6(C语言中字符串未有一个结束符,需要多一位))。它是接收数据长度的上界. 具体接收到的数据长度可通过调用MPI_Get_count 函数得到。
    MPI_Datatype datatype:你要接收的数据类型,这里需要用MPI定义的数据类型,可在网上找到,在此不再罗列。
    int dest:接收端进程号,你要需要哪个进程接收消息就填写接收进程的进程号。
    int tag:消息标签,需要与发送方的tag值相同的消息标签才能接收该消息。
    MPI_Comm comm:通讯域。
    MPI_Status
status:消息状态。接收函数返回时,将在这个参数指示的变量中存放实际接收消息的状态信息,包括消息的源进程标识,消息标签,包含的数据项个数等。

实例 – Send与Recv

#include "mpi.h"
main( argc, argv )
int argc;   char **argv;
{
     char message[20];
     int myrank;
     MPI_Status status;
     MPI_Init( &argc, &argv );
     MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
     if (myrank == 0) /*  若是 0  进程*/
     {  
          strcpy(message,"C:Hello, process 1");
          MPI_Send(message, strlen(message), MPI_CHAR, 1,99,MPI_COMM_WORLD);
     }
     else if(myrank==1) /*  若是进程 1 */
     {
         MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);
         printf("received :%s:", message);
     }
     MPI_Finalize();
}