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