MPI似乎自动将0指定为主进程。但我希望能够指定另一个流程(例如,具有等级10的流程)作为主流程。
此外,函数scanf
仅适用于主进程:其他进程只是忽略它并转到下一个语句。为什么会这样?
答案 0 :(得分:0)
是和否。
您可以使用MPI_Comm_create
或MPI_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实现代码。此外,假设您正在大型集群上运行 - 您真的想要打开一千个终端吗? :)