parallel-processing - MPI 接收和发送功能相互阻塞?
问题描述
假设我有一个 MPI process_0 等待来自两个不同进程(process_1 和 process_2)的消息。像这样的东西:
...
MPI_Recv(&message_1, 1, MPI_INT, process_1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(&message_2, 1, MPI_INT, process_2, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
...
想象一下当 process_2 在 process_1 之前将它的消息发送到 process_0 的场景。那会发生什么?
我猜 process_0 必须先收到来自 process_1 的消息,然后才能读取来自 process_2 的消息?
process_2 的发送函数会发生什么?在 process_0 可以接收到它之前,它会卡在尝试传递消息的发送函数上吗?或者它是否会发送消息而不关心 process_0 是否收到它并在发送函数之后继续运行连续代码?
解决方案
根据 MPI 标准,正确的程序应始终假定阻塞发送(例如MPI_Send()
)将阻塞,直到发布匹配的接收。
请注意,如果消息足够短(取决于您的 MPI 实现、互连和其他因素),它可能会以急切模式发送并MPI_Send()
立即返回。如果您的 MPI 实现具有进度线程,MPI_Send()
也可能在匹配的接收发布之前返回。话虽如此,您不应该假设这是标准规定的行为,并且如果您想编写可移植代码,您应该假设MPI_Send()
将始终阻塞,直到发布匹配的接收。
推荐阅读
- python - 如何使用 Xpath 抓取 Google 网址(包含和不包含)
- unity3d - 代码中的值更改时检查器不更新
- animation - 如何设置 Svelte + Popper.js + display:none 动画
- python-3.x - 无论如何在android和ios上使用python的manim库吗?
- virtual-machine - 将iso导入虚拟框时,我一直遇到障碍
- python - 在matplotlib中制作移动平均时间序列线图的任何解决方法?
- javascript - 我正在使用javascript制作密码生成器。密码生成后不显示
- javascript - 无法弄清楚为什么这不起作用
- python - 如何使用来自wordsegment内部的segment()到re.sub从python中的主题标签中提取单词?
- arrays - 将 tableview 单元格文本标签附加到空数组中