我编写了一个具有以下输出的程序:
> 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通常的代码路径是:
我只想知道在发送之前是否需要打电话?我不知道为什么我的新电话阻塞了,否则。
发布于 2014-10-02 19:55:19
它不要求您在发送之前发送您的接收电话,但如果您这样做,它将表现得更好。它也不太可能耗尽内存。
如果您有问题,您的程序挂起,那么这可能不是因为您的订单是坏的。这可能是因为你打的电话不够多,或者它们不匹配。
发布于 2014-10-02 20:17:03
正如gTcV在一条评论中所说的,post代码!
尽管如此,以下是一些有用的一般性建议:阅读有关MPI通信方式的内容。注意,这里的“阻塞”并不意味着“等待匹配的接收”;它只意味着当对MPI_Send()的调用返回时,发送缓冲区对调用者来说是安全的重用。
标准模式发送( MPI_Send() )允许(但不需要)使用接收端缓冲来完成发送操作,即使还没有发布匹配的MPI_Recv()。这可能会引入一些微妙的bug:在小范围内,一切看起来都很好,但是一旦你扩大了规模,接收侧的缓冲区就会被填满,从而揭示以前一直隐藏的死锁条件。为了保证您的协议是正确的,在测试期间,将每个标准模式MPI_Send()更改为同步模式发送,MPI_Ssend()。这意味着将不使用缓冲区进行发送;每个MPI_Ssend()都在等待匹配的MPI_Recv()在返回之前发布。当您确信所有东西都没有死锁时,请将它们切换回MPI_Send()s以提高性能。您可以使用#define宏,而不必搜索和替换每个实例。
https://stackoverflow.com/questions/26166879
复制相似问题