由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
基本上,开放式MPI将执行my_script
而不是执行/.../wrapper my_script
,并且有一点创造力,你必须编写的包装器可以做任何你需要的事情。在此包装器中,您可能希望检查以下环境变量
OMPI_COMM_WORLD_SIZE
OMPI_COMM_WORLD_RANK
OMPI_COMM_WORLD_LOCAL_SIZE
OMPI_COMM_WORLD_LOCAL_RANK