2012-07-04 56 views
-1

我试图使用MPI(MPMD通信)来沟通两个不同的进程。其中一个使用GLUT来渲染一些基于另一个进程发送的数据而生成的数据。Glut + MPI_Send,实际上并没有阻止

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

我试图在简单的应用程序中重现此行为,没有GLUT,他们的工作。但与此同时,我认为没有理由让GLUT引起这个问题。你有什么建议吗?

在此先感谢。

回答

1

我刚刚发现MPI_Send不能保证阻塞,如1所述,所以为了获得所需的行为,我应该使用MPI_Ssend来代替。

+0

您错误地将_synchronous behaviour_与_blocking_相混淆。 –

1

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

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

相关问题