mpi函数(转载)

举报
iamwkp0001 发表于 2022/03/21 08:48:44 2022/03/21
【摘要】 最近几天开始接触MPI编程了,虽然还是一头雾水,没有入门,但是先把自己整理的一些函数贴出来,方便以后查看。管理函数Int MPI(int *argc,char **argv)Int MPI_Finalize(void) 清除MPI的所有状态Int MPI_Inilialized(int flag) 检查是否调用了MPI_INITInt MPI_Error_String(int errorco...

最近几天开始接触MPI编程了,虽然还是一头雾水,没有入门,但是先把自己整理的一些函数贴出来,方便以后查看。

管理函数

Int MPI(int *argc,char **argv)

Int MPI_Finalize(void) 清除MPI的所有状态

Int MPI_Inilialized(int flag) 检查是否调用了MPI_INIT

Int MPI_Error_String(int errorcode,char *string ,int *len) 检查MPI函数错误

进程组操作函数

1.      Int MPI_Comm_group(MPI_Comm comm,MPI_Group *group)

 IN    comm  通信子

 OUT  group   对应comm的进程组

用来建立一个通信子对应的新进程组,之后就可以对此进程组进行需要的操作

 

2.      Int MPI_group_free(MPI_Group *group)

 INOUT   group   释放进程组并返回MPI_Group_NULL

调用MPI_Group_free之后,任何关于此进程组的操作都视为无效

 

3.      Int MPI_Group_size(MPI_Group group,int *size)

IN   Group  进程组

OUT  size    进程组中的进程个数

如果进程组是MPI_Group_Empty,则返回值size0

4.      Int MPI_Group_rank(MPI_Group group,int *rank)

IN    Group     进程组

OUT  Rank      进程在进程组中的编号

如果进程不是进程组中的成员,则返回值RANKMPI_UNDEFINED

5.      Int MPI_Group_translate_ranks(MPI_Group  group1,int n,int *ranks1,MPI_Group group2,int *ranks2)

IN     Group1     进程组1

IN     n          ranks1ranks2中数组元素的个数

IN     ranks1      进程组1中有效编号组成的数组

IN     group2      进程组2

OUT   ranks2      ranks1中的元素在进程组2中的对应编号

如果属于进程组1的某个进程可以在ranks1中找到,而这个进程不属于进程组2,则在ranks2中对应ranks1的位置返回值为MPI_UNDEFINED

6.      Int MPI_Group_incl(MPI_Group group,int n,int *ranks,MPI_Group new group)

IN     Group     进程组

IN     n         ranks数组中元素的个数和新进数组的大小

IN     ranks      将在新进程组中出现的旧进程组中的编号

OUT     newgroup   ranks定义的顺序导出的新进程组

7.      Int MPI_Group_excl(MPI_Group group,int n,int *ranks,MPI_Group newgroup)

IN     group     进程组

IN     N        ranks数组中元素的个数

IN     ranks     在新进程组中不出现的旧进程组中的编号

OUT   newgroup 旧进程组中不在ranks里的元素组成的新进程组

8.      Int MPI_Group_union(MPI_Group group1,MPI_Group group2,MPI_Group newgroup)

IN     group1     进程组1

IN     group2     进程组2

OUT   newgroup  进程组1和进程组2的并

9.      Int MPI_Group_intersection(MPI_Group group1,MPI_Group group2,MPI_Group newgroup)

 IN     group1     进程组1

IN     group2     进程组2

OUT   newgroup  进程组1和进程组2的交

10.  Int MPI_Group_difference(MPI_Group group1,MPI_Group group2,MPI_Group newgroup)

IN     group1     进程组1

IN     group2     进程组2

OUT   newgroup  进程组1和进程组2的差

 

MPI通信子操作

1.      int MPI_Comm_Size(MPI_Comm comm,int *size)

IN     comm     通信子

OUT   size       通信子中的进程个数

2.      int MPI_Comm_rank(MPI_Comm comm,int *rank)

IN     comm     通信子

OUT   rank       通信子中的进程编号

3.      int MPI_Comm_dup(MPI_Comm comm,MPI_Comm *newcomm)

IN     comm     通信子

OUT   newcomm comm通信子的复制

4.      int MPI_Comm_Create(MPI_Comm comm,MPI_Group group,MPI_Comm *newcomm)

IN     comm     通信子

IN     group     通信子comm的一个子集

OUT   newcomm 对应group的一个新通信子

5.      int MPI_Comm_Split(MPI_Comm comm,int color,int key,MPI_Comm *newComm)

IN     comm     通信子

IN     color      子集控制值

IN     key       子集进程编号的顺序

OUT   newcomm  由此产生的新通信子

划分comm所对应的进程组为不相交的子进程组,每个子进程组有一个共同的值color

6.      int MPI_Comm_free(MPI_Comm *Comm)

INOUT     comm     通信子

点到点通信函数

一对进程之间的数据转换,也就是说一边发送数据另一边接收数据,点到点通信是MPI通信机制的基础,它分为同步通信和异步通信二种机制。

阻塞式通信函数

1.      int MPI_send(void *buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm)

IN     buf     所要发送消息数据的首地址

IN     count   发送消息数组元素的个数

IN     datatype 发送消息的数据类型

IN     dest    接收消息的进程编号

IN     tag     消息标签

IN     comm  通信子

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

OUT     buf     接收消息数据的首地址

IN       Count   接收消息数组元素的最大个数

IN       datatype 接收消息的数据类型

IN       source   发送消息的进程编号

IN       tag      消息标签

IN       comm    通信子

OUT     status    接收消息时返回的状态

3.      int MPI_Get_Count(MPI_Status status,MPI_Datatype datatype,int *count)

IN     status     接收消息时返回的状态

IN     datatype   接收消息时返回的类型

OUT   Count      接收消息时数组元素的个数

4.      int MPI_Sendrecv(void *sendbuf,int sendcount,MPI_Datatype sendtype,int dest,int sendtag,void *recvbuf,int recvcount,MPI_Datatype recvtype,int source,int recvtag,MPI_Comm comm,MPI_Status *status)

IN     sendbuf     所要发送消息数据的首地址

IN     sendcount   发送消息数组元素的个数

IN     sendtype    发送消息的数据类型

IN     dest        接收消息的进程编号

IN     sendtag     发送消息标签

OUT   recvbuf      接收消息数据的首地址

IN     recvcount    接收消息数组元素的最大个数

IN     recvtype     接收消息的数据类型

IN     Source     发送消息的进程编号

IN     recvtag     接收消息标签

IN     comm      通信子

OUT   status      接收消息时返回的状态

5.      int MPI_Sendrecv_replace(void *sendbuf,int count,MPI_Datatype datatype,int dest,int sendtag,int source,int recving,MPI_Comm comm,MPI_Status *status)

OUT     buf     发送和接收消息数据的首地址

IN       Count   发送和接收消息数组元素的个数

IN       dest    接收消息的进程编号

IN       sendtag 发送消息标签

IN       source   发送消息的进程编号

IN       recvtag  接收消息标签

IN       comm   通信子

OUT     status   接收消息时返回的状态

6.      int MPI_probe(int source,int tag,MPI_Comm comm,MPI_Status *status)

IN     source     发送消息进程的编号

IN     tag        接收消息的标签

IN     comm     通信子

OUT   status      返回到消息的状态

7.      int MPI_Iprobe(int source,int tag,MPI_Comm comm,int *flag,MPI_Status *status)

IN     source     发送消息进程的编号

IN     tag        接收消息的标签

IN     comm     通信子

OUT    flag      如果指定消息已经到达,flag返回值为true

OUT   status     返回到达消息的状态

非阻塞式通信函数

非阻塞式通信函数是指在通信过程中,不需要等待通信结束就返回,通常这种通信过程交由计算机的后台来处理,如果计算机系统提供硬件支持非阻塞式通信函数,就可以使计算与通信在时间上的重叠,从而提高并行计算的效率。

1.      int MPI_Isend(void *buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm,MPI_Request *request)

IN     buf     所要发送消息数据的首地址

IN     count   发送消息数组元素的个数

IN     datatype 发送消息的数据类型

IN     dest    接收消息的进程编号

IN     tag     消息标签

IN     comm   通信子

OUT   request  请求句柄一杯将来查询

2.      int MPI_Irecv(void *buf,int count,MPI_Datatype datatype,int source,int tag,MPI_Comm comm,MPI_Request *request)

OUT     buf     接收消息数据的首地址

IN      Count    接收消息数组元素的个数

IN      datatype  接收消息的数据类型

IN      source    发送消息的进程编号

IN      tag       消息标签

IN      comm     通信子

OUT    request    请求句柄以北将来查询

MPI_IsendMPI_Irecv不需要等待发送或接收消息完成就可以执行其他任务

3.      Int MPI_wait(MPI_Request *request,MPI_Status *status)

INOUT      request     请求句柄

OUT        status      发送或接收消息的状态

如果request所指的操作已经完成,MPI_Wait将结束等待状态

4.      Int MPI_Test(MPI_Request *request,int *flag,MPI_Status *status)

INOUT     request     请求句柄

OUT       flag        request所指的操作已经完成返回值为true

OUT       status      发送或接收消息的状态

5.      Int MPI_Request_free(MPI_Request *request)

INOUT     request     请求句柄,返回值为MPI_Request_null

对单个request进行查询

6.      Int MPI_Waitany(int count,MPI_Request *array_of_requests,int *index,MPI_Status *status)

IN     count     请求句柄的个数

INOUT  array_of_requests 请求句柄数组

OUT    index     已经完成通信操作的句柄指标

OUT    status    消息的状态

当所有请求句柄中至少有一个已经完成通信操作,就返回,如果有多于一个请求句柄已经完成,MPI_waitany将随机选择其中的一个并立即返回

7.      Int MPI_Testany(int Count,MPI_Request *array)

IN     count     请求句柄个数

INOUT  array_of_requests 请求句柄数组

OUT    index     已经完成通信操作的句柄指标

OUT    flag       如果有一个已经完成,则flag=true

OUT    status     消息的状态

无论有没有通信操作完成都将立即返回

8.      Int MPI_Waitall(int Count,MPI_Request *array_of_requests)

IN     count     请求句柄的个数

INOUT  array_of_requests 请求句柄数组

INOUT  array_of_status  所有消息的状态数组

所有通信操作完成之后才返回,否则将一直等待

9.      Int MPI_Testall(int Count,MPI_Request *array_of_requests,int *flag,MPI_Status *array_of_status)

IN     count     请求句柄的个数

INOUT  array_of_requests  请求句柄数组

OUT    flag      如果有一个没完成,则flag=false

INOUT  array_of_status 所有消息的状态数组

无论所有通信操作是否完成都立即返回

10.  Int MPI_Cancel(MPI_Request *request)

INOUT     request     请求句柄

取消一个发送或接收操作

11.  Int MPI_Test_cancelled(MPI_Status *status,int *flag)

IN        status     消息的状态

OUT       flag      如果已经取消,则flag=true

特殊的点到点通信函数

1.      Int MPI_Send_init(void *buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm,MPI_Request *request)

IN     buf     所要发送消息数据的首地址

IN     count   发送消息数组元素的个数

IN     datatype 发送消息的数据类型

IN     dest     接收消息的进程编号

IN     tag      消息标签

IN     comm   通信子

OUT   request  请求句柄以备将来查询

2.      Int MPI_Recv_init(void *buf,int count,MPI_Datatype  datatype,int source,int tag,MPI_Comm comm,MPI_Request *request)

OUT     buf     接收消息数据的首地址

IN       count   接收消息数组元素的个数

IN       datatype 接收消息的数据类型

IN       Source   发送消息的进程编号

IN       tag      消息标签

IN       comm   通信子

OUT     request  请求句柄以备将来查询

3.      Int MPI_Start(MPI_Request *request)

   INOUT     request     请求句柄

4.      Int MPI_Startall(int count,MPI_Request *array_of_request)

IN     Count     需要激活的请求句柄个数

INOUT array_of_request  请求句柄数

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。