列组与自身的MPI通信行为是否定义良好?

列组与自身的MPI通信行为是否定义良好?,mpi,Mpi,如果使用一种MPI通信方法使列组与其自身通信,会发生什么情况?是否存在定义明确的行为(例如,保证成功或失败),或是否取决于机会/其他无法控制的影响,程序是否将继续运行 例如,流体动力学代码,其中每个列组确定需要将哪些网格单元发送到相邻列组,以便为计算模板创建必要的光晕。如果仅在一个列组上启动模拟,则会有列组0的非阻塞发送/接收(发送大约0长度的信息)。在标准模式发送(即MPI\u send())中,由MPI实现确定是否缓冲消息。可以合理地假设,任何实现,或者至少是流行的实现,都将识别发送到sel

如果使用一种MPI通信方法使列组与其自身通信,会发生什么情况?是否存在定义明确的行为(例如,保证成功或失败),或是否取决于机会/其他无法控制的影响,程序是否将继续运行

例如,流体动力学代码,其中每个列组确定需要将哪些网格单元发送到相邻列组,以便为计算模板创建必要的光晕。如果仅在一个列组上启动模拟,则会有列组0的非阻塞发送/接收(发送大约0长度的信息)。

在标准模式发送(即
MPI\u send()
)中,由MPI实现确定是否缓冲消息。可以合理地假设,任何实现,或者至少是流行的实现,都将识别发送到self,并决定缓冲消息。然后执行将继续,并且一旦进行了匹配的接收调用,消息将从缓冲区中读取。如果您想绝对确定,可以使用
MPI\u Bsend()
,但是您可能需要负责通过
MPI\u buffer\u attach()
MPI\u buffer\u detach()
管理缓冲区


但是,解决您的特定问题的理想解决方案是在发送/接收呼叫的源/目标参数中使用
MPI\u PROC\u NULL
,这将导致发送和接收放弃任何通信并尽快返回。

,而您可以根据suszterpatt的回答避免发送自我消息,自我消息传递将起作用,并且是MPI标准的一部分。甚至还有一个预定义的方便通信器
MPI\u COMM\u SELF
。只要发送/接收调用不会导致死锁(例如,使用非阻塞调用),发送到self就可以了。当然,发送和接收缓冲区不应该重叠

请注意,使用OpenMPI,您需要


资料来源:

Source=允许目标,即进程可以向自身发送消息。(但是,使用上述阻止发送和接收操作是不安全的,因为这可能会导致死锁。请参阅第3.5节点对点通信的语义。)


这是个好消息。您能指出当前MPI标准中制定发送至自我政策的章节吗?我自己一直在找,但什么也找不到。我在答案中添加了来源。