如何仅通过nvprof配置CUDA应用程序

时间:2018-05-07 06:44:14

标签: cuda nvprof

我想编写一个脚本来仅使用命令工具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_*指标的速度非常慢。

所以我想问两个问题:

  1. 如何使用nvprof计算CUDA应用程序的经过时间(无开销)?
  2. 有没有更快的方法来获取gpu flops32?
  3. 任何建议都将不胜感激。

    ================更新=======================

    对于上面的第一个问题,经过时间没有开销,我的意思是实际上会话时间 - 开销时间在nvvp结果中显示:

    nvvp results

1 个答案:

答案 0 :(得分:1)

您可以使用nVIDIA的NVTX库以编程方式标记时间轴上的命名范围或点。这样一个范围的长度,正确定义,将构成你的经过时间",并将在nvvp可视化工具中非常清楚地显示。这是一个" CUDA专业提示"博客文章关于这样做:

CUDA Pro Tip: Generate Custom Application Profile Timelines with NVTX

如果您想以更加C ++友好的RAII方式执行此操作,则可以使用我的CUDA runtime API wrappers,其中提供scoped range markerother utility functions。当然,在我作为作者的情况下,请将我的推荐与我的推荐相提并论,看看哪些对您有用。

关于"经过的时间"对于会话 - 这是您开始和停止分析活动之间的时间。这可以是当进程出现时,或者当您明确地进行性能分析时。在我自己的API包装器中,还有一个RAII类:cuda::profiling::scope或者当然你可以显式地使用C风格的API调用。 (我应该写一个示例程序来做这个,不幸的是我还没有解决这个问题。)