我们可以在MPI中将进程设置为主/根进程吗?

时间:2012-10-10 04:17:48

标签: process mpi scanf

MPI似乎自动将0指定为主进程。但我希望能够指定另一个流程(例如,具有等级10的流程)作为主流程。

此外,函数scanf仅适用于主进程:其他进程只是忽略它并转到下一个语句。为什么会这样?

2 个答案:

答案 0 :(得分:0)

是和否。

您可以使用MPI_Comm_createMPI_Comm_split创建单独的 communicator 世界子群。

对于scanf,我认为,如果你运行它们,比如说,在不同的等级上,它将输出该等级过程。比方说,如果你在该等级上有一个sperate终端,但你的终端很可能在0级,因此你只看到那里的输出,但是你没有在其他等级上运行程序,所以我不认为它会工作

要从单独的节点打印,您需要使用sprintf,并将结果存储在内存中,然后将其发送回等级0到printf到您的终端。

答案 1 :(得分:0)

mpiexec启动MPI流程时,其中只有一个会收到stdin。其余部分不会打开该描述符,因此从中读取只会返回错误。如果您检查scanf的返回值,则可能是EOF。从技术上讲,可能有一个实现可以复制stdin的内容并转发到所有进程,但我认为任何MPI都不会这样做。

另一方面,

stdout通常由发射器从所有过程中收集,并打印在终端上,但事物被打印的顺序几乎无法控制。常见的解决方案是手动收集一个等级的数据并打印所有内容,如pyCthon建议的那样。

最后,OpenMPI的mpiexec可以执行您要求的内容:指定获得stdin的排名,甚至在单独的xterm中启动某些排名。这可能对调试很有用,但我不会依赖这些功能来实现核心功能:您可能希望某天使用不同的MPI实现代码。此外,假设您正在大型集群上运行 - 您真的想要打开一千个终端吗? :)