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

时间:2010-11-01 15:13:47

标签: parallel-processing mpi

考虑配置为

首先

未缓冲,阻止(同步)

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

OR

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

第二

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

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

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

另一个原因:

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

2 个答案:

答案 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)

您上一个问题的答案是否定的:在执行其他进程时,可能会阻止某些进程等待发送或接收完成。阻止调用仅阻止调用它们的进程。