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

4
有没有办法使MPI仅打印一个(或子集)进程的输出?我知道如何在代码级别上实现,但我想知道是否有一些方法可以在可执行文件编译后指定此内容。我考虑以以下命令中的一个窗口的形式获取输出:
mpirun -np [#processes]  xterm -e [path to executable]

我知道可以使用 -tag-output 选项标记输出,然后手动过滤,但这有点繁琐。由于 MPI 知道输出来自何处,有没有更简单的方法实现此目标,而不使用 xterm?


MPI标准(任何一个版本)中都没有任何帮助你的内容。不过,你所使用的MPI实现可能提供了这样的功能。(a)你并没有告诉我们你使用的是哪个实现;(b)我个人认为如果有任何实现确实具备这个功能,那将会令人惊讶。 - High Performance Mark
很不幸 - 这么问是很奇怪的吗?我正在使用OpenMPI 1.4.3。无论如何,感谢您的评论;至少我知道我可以停止寻找了。 - Johanna
1个回答

7
您可以编写一个包装脚本。由于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

谢谢,非常完美,这正是我想要的。 - Johanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接