如何仅用nvprof编写脚本分析CUDA应用,获取GPU利用率与FP32 FLOPS
纯命令行用nvprof分析CUDA应用:GPU利用率与FP32 FLOPS实操指南
我来帮你搞定纯命令行下用nvprof分析CUDA应用的这两个核心指标,不用再依赖nvvp可视化工具,全程用命令就能轻松搞定。
一、GPU利用率:两种方式获取
方法1:直接拿现成指标(最省心)
nvprof其实内置了直接输出GPU利用率的指标,根本不用自己手动算活跃时长和总耗时的比例。跑这条命令就行:
nvprof --metrics gpu_utilization ./你的CUDA应用程序
输出里会直接给出百分比形式的GPU利用率,比如gpu_utilization: 92%,这个值就是GPU处于活跃状态的时间占整个应用运行周期的比例,已经帮你计算好了,省事儿得很。
方法2:手动计算(自定义场景用)
如果你确实需要自己统计计算,那得拿到两个关键数据:GPU总活跃时长,以及应用的实际运行耗时(也就是从启动到退出的墙钟时间,尽量排除额外开销):
- 获取GPU活跃时长:用
--print-gpu-trace输出所有GPU kernel的运行时长,然后用awk求和:
nvprof --print-gpu-trace ./你的CUDA应用程序 | grep -E "Duration" | awk '{sum += $2} END {print "GPU总活跃时长: " sum " 毫秒"}'
- 获取应用实际运行耗时:有两种方式:
- 用nvprof自带的摘要输出,跑这条命令后,开头会显示
Application time: XXXX ms,这就是应用从启动到结束的总时间:nvprof --print-summary ./你的CUDA应用程序 - 或者直接用系统的
time命令跑纯应用(不带nvprof),得到最真实的运行耗时:time ./你的CUDA应用程序
- 用nvprof自带的摘要输出,跑这条命令后,开头会显示
最后算利用率:GPU利用率 = (GPU总活跃时长 / 应用总运行时长) * 100%
二、FP32浮点运算次数(FLOPS32)计算
要算FP32的FLOPS,得先拿到总运算次数,再除以运行时间就行:
步骤1:获取FP32总运算次数
用flop_count_sp指标可以直接拿到所有GPU kernel执行的单精度浮点运算总和:
nvprof --metrics flop_count_sp ./你的CUDA应用程序
输出里会有类似flop_count_sp: 2.45e+12的数值,这就是总FP32运算次数。
步骤2:计算FLOPS
用总运算次数除以运行时间就行,这里分两种场景:
- 如果你要算整个应用周期的平均FLOPS,就除以应用的总墙钟时间;
- 如果你要算GPU活跃时的峰值FLOPS,就除以GPU总活跃时长。
举个例子:总FP32次数是2.45e+12,应用总耗时是2秒,那平均FLOPS就是2.45e+12 / 2 = 1.225 TFLOPS。
另外,如果你想细分FP32的运算类型(比如加法、乘法、融合乘加),可以用这些更细的指标:
nvprof --metrics flop_count_sp_add,flop_count_sp_mul,flop_count_sp_fma ./你的CUDA应用程序
注意融合乘加(FMA)每次操作算2次浮点运算,不过flop_count_sp已经帮你把这个总和算好了,不用自己手动加。
小提醒
- 如果你的应用有多个kernel,nvprof默认会输出每个kernel的单独指标,加上
--aggregate-mode sum可以直接得到所有kernel的总和,--aggregate-mode average能得到平均值; - 分析时尽量关闭其他占用GPU的程序,不然会影响GPU利用率的准确性。
内容的提问来源于stack exchange,提问作者Lucien Wang
相关产品推荐
相关产品推荐

