首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否需要在相应的MPI_Send之前调用MPI_Recv

是否需要在相应的MPI_Send之前调用MPI_Recv
EN

Stack Overflow用户
提问于 2014-10-02 18:10:35
回答 2查看 1.4K关注 0票数 0

我编写了一个具有以下输出的程序:

代码语言:javascript
运行
复制
> 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

通常的代码路径是:

  1. 主程序中的Recv称为
  2. 两个奴隶
  3. 主块中的第一个recv
  4. 主模块中的第二次恢复

我只想知道在发送之前是否需要打电话?我不知道为什么我的新电话阻塞了,否则。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-02 19:55:19

它不要求您在发送之前发送您的接收电话,但如果您这样做,它将表现得更好。它也不太可能耗尽内存。

如果您有问题,您的程序挂起,那么这可能不是因为您的订单是坏的。这可能是因为你打的电话不够多,或者它们不匹配。

票数 4
EN

Stack Overflow用户

发布于 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宏,而不必搜索和替换每个实例。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26166879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档