多GPU性能分析(多个CPU,MPI/CUDA混合)

5

我在论坛上快速查看了一下,不认为已经有人问过这个问题。

我目前正在使用一个MPI/CUDA混合代码,是别人在他的博士期间制作的。 每个CPU都有自己的GPU。 我的任务是通过运行(已经工作正常的)代码来收集数据,并实现额外的功能。 目前将此代码转换为单个CPU/多个GPU的代码不是一个选项(以后可能会是)。

我想利用性能分析工具来分析整个过程。


暂时的想法是让每个CPU为自己的GPU启动nvvp并收集数据,而另一种分析工具将处理一般的CPU/MPI部分(我打算像往常一样使用TAU)。

问题是,同时启动8个nvvp接口(如果使用8个CPU/GPU运行)非常麻烦。我希望避免通过界面进行操作,并获得一个直接将数据写入文件的命令行,我可以稍后将其馈送给nvvc的界面并进行分析。

我想得到一个命令行,每个CPU将执行该命令行,并为它们各自的GPU生成一个给出数据的文件。8(GPU / CPU)= 8个文件。 然后,我计划逐个喂食和分析这些文件,一个接一个地使用nvcc比较数据。

有什么想法吗?

谢谢!

4个回答

6
请看一下 nvprof,它是 CUDA 5.0 工具包 的一部分(目前作为发布候选版提供)。它有一些限制 - 在给定的传递中,它只能收集有限数量的计数器,并且不能收集指标(因此,如果您想要更多事件,则现在必须脚本化多个启动)。您可以从 nvvp 内置帮助中获取更多信息,包括一个 MPI 启动脚本示例(在此处复制,但如果您使用的是 5.0 RC 以上版本,请查看 nvvp 帮助以获取最新版本)。
#!/bin/sh
#
# Script to launch nvprof on an MPI process.  This script will
# create unique output file names based on the rank of the 
# process.  Examples:
#   mpirun -np 4 nvprof-script a.out 
#   mpirun -np 4 nvprof-script -o outfile a.out
#   mpirun -np 4 nvprof-script test/a.out -g -j
# In the case you want to pass a -o or -h flag to the a.out, you
# can do this.
#   mpirun -np 4 nvprof-script -c a.out -h -o
# You can also pass in arguments to nvprof
#   mpirun -np 4 nvprof-script --print-api-trace a.out
#

usage () {
 echo "nvprof-script [nvprof options] [-h] [-o outfile] a.out [a.out options]";
 echo "or"
 echo "nvprof-script [nvprof options] [-h] [-o outfile] -c a.out [a.out options]";
}

nvprof_args=""
while [ $# -gt 0 ];
do
    case "$1" in
        (-o) shift; outfile="$1";;
        (-c) shift; break;;
        (-h) usage; exit 1;;
        (*) nvprof_args="$nvprof_args $1";;
    esac
    shift
done

# If user did not provide output filename then create one
if [ -z $outfile ] ; then
    outfile=`basename $1`.nvprof-out
fi

# Find the rank of the process from the MPI rank environment variable
# to ensure unique output filenames.  The script handles Open MPI
# and MVAPICH.  If your implementation is different, you will need to
# make a change here.

# Open MPI
if [ ! -z ${OMPI_COMM_WORLD_RANK} ] ; then
    rank=${OMPI_COMM_WORLD_RANK}
fi
# MVAPICH
if [ ! -z ${MV2_COMM_WORLD_RANK} ] ; then
    rank=${MV2_COMM_WORLD_RANK}
fi

# Set the nvprof command and arguments.
NVPROF="nvprof --output-profile $outfile.$rank $nvprof_args" 
exec $NVPROF $*

# If you want to limit which ranks get profiled, do something like
# this. You have to use the -c switch to get the right behavior.
# mpirun -np 2 nvprof-script --print-api-trace -c a.out -q  
# if [ $rank -le 0 ]; then
#     exec $NVPROF $*
# else
#     exec $*
# fi

nvprof不支持MPI,不能对像Horovod这样的混合MPI-NCCL应用程序进行拓扑带宽分析。 - denfromufa

3
另一个选择是,既然您已经在使用TAU来分析应用程序的CPU方面,您也可以使用TAU来收集GPU性能数据。TAU支持多GPU执行以及MPI,请参阅http://www.nic.uoregon.edu/tau-wiki/Guide:TAUGPU了解如何开始使用TAU的GPU分析功能。TAU在底层使用CUPTI(CUDA性能工具接口),因此您将能够使用TAU收集的数据与nVidia的Visual Profiler所能收集的非常相似。

3
自CUDA 5.0以来,情况发生了变化,现在我们可以简单地使用%h%p%q{ENV},如此处所述,而不是使用包装脚本:
$ mpirun -np 2 -host c0-0,c0-1 nvprof -o output.%h.%p.%q{OMPI_COMM_WORLD_RANK} ./my_mpi_app


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