如何观察 MPI 程序所有进程的运行时间

How to observe elapsed time for all processes of an MPI program

我想在 linux 中使用时间命令观察我的 MPI 程序的性能。它只显示程序的实际值、用户值和系统值。但是,我应该检查每个进程发生了什么。那么,有没有办法分别查看我的程序每个进程需要多长时间?

如果您在 mpiexec/mpirun 命令前添加 time,它将显示有关命令本身的统计信息:

$ /usr/bin/time -p mpiexec -n 3 sleep 1
real 3.54
user 0.42
sys 0.15

要让它报告有关每个 MPI 等级的统计信息,您应该在 MPI 可执行文件的名称前加上 time

$ mpiexec -n 3 /usr/bin/time -p sleep 1
real 1.00
user 0.00
sys 0.00
real 1.00
user 0.00
sys 0.00
real 1.00
user 0.00
sys 0.00

为了将输出与所有等级分开并确定测量来自哪个等级以及来自哪个等级,您可以将以下内容与 Open MPI 结合使用:

$ mpiexec --tag-output -n 3 /usr/bin/time -p sleep 1
[1,1]<stderr>:real 
[1,1]<stderr>:1.00
[1,1]<stderr>:user 0.00
[1,1]<stderr>:sys 0.00
[1,0]<stderr>:real 1.00
[1,0]<stderr>:user 0.00
[1,0]<stderr>:sys 0.00
[1,2]<stderr>:real 1.00
[1,2]<stderr>:user 0.00
[1,2]<stderr>:sys 0.00

每行现在都带有前缀 [1,rank]<stream>:。您还可以编写一个名为 mpitime.sh 的包装器,它调用 time 并带有将信息写入文本文件的选项,例如:

#!/bin/sh
/usr/bin/time -o timing.$OMPI_COMM_WORLD_RANK $*

运行 mpiexec -n 3 mpitime.sh sleep 1 将生成三个文件:timing.0timing.1timing.2,其中包含等级 0、1 和 2 的时间. 包装器脚本必须适应其他实现。参见 here