我正在使用MPI搜索解决方案,以便在不同线程之间划分问题空间。每个线程都经过for
循环,每次迭代都是解决方案的候选者。
问题是,当一个线程找到解决方案时,我希望它通知其他线程,它们应该立即终止(或者至少在当前迭代结束时 - 或者下一个线程的开头)。 / p>
如何使用MPI执行此操作?
答案 0 :(得分:9)
您可以使用MPI_Abort(MPI_COMM_WORLD)
完全关闭所有内容。一个更受控制的解决方案是将进程在发现解决方案时将带有指定标记的非阻塞发送发布到每个其他进程,并且每个进程在迭代结束时检查非阻塞接收是否已发布此类消息任何人。
答案 1 :(得分:2)
MPI没有太多的“推送”通知,所以你不能真正强制其他进程(不是线程;在这种情况下是一个重要的区别!)来知道发生了什么。
@pmg是对的,您可以更新每个人都可以看到的标志。如何使用MPI-2“单面消息”在另一个问题的代码中描述:Creating a counter that stays synchronized across MPI processes。你可以使用这种方法,让每个人在继续他们的批处理之前检查计数器。请注意,每次迭代的每个进程都有很多网络流量!另一种方法是每隔几次迭代就可以执行allreduce或类似操作,看看是否有人遇到过这个问题。至少在带宽方面稍微优化一下,但只有在迭代可能或多或少同步时才能很好地工作。另一种方法是,如果一个进程在找到答案后向所有其他人发送消息,并在每次迭代(或每隔几次)中测试这样的消息,那么这个过程就是一个过程。