【问题标题】:MPI - Suppress output from some processorsMPI - 抑制某些处理器的输出
【发布时间】:2013-12-13 22:46:39
【问题描述】:

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

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

只是不使用 xterm。

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

【问题讨论】:

  • MPI 标准中没有任何内容可以帮助您。您的 MPI 实现可能会提供这样的功能,尽管 (a) 您没有告诉我们您正在使用什么实现,并且 (b) 我会惊讶地发现任何实现都具有此功能。
  • 这很不幸——要求这么奇怪吗?我正在使用 OpenMPI 1.4.3。无论如何,感谢您的评论;至少我知道我很可能会停止寻找它。

标签: io mpi


【解决方案1】:

您可以编写一个包装脚本。由于 Open MPI 在名为 OMPI_COMM_WORLD_RANK 的环境变量中提供了 MPI_COMM_WORLD 中的进程等级,因此很容易执行以下操作:

#!/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

【讨论】:

  • 谢谢你,完美,这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2011-08-15
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多