如果您使用其中一种 MPI 通信方法让 rank 与自身通信会发生什么?是否存在明确定义的行为(例如保证成功或失败),或者它是否取决于机会/其他不可控的影响,程序是否会继续运行?
一个示例是流体动力学代码,其中每个等级确定需要将哪些网格单元发送到相邻等级以创建计算模板所需的光环。如果仅在一个等级上开始模拟,则会有等级 0 的非阻塞发送/接收本身(发送大约 0 长度的信息)。
如果您使用其中一种 MPI 通信方法让 rank 与自身通信会发生什么?是否存在明确定义的行为(例如保证成功或失败),或者它是否取决于机会/其他不可控的影响,程序是否会继续运行?
一个示例是流体动力学代码,其中每个等级确定需要将哪些网格单元发送到相邻等级以创建计算模板所需的光环。如果仅在一个等级上开始模拟,则会有等级 0 的非阻塞发送/接收本身(发送大约 0 长度的信息)。
虽然您可以按照 suszterpatt 的回答避免自发消息,但自发消息将起作用并且是 MPI 标准的一部分。甚至还有一个预定义的便捷通讯器MPI_COMM_SELF
。只要发送/接收调用不会导致死锁(例如,使用非阻塞调用),发送给自己就可以了。当然,发送和接收缓冲区不应该重叠。
请注意,使用 OpenMPI 您需要启用self
BTL。
Source=destination 是允许的,即进程可以向自己发送消息。(但是,使用上述阻塞发送和接收操作这样做是不安全的,因为这可能会导致死锁。请参阅第 3.5 节。点对点通信的语义。)
在标准模式发送(即MPI_Send()
)中,由 MPI 实现决定是否缓冲消息。可以合理地假设任何实现,或者至少是流行的实现,都会识别到自己的发送,并决定缓冲消息。然后将继续执行,一旦进行匹配的接收调用,将从缓冲区中读取消息。如果您想绝对确定,可以使用MPI_Bsend()
,但您可能需要负责通过MPI_Buffer_attach()
和管理缓冲区MPI_Buffer_detach()
。
但是,针对您的特定问题的理想解决方案是MPI_PROC_NULL
在发送/接收调用的源/目标参数中使用,这将导致 Send 和 Recv 放弃任何通信并尽快返回。