mpi函数

头文件: mpi.h/mpif.h.
 
int MPI_Init(int *argc, char ***argv)
启动MPI环境,标志并行代码的开始.
并行代码之前,第一个mpi函数(除MPI_Initialize()外).
要求main必须带能运行,否则出错.
 
通信子(通信空间): MPI_COMM_WORLD:
一个通信空间是一个进程组和一个上下文的组合.上下文可看作为组的超级标签,用于区分不同的通信子.
在执行函数MPI_Init之后,一个MPI程序的所有进程形成一个缺省的组,这个组的通信子即被写作MPI_COMM_WORLD.
该参数是MPI通信操作函数中必不可少的参数,用于限定参加通信的进程的范围.

 

int MPI_Comm_size(MPI_Comm comm, int *size);

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

 

int MPI_Comm_rank(MPI_Comm comm, int *rank);

得到本进程在通信空间中的rank值,即在组中的逻辑编号(从0开始).

 

int MPI_Finalize()
标志并行代码的结束,结束除主进程外其它进程.
之后串行代码仍可在主进程(rank = 0)上运行(如果必须).

 

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         目标进程的rank值

     IN  tag          消息标签

     IN  comm       通信子

 

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         源进程的rank值

     IN  tag          消息标签

     IN  comm       通信子

  OUT status  status对象,包含实际接收到的消息的有关信息

 

MPI标识一条消息的信息包含四个域:
Source: 发送进程隐式确定,由进程的rank值唯一标识
Destination: Send函数参数确定
Tag: Send函数参数确定,用于识别不同的消息 (0,UB),UB:MPI_TAG_UB>=32767.
Communicator: 缺省MPI_COMM_WORLD
Group:有限/N,有序/Rank    [0,1,2,…N-1]
Contex:Super_tag,用于标识该通讯空间.
 
当使用MPI_ANY_SOURCE或/和MPI_ANY_TAG接收消息时如何确定消息的来源source 和 tag值呢?
在C中,status.MPI_SOURCE, status.MPI_TAG.
在Fortran中, source=status(MPI_SOURCE), tag=status(MPI_TAG).
Status还可用于返回实际接收到消息的长度
int MPI_Get_count(MPI_Status status, MPI_Datatype datatype,int* count)
IN status 接收操作的返回值.
IN datatype 接收缓冲区中元素的数据类型.
OUT count 接收消息中的元素个数.
 
rank = MPI_PROC_NULL的进程称为空进程
使用空进程的通信不做任何操作.
向MPI_PROC_NULL发送的操作总是成功并立即返回.
从MPI_PROC_NULL接收的操作总是成功并立即返回,且接收缓冲区内容为随机数.
status
status.MPI_SOURCE = MPI_PROC_NULL
status.MPI_TAG = MPI_ANY_TAG
MPI_Get_count(&status,MPI_Datatype datatype, &count) =>count = 0
 
•用户发送缓冲区的重用:
–非阻塞的发送:仅当调用了有关结束该发送的语句后才能重用发送缓冲区,否则将导致错误;对于接收方,与此相同,仅当确认该接收请求已完成后才能使用。所以对于非阻塞操作,要先调用等待MPI_Wait()或测试MPI_Test()函数来结束或判断该请求,然后再向缓冲区中写入新内容或读取新内容。
•阻塞发送将发生阻塞,直到通讯完成.
•非阻塞可将通讯交由后台处理,通信与计算可重叠.
•发送语句的前缀由MPI_改为MPI_I, I:immediate:
–标准模式:MPI_Send(…)->MPI_Isend(…)
–Buffer模式:MPI_Bsend(…)->MPI_Ibsend(…)
 
•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  非阻塞通信完成对象(句柄)
•int MPI_Irecv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request* request)
 
•发送
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值