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

Posted

技术标签:

【中文标题】多 GPU 分析(多个 CPU,MPI/CUDA 混合)【英文标题】:Multi-GPU profiling (Several CPUs , MPI/CUDA Hybrid) 【发布时间】:2012-08-16 05:05:41 【问题描述】:

我快速浏览了论坛,我认为这个问题还没有被问过。

我目前正在使用其他人在博士期间制作的 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 一个一个地喂和分析这些文件,手动比较数据。

有什么想法吗?

谢谢!

【问题讨论】:

【参考方案1】:

查看nvprof,它是CUDA 5.0 Toolkit 的一部分(目前可作为候选发布版)。有一些限制 - 它只能在给定的传递中收集有限数量的计数器并且它不能收集指标(所以现在如果你想要多个事件,你必须编写多个启动脚本)。您可以从 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 应用程序中分析拓扑带宽。【参考方案2】:

另一个选项是,由于您已经在使用 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%qENV(如 here 所述),而不是使用包装脚本:

$ mpirun -np 2 -host c0-0,c0-1 nvprof -o output.%h.%p.%qOMPI_COMM_WORLD_RANK ./my_mpi_app

【讨论】:

【参考方案4】:

显然,自 2015 年以来,在使用 nvprof 分析器时,可以通过 NVTX 和 mpi_interceptions.so 库自动注释 MPI 调用:

https://devblogs.nvidia.com/gpu-pro-tip-track-mpi-calls-nvidia-visual-profiler/

http://on-demand.gputechconf.com/gtc/2017/presentation/s7495-jain-optimizing-application-performance-cuda-profiling-tools.pdf

根据这个演示,TAO 仍然不支持分布式深度学习:

http://on-demand.gputechconf.com/gtc/2017/presentation/s7684-allen-malony-performance-analysis-of-cuda-deep-learning-networks-using-tau.pdf

【讨论】:

以上是关于多 GPU 分析(多个 CPU,MPI/CUDA 混合)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Nvidia 多进程服务 (MPS) 运行多个非 MPI CUDA 应用程序?

openacc 与 openmp 和 mpi 的区别?

您好有个问题请教一下cpu怎么和gpu并行计算处理好日常软件

matlab中如何使用多GPU并行计算?

gpu和cpu区别

MPI +线程并行化与仅MPI的优势(如果有的话)是什么?