考虑配置为
首先
未缓冲,阻止(同步)
据我所知,MPI是一个API,所以当我们进行mpi_send
阻塞函数调用时,发送方函数/程序是否会被阻止?
OR
MPI API函数mpi_send
是否被阻止,以便程序可以继续工作直到发送消息?
第二
类似的混淆,mpi_recv
被阻止了还是被调用的函数被阻止了?
这样一个愚蠢问题的原因:
这是并行处理,那么为什么某些人会制造阻止某个想要某些信息的流程的东西呢?
另一个原因:
当进程调用mpi_send
时,没有其他进程可以使用mpi_send
函数,因为它正在工作吗?!
答案 0 :(得分: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以完成消息事务之前,不能可靠地(或合法地)改变消息缓冲区。
答案 1 :(得分:3)
您上一个问题的答案是否定的:在执行其他进程时,可能会阻止某些进程等待发送或接收完成。阻止调用仅阻止调用它们的进程。