【发布时间】:2011-02-24 07:57:28
【问题描述】:
如何让 MPI 进程通知其他人有关错误,例如,特别是在所有 MPI 进程彼此独立的 MPI 程序上(不同 MPI 进程之间没有同步)?
谢谢
【问题讨论】:
标签: function communication notifications mpi signals
如何让 MPI 进程通知其他人有关错误,例如,特别是在所有 MPI 进程彼此独立的 MPI 程序上(不同 MPI 进程之间没有同步)?
谢谢
【问题讨论】:
标签: function communication notifications mpi signals
您指出的差异让我想知道:您为什么要使用 MPI?它似乎不适合您的问题,并且没有比尝试将方形钉塞入 MPI 的圆孔更糟糕的了。 “MPI 进程之间没有同步”听起来好像您已经采用了本质上是串行农场的工作负载,并试图将其转换为 MPI。
也就是说,您可以简单地通过使用 MPI_Irecv 和 MPI_Test 定期轮询来做您想做的事情。
【讨论】:
感谢non-blocking communication,在处理 MPI 时,独立和不同步是两个完全不同的场景。
在我看来,你想要的可以这样实现:当错误发生时,一个进程广播一条带有指定“错误”标签的消息,每个进程定期发布非阻塞接收带有这个标签的消息.如果他们收到这样的消息,说明最近发生了错误,他们可以做出相应的反应,否则他们继续正常执行。
(请注意,在这种情况下,“广播”不是指MPI_Bcast,因为这是一种集体通信操作,因此会阻塞。相反,它只是意味着向它可能关注的每个人发送相同的消息。如果你想要保持进程之间不同步,那么这个发送也必须是非阻塞的。)
【讨论】:
MPI 标准中没有任何内容允许将“中断”从一个等级发送到另一个等级(或多个等级)。一般来说,进度要求用户代码不时进入 MPI 库。没有进步,队伍之间没有标准的交流方式。
同步要求不时有一些进入 MPI 库的条目。 MPI_Barrier 是同步的“大锤”方法。结合 MPI_Reduce_Scatter,可以知道至少在一个等级上存在一些错误。
【讨论】:
我发现您对所有进程都是独立的 MPI 程序的想法非常奇怪。我认为,根据定义,MPI 程序中的所有进程都不是独立的,例如,在您调用 MPI_INIT 之后,它们都在同一个通信器中,因此它们都“知道”彼此的存在。您可能已经编写了代码,以便在此之后进程不会同步,但仍然存在进程相互通信的方法。
要研究的一种机制(确实需要同步)是 MPI_BCAST(广播)。另一种方法是使用 MPI_ISEND,即非阻塞发送操作,但迟早会有一个进程或另一个进程接收,并且您的发送进程应该测试发送是否成功。
【讨论】: