在消息传递(MPI)mpi_send和recv"等待什么"

use*_*745 1 parallel-processing mpi

考虑配置

第一:

不缓冲,阻塞(同步)

据我所知,MPI是一个API,所以当我们进行mpi_send阻塞函数调用时,发送方函数/程序是否被阻止?

要么

MPI API函数是否mpi_send被阻止,以便程序可以继续工作直到发送消息?

第二:

类似的混淆,mpi_recv被阻止或被调用的函数被阻止了吗?

这样一个愚蠢问题的原因:

这是并行处理,那么为什么某些人会制作一些会阻止某个想要某些信息的进程的东西呢?

另一个原因:

有可能当mpi_send进程调用时,没有其他进程可以使用该mpi_send函数,因为它正在工作?!

Sta*_*ves 8

第一:是的,调用程序被"阻止",因为MPI_Send调用将不会返回,直到消息被"发送".

第二:MPI_Recv也是一个"阻塞"呼叫,并且在消息被"接收"之前不会返回.

一些其他信息:

MPI_Send是一个"阻塞"调用,因为在消息发送之前,调用不会将控制权返回给调用者."已发送"的定义是可以安全地重用保存消息的用户缓冲区.无法保证已收到消息,甚至无法保证远程等级中已达到MPI_Recv呼叫.(确切的行为取决于实现.RDMA样式互连导致大多数问题与确切的"黑盒子内部"行为有关.)

MPI_Isend是一种"非阻塞"呼叫.控制将"立即"返回到调用程序......但是在程序调用MPI_Test或MPI_Wait确认消息已经"发送"之前,缓冲区不能重复使用.

"阻塞"调用的目的是向调用程序提供肯定的确认,即保留消息的缓冲区可以被重用(在MPI_Send的情况下)或可靠地读取和改变(在MPI_Recv的情况下).如果使用"非阻塞"(例如MPI_Isend,MPI_Irecv)调用,则调用程序可以继续执行计算,但是在调用MPI_Wait或MPI_Test以完成消息事务之前,不能可靠地(或合法地)改变消息缓冲区.