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

Joh*_*nna 3 io mpi

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

mpirun -np [#processes]  xterm -e [path to executable]
Run Code Online (Sandbox Code Playgroud)

只是不使用xterm。

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

Hri*_*iev 6

你可以写一个包装脚本。由于 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
Run Code Online (Sandbox Code Playgroud)

将其保存unmute.sh并执行如下:

$ mpiexec -n #procs unmute.sh #rank executable [params]
Run Code Online (Sandbox Code Playgroud)

该脚本将标准输出和错误流重定向到/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
Run Code Online (Sandbox Code Playgroud)