【问题标题】:In message passing (MPI) mpi_send and recv "what waits"在消息传递 (MPI) 中,mpi_send 和 recv “等待什么”
【发布时间】:2011-05-03 11:31:30
【问题描述】:

考虑配置为

第一:

没有缓冲,阻塞(同步)

据我了解,MPI 是一个 API,所以当我们执行 mpi_send 阻塞函数调用时,发送方函数/程序会被阻塞吗?

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

第二:

类似的困惑,mpi_recv 是否被阻塞或调用它的函数被阻塞?

提出这么愚蠢的问题的原因:

这是并行处理,那么为什么有人会做一些会阻止需要一些信息的进程的东西?

另一个原因:

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

【问题讨论】:

    标签: parallel-processing mpi


    【解决方案1】:

    首先:是的,调用程序被“阻塞”了,因为 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 完成消息事务之前不能可靠(或合法地)更改消息缓冲区。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        • 2018-09-07
        • 2015-01-07
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        相关资源
        最近更新 更多