OpenMPI:让每个进程写入标准输出

OpenMPI: have each process write to stdout

由 mpirun 启动的子进程将它们的输出重定向到 mpirun 进程,因此所有输出最终都在一个节点上。

相反,我希望 MPI 产生的每个进程都写入它们自己节点上的 STDOUT,或者写入文件或命名管道。

我阅读了 the faq 并尝试了一些东西:

mpirun -host host1,host2 my_script >&1

只是将 stdout 从所有主机重定向到调用节点上的 stdout(如默认)。正在做

mpirun -host host1,host2 my_script

其中 my_script 将输出重定向到 >&1 只是捕获调用节点上进程的输出。

有没有办法让每个节点写入它们的本地文件系统(例如)而无需重定向到调用节点的 mpirun 进程?

谢谢。

Open MPI 有 --output-file 选项,它非常接近但不完全符合您的要求。

我认为没有一种本机方法可以实现您的期望。

也就是说,这可以通过包装器轻松实现

例如,通过命令行

mpirun --host host1,host2 sh -c 'my_script > /tmp/log.$OMPI_COMM_WORLD_RANK'

每个 MPI 任务都会将其 stdout 重定向到 /tmp/log.<id>

另一种方法是使用 fork_agent

mpirun --host host1,host2 --mca orte_fork_agent /.../wrapper my_script

基本上,Open MPI 不会执行 my_script,而是会执行 /.../wrapper my_script,只要有一点创意,您必须编写的包装器就可以做任何您需要的事情。 在此包装器中,您可能需要检查以下环境变量

  • OMPI_COMM_WORLD_SIZE
  • OMPI_COMM_WORLD_RANK
  • OMPI_COMM_WORLD_LOCAL_SIZE
  • OMPI_COMM_WORLD_LOCAL_RANK