使用NVidia Visual Profiler进行过多的分析器开销

时间:2017-10-23 23:53:20

标签: nvvp

在尝试使用nvvp(或使用nvprof)来分析我的代码时,我得到了很多分析开销:

nvvp timeline with 85ms of overhead in 98ms of total runtime 整个时间是98毫秒,我在第一次内核启动时获得了85毫秒的“Instrumentation”。

如何减少此分析开销或以其他方式放大我感兴趣的部分?

背景

我正在使用“启用分析启动执行”运行此操作并且我使用cudaProfilerStart / cudaProfilerStop限制了分析,如下所示:

/* --- generate data etc --- */
// Call the function once to warm up the FFT plan cache
applyConvolution( T, N, stride, plans, yData, phiW, fData, y_dwt );
gpuErrchk( cudaDeviceSynchronize() );
// Call it once for profiling
cudaProfilerStart();
applyConvolution( T, N, stride, plans, yData, phiW, fData, y_dwt );
gpuErrchk( cudaDeviceSynchronize() );
cudaProfilerStop();

其中applyConvolution()是我正在分析的功能。

我在Ubuntu 16.04上使用带有GTX 1080的CUDA Toolkit 8.0。

2 个答案:

答案 0 :(得分:3)

当我写这个问题的时候,我想我会尝试使用探查器设置来试图抢占一些潜在的回答评论材料。

令我惊讶的是,禁用“启用并发内核分析”完全消除了分析器开销:

enter image description here

但也许这不应该是一个惊喜:

  

启用并发内核分析 - 应选择此选项   对于使用CUDA流来启动可以的内核的应用程序   并发执行。如果应用程序仅使用单个流   (因此不能有并发内核执行),取消选择   此选项可能会降低分析开销。

(摘自http://docs.nvidia.com/cuda/profiler-users-guide/

早期版本的CUDA Profiler用户指南还在“性能限制”部分中指出:

  

如果在内核上使用,并发内核模式会增加很多开销   执行大量的块并且执行时间很短。

好吧,好吧。无论如何都要发布这个问题/答案以防其他人避免这种烦恼。

答案 1 :(得分:1)

我看到了类似的东西,但是可能只是模糊地相关。但是,由于上述答案有所帮助,因此我将添加我的观察结果。

与Pascal-gen卡(例如1080)相比,对Quadro GV100进行性能分析时,相当简单的内核在表观性能上发生了巨大变化。我也正在禁用概要分析的情况下运行nvvp,并在我感兴趣的部分代码中将其激活。然后我不小心忽略了将其打开,而我得到的只是我们的手动事件标记(使用nvtxRangePush和nvtxRangePop)。你知道的,十倍加速。也就是说; 在Quadro GV100上,存在大量分析开销,而前一代GPU则没有

像您一样禁用并发概要分析并没有帮助,但又禁用了API跟踪做了

尽管与手动nvtx相比仍然存在大量开销,但是至少它可以让GV100了解内核性能。较大的内核似乎受到的影响较小,如果与固定成本的开销或API跟踪有关,这是很自然的。剩下的未知数就是为什么在GV100上API跟踪成本如此之高,但是我无能为力,至少现在还没有。

我针对上述测试使用gcc / 5.4和cuda / 9.0编译了sm特定的二进制文件,并针对简单的测试用例运行了RELION单线程。