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_CHARsigned charMPI_UNSIGNEDunsigned int
MPI_SHORTsigned short intMPI_UNSIGNED_LONGunsigned long int
MPI_INTsigned intMPI_FLOATfloat
MPI_LONGsigned long intMPI_DOUBLEdouble
MPI_LONG_LONGsigned long long intMPI_LONG_DOUBLElong double
MPI_UNSIGNED_CHARunsigned charMPI_BYTE
MPI_UNSIGNED_SHORTunsigned short intMPI_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);

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值