MPI 似乎自动将 0 指定为主进程。但我希望能够指定另一个进程(例如排名为 10 的进程)作为主进程。
此外,该功能scanf
仅在主进程中起作用:其他进程简单地忽略它并转到下一条语句。为什么会这样?
是和不是。
您可以使用或创建一个单独的通信器世界子组。MPI_Comm_create
MPI_Comm_split
至于scanf
,我认为,如果你运行它们,比如说,在不同的等级上,它会输出那个等级过程。说,如果您在该等级上有一个单独的终端,但您的终端很可能在等级 0 上,因此您只看到那里的输出,但是您没有在其他等级上运行程序,所以我认为它不会工作。
要从您需要使用的单独节点打印sprintf
,并将结果存储在内存中,然后将其发送回等级 0 到printf
您的终端。
当mpiexec
启动 MPI 进程时,其中只有一个会收到stdin
. 其余的不会打开那个描述符,所以从它读取只会返回一个错误。如果您检查它的返回值,scanf
它可能是EOF
. 从技术上讲,可能有一个实现可以复制所有进程的内容stdin
并将其转发给所有进程,但我认为任何 MPI 都不会这样做。
stdout
另一方面,通常由启动器从所有进程中收集,并打印在终端上,但打印的顺序几乎无法控制。常见的解决方案是手动收集一级数据并让它打印所有内容,正如 pyCthon 建议的那样。
最后,OpenMPImpiexec
可以完成您要求的事情:指定将获得的排名stdin
,甚至在单独的xterm
. 这可能对调试很有用,但我不会依赖这些特性来实现核心功能:有一天您可能希望将代码与不同的 MPI 实现一起使用。此外,假设你在一个大型集群上运行——你真的想要打开一千个终端吗?:)