MPI常用接口笔记

MPI常用接口

最近在学mpi程序设计,经常要用的mpi的接口函数,故整理如下:

MPI_Init()

  int MPI_Init(
      int* argc_p           /* in/out */,
      char *** argv_p       /* in/out */);

该函数告知MPI系统进行必要的初始化设置,参数argc_p和argv_p分别是指向argc和argv的指针,可以直接设置为NULL;返回值为int型错误码,大多数情况下可以忽略这些错误码。在调用MPI_Init()之前,不应该调用其他MPI函数

MPI_Finalize()

  int MPI_Finalize(void);

该函数告诉MPI系统MPI已经使用完,可以释放所有为MPI分配的资源了。在该函数之后,不应再调用MPI函数

MPI_Comm_size()

  int MPI_Comm_size(
    MPI_Comm comm       /* in */,
    int* comm_sz        /* out */);

该函数获取给定通信子中线程的数目,comm传入给定通信子,comm_sz传出线程数目。

MPI_Comm_rank()

  int MPI_Comm_rank(
    MPI_Comm comm       /* in */,
    int* my_rank        /* out */);

该函数获取给定通信子中该进程的进程号,comm传入给定通信子,my_rank传出进程号。

MPI_Send()

  int MPI_Send(
    void* msg_buffer_p      /* in */,
    int msg_size            /* in */,
    MPI_Datatype msg_type   /* in */,
    int dest                /* in */,
    int tag                 /* in */,
    MPI_Comm comm           /* in */);

该函数在进程间发送消息。msg_buffer_p是一个指向包含消息内容的内存块的指针;msg_size表示数据长度;msg_type表示数据类型;dst表示目的进程号;tag是个非负int型,标签,同一标签才能被接受;comm是通信子,所有涉及通信的MPI函数都有通信子参数。

该函数有两种可能性:

  • 缓冲消息,当消息长度小于系统的截止长度,MPI系统会将消息放置在它自己的内部存储器,并返回MPI_Send的调用
  • 阻塞,当消息长度大于系统的截止长度时,该进程陷入阻塞,将一直等待,直到可以开始发送消息,并不立即返回MPI_Send的调用。
    数据类型如下:
MPI 数据类型 C语言数据类型 MPI数据类型 C语言数据类型
MPI_CHAR signed char MPI_UNSIGNED unsigned int
MPI_SHORT signed short int MPI_UNSIGNED_LONG unsigned long int
MPI_INT signed int MPI_FLOAT float
MPI_LONG signed long int MPI_DOUBLE double
MPI_LONG_LONG signed long long int MPI_LONG_DOUBLE long double
MPI_UNSIGNED_CHAR unsigned char MPI_BYTE
MPI_UNSIGNED_SHORT unsigned short int MPI_PACKED

MPI_Recv()

  int MPI_Recv(
      void* msg_buffer_p        /* out */,
    int msg_size            /* in */,
    MPI_Datatype msg_type   /* in */,
    int source              /* in */,
    int tag                 /* in */,
    MPI_Comm comm           /* in */,
    MPI_Status* status_p    /* out */);

该函数在进程间接收消息。该函数的参数与MPI_Send()的参数相似,不同之处在于source为源进程号,status_p在大多数情况下不使用,赋予MPI_STATUS_IGNORE就行。

MPI提供特殊的常量MPI_ANY_SOURCE和MPI_ANY_TAG用来统配所有源进程号和所有标签,但是,只有MPI_Recv()可以使用,MPI_Send()必须制定目的进程号和标签。

该函数总是阻塞的,直到接收到一条匹配消息。

MPI_Get_count()

  int MPI_Get_count(
    MPI_Status* status_p        /* in */,
    MPI_Datatype recv_type      /* in */,
    int* count_p                /* out */);

该函数返回接收到的元素数量。MPI_Status类型是一个至少含有三个成员的结构:MPI_SOURCE、MPI_TAG和MPI_ERROR,可以获得发送者、标签和错误类型。元素数量将存在count_p所指向的空间中。

