有没有办法让MPI只打印一个(或子集)进程的输出?我知道如何在代码级别上执行此操作,但我想知道在已经编译可执行文件之后是否有某种方法来指定它。我想在以下命令中的一个窗口中获取输出
mpirun -np [#processes] xterm -e [path to executable]
不使用xterm。
我知道我可以使用-tag-output选项标记输出,然后可以手动过滤它,但这有点乏味。由于MPI确切知道输出的来源,是否有更简单的方法来实现这一目标?
答案 0 :(得分:3)
您可以编写包装脚本。由于Open MPI使得MPI_COMM_WORLD
中的流程等级在名为OMPI_COMM_WORLD_RANK
的环境变量中可用,因此很容易执行以下操作:
#!/bin/bash
UNMUTE=$1
shift 1
if [ "$OMPI_COMM_WORLD_RANK" == "$UNMUTE" ]; then
exec $*
else
exec $* >/dev/null 2>&1
fi
将其保存到unmute.sh
并按以下方式执行:
$ mpiexec -n #procs unmute.sh #rank executable [params]
脚本将标准输出和错误流重定向到/dev/null
,除了指定的所有等级。您可以使比较逻辑更精细,例如比较范围或等级列表。
以下是上述脚本的示例:
$ mpiexec -n 6 printenv | grep COMM_WORLD_RANK
OMPI_COMM_WORLD_RANK=0
OMPI_COMM_WORLD_RANK=1
OMPI_COMM_WORLD_RANK=2
OMPI_COMM_WORLD_RANK=3
OMPI_COMM_WORLD_RANK=4
OMPI_COMM_WORLD_RANK=5
$ mpiexec -n 6 unmute.sh 3 printenv | grep COMM_WORLD_RANK
OMPI_COMM_WORLD_RANK=3