当此调用期间的进程数与计算开始时生成的进程数不同时,Bcast的语义是什么?
我需要处理用户指定执行计算所需的过多进程的情况。例如,用户可能决定使用mpirun
生成16个进程,而我只需要12个进程来分割问题。我正在通过将PID与12进行比较并在PID过高时使用MPI_Finalize结束进程来处理这种情况。我认为这会导致我的应用程序出现死锁,因为Bcast希望发送到所有进程?
如何处理?我应该只是在所有进程中调用Bcast,而只是忽略某些进程中的输出吗?
答案 0 :(得分:2)
鉴于我们收到了可以考虑的内容,用户输入无效,我们是否真的要在实现这一目标后继续执行程序?不是更好地向用户显示错误消息,表示请求了无效的进程数,并且还通知用户允许的间隔(例如,“请求了16个进程,但是,最大进程数为12 ,程序现在将退出“)。
否则,如果在您的情况下这不是可能的解决方案,则MPI 2.2 documentation的第6章“组,上下文,通信器和缓存”和/或第10章“流程创建和管理”可能属于救命。在其他地方可能还有其他更容易阅读的文档,但至少它是一个开始。
答案 1 :(得分:1)
在程序启动时,每个进程都应查看自己的排名(来自MPI_Comm_rank
),进程总数(来自MPI_Comm_size(MPI_COMM_WORLD)
)以及计算实际需要的数量。如果排名低于您需要的数量,请创建一个您实际用于完成工作的新沟通者,并将所有剩余职级调用MPI_Finalize
。