是否有一种方法使MPI只打印进程的一个(或一个子集)的输出?我知道如何在代码级别上这样做,但是我想知道在可执行文件已经编译之后是否有什么方法来指定它。我正在考虑像下面命令中的一个窗口那样获得输出
mpirun -np [#processes] xterm -e [path to executable]
只是不使用xterm。
我知道我可以使用- tag -output选项标记输出,然后手动过滤它,但是这有点乏味。由于MPI知道输出的确切来源,没有更简单的方法来实现这个目标吗?
发布于 2013-12-13 14:39:44
你可以写一个包装脚本。由于Open使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
https://stackoverflow.com/questions/20563988
复制相似问题