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