MPI的各种Send

摘要

一直知道MPI有好几种Send:MPI_SendMPI_BsendMPI_SsendMPI_RsendMPI_IsendMPI_IbsendMPI_IssendMPI_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_Ibsend

返回后buffer不可用,因为可能正在复制。调用MPI_Wait或者MPI_Test之后buffer可用,但是可能并没有完成发送。

参考资料

https://www.rookiehpc.com/mpi/docs/

https://www.mcs.anl.gov/research/projects/mpi/