将配置考虑为
First:
非缓冲的、阻塞的(同步)
据我所知,MPI是一个API,所以当我们执行mpi_send阻塞函数调用时,发送方函数/程序会被阻塞吗?
或
MPI函数mpi_send是否被阻塞,以便程序能够继续工作直到消息被发送?
第二版:
类似的混淆,是mpi_recv被阻塞了,还是调用它的函数被阻塞了?
提出这样一个愚蠢问题的原因:
这是并行处理,所以为什么有些人会制造一些东西来阻止一个进程谁想要一些信息?
的另一个原因:
当进程调用mpi_send时,任何其他进程都不能使用mpi_send函数,因为它是工作的?!
发布于 2010-11-01 23:54:34
首先:是的,调用程序被“阻塞”,因为MPI_Send调用在消息“发送”之前不会返回。
第二: MPI_Recv也是一个“阻塞”呼叫,在消息被“接收”之前不会返回。
一些补充资料:
MPI_Send是一个“阻塞”调用,因为在消息发送之前,调用不会将控制权返回给调用方。“已发送”的定义是保存消息的用户缓冲区可以安全地重用。不能保证消息已经收到,甚至不能保证远程级别已经到达了MPI_Recv调用。(确切的行为取决于实现。RDMA样式的互连会导致“黑匣子内”行为的最大问题。)
MPI_Isend是一个“非阻塞”调用。控件将返回到调用程序“立即”...but--在程序调用MPI_Test或MPI_Wait以确认消息已“发送”之前,无法重用缓冲区。
“阻塞”调用的目的是向调用程序提供一个积极的确认,即保存消息的缓冲区可以重用(在MPI_Send情况下)或可靠地读取和更改(在MPI_Recv情况下)。如果使用“非阻塞”(例如MPI_Isend、MPI_Irecv)调用,则调用程序可以继续执行计算,但在调用MPI_Wait或MPI_Test以完成消息事务之前,无法可靠地(或合法地)更改消息缓冲区。
发布于 2010-11-04 11:35:07
对最后一个问题的回答是否定的:当其他进程正在执行时,一些进程可能会被阻塞,等待发送或接收完成。阻塞调用仅在调用它们的进程上阻塞。
https://stackoverflow.com/questions/4070173
复制相似问题