前言
NVIDIA nvprof / nvvp工具是英伟达N卡GPU编程中用于观察的利器。全称是NVIDIA Visual Profiler,是由2008年起开始支持的性能分析器。交互性好,利于使用。其中记录运行日志时使用命令nvprof,可视化显示日志时使用命令nvvp。
该工具的官方介绍如下:
不过在最近几年,英伟达官方推出了新的性能分析工具NSight,官方更加建议使用新的工具,给出的原因是NSight运行时消耗的资源更少,统计的数据更加贴近实际运行情况的数据。相比之下使用nvprof/nvvp方式运行时消耗资源较多,数据统计容易不准确。
除此以外,英伟达还给出了其他的工具,如果希望深入GPU编程,那么这些工具都是傍身利器。
安装与使用
Linux & Windows
在带有N卡的Linux和Windows机器环境下,在安装好CUDA Toolkit后则自带了nvprof / nvvp等工具。且一般会有相应的应用图标(NVIDIA Visual Profiler 和 NSight),可以直接点击图标打开。
也可以通过命令行方式打开。
以Linux系统命令行方式为例,说明使用方法。
直接打印跟踪日志
$ nvprof --print-gpu-trace python test.py
生成nvvp日志文件
$ nvprof -o prof_name.nvvp python test.py
打开nvvp日志文件
$ nvvp prof_name.nvvp
最开始打开日志时显示如下,可以初步看到整个程序运行时的耗时情况:
X轴是时间轴,表示了程序运行的时间。Y轴分为两个大块,包括进程号模块和显卡卡号模块。其中进程号下又细分为线程模块,其下又分为Runtime API和Driver API耗时。而显卡模块下分为Context模块,其下又细分为MemCpy、Compute和Stream模块。MemCpy展示了显存拷贝的耗时情况,Compute展示了实际CUDA Kernel运行时消耗,Stream展示了流上的时间消耗情况。需要注意的是子模块的信息是可以投射回父模块的时间轴上的。可以通过放大缩小来查看某个关注周期内的时间消耗情况。
一般在使用时,如果是多个循环,可以先找出某个代表性循环周期,在时间轴上标记处这一周期,然后再仔细查看Compute部分的耗时情况,保证时间消耗不要浪费在内存开辟和释放上,主要花在核函数运行上。优良的CUDA程序从Stream轴看起来是比较连续的,不会出现大量的空白区间。另外还可以关注某些大量耗时的核函数,考虑优化核函数的设计。
nvprof和nvvp还有更多的特性,例如多进程跟踪支持,核函数调用和运行情况统计等。详细使用可以参考官方文档。
MacOS
Mac自从不再支持英伟达显卡后,只能使用nvvp工具查看profile文件。
要使Mac能查看nvvp日志,需要安装JDK环境和nvvp工具包。安装过程参考官网:https://developer.nvidia.com/nvidia-cuda-toolkit-developer-tools-mac-hosts
适用于macOS 系统版本11以下
-
解压放至某文件夹(如/users/name/test/)
注:
①JDK可以不用安装,解压放在nvvp文件夹下即可。
②JDK如果不是上述版本,可能会出现无法使用的问题(弹出workspace选择界面后卡死)。 -
使用
初次使用可能会被Mac系统拦截,这是由于安全性设置导致的。可以在下面的页面允许jdk相关程序运行(会调用jdk的bin目录下8个左右程序),也可以关闭该安全性设置(参考资料[6])。
cd nvvp
./bin/nvvp -vm /users/name/test/nvvp/jdk8/bin/java
需要注意-vm后的路径需为绝对路径。如不指定则自动寻找环境变量中的java。
Mac下打开nvvp文件显示如下,使用方式参考上述“打开nvvp日志文件”部分:
适用于macOS 系统版本11(Big Sur) 及以上
-
点击zulu8.23.0.3-jdk8.0.144-macosx_x64.dmg安装jdk
-
建立libjvm.dylib的软链接
sudo ln -s /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/server/libjvm.dylib /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/lib/libserver.dylib
- 使用
cd nvvp
./bin/nvvp
需要注意在MacOS11及以上的版本无需再指定-vm参数。
初次使用可能会遇到'lib.dylib' cannot be allowed to run because its origin cannot be verified
的报错,说明jdk运行时被Mac系统拦截,这是由于安全性设置导致的。打开系统安全性设置点击允许(‘System Preferences’ → ‘Security & Privacy’ → ‘General’)。
参考资料
[1] Nvidia Developer - Performance Analysis Tools
[2] NVIDIA Visual Profiler
[3] [腾讯机智] tensorflow profiling工具简介——nvprof和nvvp
[4] CUDA Toolkit v11.1.1 Doc - Profiler - Visual Profiler
[5] NVIDIA CUDA Toolkit - Developer Tools for macOS
[6] macOS Catalina(10.15)解决阻止程序运行“macOS无法验证此App不包含恶意软件”
[7] How to use NVIDIA profiler
[8] Understanding the Visualization of Overhead and Latency in NVIDIA Nsight Systems
[9] NVIDIA Nsight Systems
[10] Does calling a CUDA kernel multiple times affect execution speed?