我想编写一个脚本来仅使用命令工具nvprof
来配置我的cuda应用程序。目前,我专注于两个指标:GPU利用率和GPU flops32(FP32)。
GPU利用率是GPU处于活动状态的时间的一小部分。 GPU的活动时间可以通过nvprof --print-gpu-trace
轻松获得,而应用程序的经过时间(没有开销)对我来说并不清楚。我使用visual profiler nvvp
来可视化分析结果并计算GPU利用率。似乎经过的时间是第一次和最后一次API调用之间的间隔,包括开销时间。
GPU flops32是GPU在激活时每秒执行的FP32指令数。我按照Greg Smith的建议(How to calculate Gflops of a kernel)发现,nvprof
生成flop_count_sp_*
指标的速度非常慢。
所以我想问两个问题:
任何建议都将不胜感激。
================更新=======================
对于上面的第一个问题,经过时间没有开销,我的意思是实际上会话时间 - 开销时间在nvvp结果中显示:
答案 0 :(得分: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调用。 (我应该写一个示例程序来做这个,不幸的是我还没有解决这个问题。)