-1

我正在尝试使用 MPI(MPMD 通信)通信两个不同的进程。其中一个使用 GLUT 来渲染基于另一个进程发送的数据生成的一些数据。

我的问题是,在初始化阶段,“消费者”(使用 GLUT)将某些配置数据发送给“生产者”,但 MPI_Send 调用似乎没有阻塞。例如,我从消费者向生产者发送了 4 条不同的消息,每条消息都有不同的标签。它似乎工作正常。然后我注释第一个 MPI_Send,而不更改其他进程的代码(这意味着它们中的任何一个都不应分别超过第一个 MPI_Send 和 MPI_Recv)。问题是发送者发送了所有三个消息,并且似乎每个 MPI_Send 返回 MPI_SUCCESS,因为我在每个 MPI_Send 打印消息对应于正确进化之后所做的测试。同时,接收器没有进展。

我试图在没有 GLUT 的情况下在更简单的应用程序中重现这种行为,并且它们奏效了。但与此同时,我认为 GLUT 没有理由导致这个问题。你有什么建议吗?

提前致谢。

4

2 回答 2

1

我刚刚发现 MPI_Send 不保证阻塞,如1所述,因此为了获得所需的行为,我应该改用 MPI_Ssend。

于 2012-07-04T13:25:29.840 回答
1

您误读了阻塞 MPI 发送模式的语义。这里的阻塞意味着操作阻塞,直到消息数据及其信封被安全地存储起来并且数据缓冲区可以自由修改。相反,非阻塞操作 ( MPI_I...) 立即返回控制,但要求您在操作仍在进行时不要修改数据缓冲区。

MPI_Send是标准的阻塞发送操作。它可以实现为同步阻塞发送(MPI_Ssend),它在接收操作开始之前不返回,或者实现为内部缓冲阻塞发送(类似于MPI_Bsend),它将消息数据复制到一个小的内部缓冲区并返回控制权。标准没有定义标准发送是如何实现的。大多数实现缓冲几个短消息。

于 2012-07-04T15:22:09.243 回答