我在论坛上快速浏览了一下,我不认为这个问题已经被提出过了。
我目前正在使用MPI / CUDA混合代码,由其他人在博士期间制作。 每个CPU都有自己的GPU。 我的任务是通过运行(已经工作的)代码来收集数据,并实现额外的东西。 将此代码转换为单个CPU /多GPU,目前不是一个选项(稍后,可能。)。
我想利用性能分析工具来分析整个事情。
现在的想法是让每个CPU为自己的GPU启动nvvp并收集数据,而另一个分析工具将负责一般的CPU / MPI部分(我计划像往常一样使用TAU)。
问题是,同时启动nvvp的接口8(如果运行8个CPU / GPU)非常烦人。我想避免通过界面,并获得一个直接将数据写入文件的命令行,我可以稍后提供给nvvc的界面并进行分析。
我想获得一个将由每个CPU执行的命令行,并为每个CPU生成一个文件,提供有关自己GPU的数据。 8(GPU / CPU)= 8个文件。 然后我计划用nvcc逐个单独地提供和分析这些文件,手动比较数据。
有什么想法吗?
谢谢!
答案 0 :(得分:3)
查看nvprof
,CUDA 5.0 Toolkit的一部分(目前可用作候选版本)。存在一些限制 - 它只能在给定的通道中收集有限数量的计数器,并且无法收集指标(因此,如果您需要多个事件,则现在必须编写多个启动脚本)。您可以从nvvp内置帮助中获取更多信息,包括示例MPI启动脚本(此处复制但我建议您查看nvvp帮助以获取最新版本,如果您有比5.0 RC更新的版本)。
#!/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
答案 1 :(得分:0)
另一个选择是因为您已经使用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收集的数据非常相似。
答案 2 :(得分:0)
自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
答案 3 :(得分:0)
显然,自2015年以来,使用nvprof分析器时,可以通过NVTX和mpi_interceptions.so库自动注释MPI调用:
https://devblogs.nvidia.com/gpu-pro-tip-track-mpi-calls-nvidia-visual-profiler/
根据此演示,TAO仍然不支持分布式深度学习: