MPI - 抑制某些处理器的输出

时间:2013-12-13 10:18:45

标签: io mpi

有没有办法让MPI只打印一个(或子集)进程的输出?我知道如何在代码级别上执行此操作,但我想知道在已经编译可执行文件之后是否有某种方法来指定它。我想在以下命令中的一个窗口中获取输出

mpirun -np [#processes]  xterm -e [path to executable]

不使用xterm。

我知道我可以使用-tag-output选项标记输出,然后可以手动过滤它,但这有点乏味。由于MPI确切知道输出的来源,是否有更简单的方法来实现这一目标?

1 个答案:

答案 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