如何仅通过 nvprof 分析 CUDA 应用程序
Posted
技术标签:
【中文标题】如何仅通过 nvprof 分析 CUDA 应用程序【英文标题】:How to profile the CUDA application only by nvprof 【发布时间】:2018-05-07 06:44:13 【问题描述】:我想编写一个脚本来仅使用命令工具nvprof
来分析我的 cuda 应用程序。目前,我主要关注两个指标:GPU 利用率和 GPU flops32 (FP32)。
GPU 利用率是 GPU 处于活动状态的时间的一部分。 GPU 的活跃时间可以通过nvprof --print-gpu-trace
轻松获得,而应用程序的运行时间(没有开销)对我来说并不清楚。我使用视觉分析器nvvp
来可视化分析结果并计算 GPU 利用率。似乎经过的时间是第一次和最后一次 API 调用之间的间隔,包括开销时间。
GPU flops32 是 GPU 处于活动状态时每秒执行的 FP32 指令数。我按照 Greg Smith 的建议 (How to calculate Gflops of a kernel) 发现 nvprof
生成 flop_count_sp_*
指标的速度非常慢。
所以我想问两个问题:
-
如何使用 nvprof 计算 CUDA 应用程序的运行时间(无开销)?
有没有更快的方法来获取 gpu flops32?
任何建议都将不胜感激。
================更新=======================
对于上面的第一个问题,我的意思是 没有开销的经过时间实际上是 会话时间 - 开销时间显示在 nvvp 结果中:
nvvp results
【问题讨论】:
【参考方案1】:您可以使用 nVIDIA 的 NVTX 库以编程方式标记时间轴上的命名范围或点。这样一个范围的长度,正确定义,将构成您的“经过时间”,并且会在 nvvp 可视化工具中非常清楚地显示出来。这是关于这样做的“CUDA 专业提示”博客文章:
CUDA Pro Tip: Generate Custom Application Profile Timelines with NVTX
如果您想以更 C++ 友好和 RAII 的方式执行此操作,您可以使用我的CUDA runtime API wrappers,它提供了scoped range marker 和other utility functions。当然,以我为作者,请接受我的建议,看看什么对你有用。
关于会话的“已用时间” - 这是您开始和停止分析活动之间的时间。这可以是在进程启动时,也可以是在您明确启动分析时。在我自己的 API 包装器中,也有一个 RAII 类:cuda::profiling::scope 或者您当然可以显式使用 C 风格的 API 调用。 (我真的应该写一个示例程序来做这件事,不幸的是我还没有解决这个问题)。
【讨论】:
感谢您的热情回复,请参阅上面的更新。 一切顺利,非常感谢。顺便说一句,有没有什么方法可以通过 API 包装器显式获取分析开销时间? @LucienWang:如果你的意思是分析本身所占用的时间,我不确定甚至 nVIDIA 的 API 是否允许这样做。无论如何,不,不在我的包装库中。以上是关于如何仅通过 nvprof 分析 CUDA 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
分析一个CUDA矩阵加法代码,使用nvprof:代码API配置文件,内核没有
分析一个CUDA矩阵加法代码,使用nvprof:代码API配置文件,内核没有