MPI_Reduce()

  int MPI_Reduce(
    void* input_data_p          /* in */,
    void* output_data_p         /* out */,
    int count                   /* in */,
      MPI_Datatype datatype     /* in */,
      MPI_Op operator               /* in */,
      int dest_process          /* in */,
      MPI_Comm comm             /* in */);

规约函数。input_data_p是源数据的地址,output_data_p是存放目的数据的地址,两者都既可以是标量,也可以是向量;count>1,表示input_data和output_data是向量;operator是规约操作符。

参数output_data_p只用在dest_process上,但是所有进程都需要传递一个与output_data_p相对应的实际参数,即使是NULL.

运算符值 含义 运算符值 含义
MPI_MAX 求最大值 MPI_LOR 逻辑或
MPI_MIN 求最小值 MPI_BOR 按位或
MPI_SUM 求累加和 MPI_LXOR 逻辑异或
MPI_PROD 求累乘积 MPI_BXOR 按位异或
MPI_LAND 逻辑与 MPI_MAXLOC 求最大值和最大值所在位置
MPI_BAND 按位与 MPI_MINLOC 求最小值和最小值所在位置

MPI_Allreduce()

  int MPI_Reduce(
    void* input_data_p          /* in */,
    void* output_data_p         /* out */,
    int count                   /* in */,
      MPI_Datatype datatype     /* in */,
      MPI_Op operator               /* in */,
      MPI_Comm comm             /* in */);

全局规约函数,规约结果会保存在所有进程中。

MPI_Bcast()

  int MPI_Bcast(
    void* data_p                /* in/out */,
    int count                   /* in */,
    MPI_Datatype datatype       /* in */,
    int source_process          /* in */,
    MPI_Comm comm               /* in */);

该函数用于广播。在一个集合通信中,如果属于同一个进程的数据被发送到通信子中的所有进程,这样的集合通信被称为广播。source_process进程中data_p指向的数据将会存在该通信子中所有进程的data_p指向的空间中。

MPI_Scatter()

  int MPI_Scatter(
    void* send_buffer_p         /* in */,
    int send_count              /* in */,
    MPI_Datatype send_type      /* in */,
    void* recev_buffer_p        /* out */,
    int recev_count             /* in */,
    MPI_Datatype recev_type     /* in */,
    int source_process          /* in */,
    MPI_Comm comm               /* in */);

散射函数,用于分发数据,该函数将send_buffer_p所引用的数据分为comm_sz份,第一份给0号进程,第二份给1号进程,以此类推。send_count表示发送给每个进程的数据量。

MPI_Gather()

  int MPI_Gather(
    void* send_buffer_p         /* in */,
    int send_count              /* in */,
    MPI_Datatype send_type      /* in */,
    void* recev_buffer_p        /* out */,
    int recev_count             /* in */,
    MPI_Datatype recev_type     /* in */,
    int dest_process            /* in */,
    MPI_Comm comm               /* in */);

聚集函数。0号进程中,由send_buffer_p所引用的内存区的数据存储在recev_buffer_p的第一个块中;1号进程中,由send_buffer_p所引用的内存区的数据存储在recev_buffer_p的第二个块中;一次类推。recev_count表示接收到每个进程的数据量,而不是所有数据量的总和。

MPI_Gather()和MPI_Scatter()有如下限制:数据使用块划分法,且每个块大小相同。

MPI_Allgather()

  int MPI_AllGather(
    void* send_buffer_p         /* in */,
    int send_count              /* in */,
    MPI_Datatype send_type      /* in */,
    void* recev_buffer_p        /* out */,
    int recev_count             /* in */,
    MPI_Datatype recev_type     /* in */,
    MPI_Comm comm               /* in */);

全局聚集函数,该函数将所有进程的send_buffer_p内容串联起来,存储在每个进程的recev_buffer_p参数中。

MPI_Wtime()

  double MPI_Wtime(void);

返回从某一特定时刻开始所经过的秒数。

你可能感兴趣的:(MPI常用接口笔记)