我很好奇MPI中缺少这个功能:
MPI_Isendrecv( ... );
即非阻塞发送和接收,任何人都可以告诉我其省略背后的理由吗?
我的看法是,
MPI_SENDRECV
的存在是为了方便想要使用阻塞语义但需要实现移位操作的程序员。如果您对非阻塞语义感到满意,则应该简单地使用现有的 MPI_ISEND
和 MPI_IRECV
。
有趣的是,MPI-3 将添加非阻塞集合(例如
MPI_IBARRIER
),但仍然没有 MPI_ISENDRECV
(请参阅 http://meetings.mpi-forum.org/draft_standard/mpi3.0_draft_2.pdf)。
MPI-4 定义了以下函数,请参阅 MPI-4.1 pdf,第 77 页
int MPI_Isendrecv_replace(void *buf, int count, MPI_Datatype datatype,
int dest, int sendtag, int source, int recvtag, MPI_Comm comm,
MPI_Request *request);
注意,只有一个缓冲区用于发送和接收,因此严格来说它并不是
MPI_Sendrecv
的非阻塞变体。这个用作输入和输出的缓冲区是您无法使用 MPI_Isend
和 MPI_Irecv
自己实现的,所以这就是为什么包含在标准中是有意义的,它不仅仅是一个便利功能。有时该标准包括“基本原理”部分,但对于此功能却没有。