我用以下输出编写了一个程序:
> mpiexec -n 3 "Poker Parallel Program.exe"
Entered slave. Rank: 1
Entered slave. Rank: 2
The program is about to do some statistical analysis of poker hands
Slave terminated: 1
Slave terminated: 2
Before recv. Proc number: 1
After slave send
After slave send
After recv. Proc number: 1
Before recv. Proc number: 2
一般代码路径是:
我只是想知道在发送之前是否需要进行recv调用?我不确定为什么我的recv电话会被阻止,否则。
答案 0 :(得分:4)
您不需要在发送之前发布接听电话,但如果您这样做,它会表现得更好。它也不太可能耗尽内存。
如果您在程序挂起时遇到问题,那么可能不是因为您的订单不好。这可能是因为您没有拨打足够的电话,或者他们没有正确匹配。
答案 1 :(得分:3)
正如gTcV在评论中所说,发布代码!
那就是说,这里有一些有用的一般建议:阅读MPI's communication modes。请注意,此处“阻止”不会表示“等待匹配的接收”;它只表示当对MPI_Send()
的调用返回时,发送缓冲区对于调用者重用是安全的。
即使尚未发布匹配的MPI_Send()
,也允许(但不要求)标准模式发送MPI_Recv()
使用接收方缓冲来完成发送操作。这可能会引入一些微妙的错误:一切都可以在小范围内正常工作,但是一旦扩展,接收方缓冲区就会填满,揭示以前一直隐藏的死锁条件。为了确保您的协议正确无误,在测试期间将每个标准模式MPI_Send()
更改为同步模式发送MPI_Ssend()
。这意味着不会使用缓冲来发送;每个MPI_Ssend()
等待匹配的MPI_Recv()
在返回之前发布。如果您确信所有内容都在没有死锁的情况下工作,请将它们切换回MPI_Send()
以提高性能。您可以使用#define
宏,而不必搜索和替换每个实例。