MPI的各种Send
摘要
一直知道MPI有好几种Send:MPI_Send
、MPI_Bsend
、MPI_Ssend
、MPI_Rsend
、MPI_Isend
、MPI_Ibsend
、MPI_Issend
、MPI_Irsend
MPI_Send_init
之类的,但是一直没搞明白它们有什么区别,本文介绍这些东西之间有啥区别。
前缀后缀含义
很容易注意到,不同前缀后缀代表不同的特性。
I
:表示非阻塞式的发送,是我们最熟悉的前缀,返回后send_buffer
仍然不可用,必要调用MPI_Wait
或者MPI_Test
之后才可以继续使用send_buffer
。必须使用MPI_Irecv接收
B
:表示buffered,发送的内容会被拷贝一份,然后返回,之后具体什么时候发送用户无法感知。注意必须搭配使用MPI_Buffer_attach
提前分配buffer的空间,不然可能会退化为MPI_Send。
S
:表示synchronous,直到对方接收完成才会返回。
R
:表示ready,接收方必须已经调用了recv,这样可以略微提升性能。
init
:只是初始化这个发送,暂时不发送,在调用MPI_Start之后才会开始真正的发送。
这些前缀组合形成了标准中的各种Send接口
- MPI_Bsend
- MPI_Bsend_init
- MPI_Ibsend
- MPI_Irsend
- MPI_Isend
- MPI_Issend
- MPI_Rsend
- MPI_Rsend_init
- MPI_Send
- MPI_Send_init
- MPI_Sendrecv
- MPI_Sendrecv_replace
- MPI_Ssend
- MPI_Ssend_init
部分接口解释
MPI_Ibsend
返回后buffer不可用,因为可能正在复制。调用MPI_Wait
或者MPI_Test
之后buffer可用,但是可能并没有完成发送。