解释NVIDIA Visual Profiler输出

时间:2016-03-09 13:35:31

标签: cuda profiling

我最近开始使用NVIDIA Visual Profiler(CUDA 7.5)来为我的应用程序计时。

但是,我似乎并不完全理解我得到的产出的含义。我没有准备好知道如何对不同的探查器输出采取行动。

作为示例:在for循环中调用单个内核~360次的CUDA代码。每次,内核计算512^2次约1000个3D纹理内存读取。每单位512^2分配一个线程。需要一些算术来知道在纹理存储器中读取哪个位置。纹理存储器读取在没有插值的情况下执行,始终在精确数据索引中。选择3D纹理内存的原因是因为memreads将是相对随机的,因此不期望内存合并。我找不到这方面的参考,但绝对在某处读到它。

描述很简短,但我希望它能简要概述一下内核的操作(可能会发布整个内核过多,但如果需要,我可以发布)。

从现在开始,我将描述我对分析器的解释。

分析时,如果我运行Examine GPU usage我得到(点击放大):

enter image description here

从这里我看到几件事:

  • 低记忆/计算重叠 0%。这是预期的,因为我运行一个大内核,等到它完成然后memcopy。不应该重叠。
  • 低内核并发 0%。我只有1个内核,这是预期的。
  • 低记忆重叠 0%。一样。我只在记忆中记忆一次,每次内核后我记忆一次。这是预期的。

从内核执行“bars”,top和right我可以看到:

我通过运行Perform Kernel Analysis跟踪我的分析,获得:

enter image description here

我在这里可以看到

  • 内核中的计算和内存利用率很低。分析师认为低于60%并不好。
  • 大部分时间都是计算和二级缓存读取。

还有别的吗?

我继续Perform Latency Analysis,因为剖析器表明存在最大的瓶颈。

enter image description here

最大的3档原因似乎是

  • 内存依赖性。纹理memreads太多了?但我需要这么多的记忆。
  • 执行依赖。 “可以通过增加指令级并行性来减少”。这是否意味着我应该尝试改变,例如a=a+1;a=a*a;b=b+1;b=b*b;a=a+1;b=b+1;a=a*a;b=b*b;
  • 取指令(????)

问题:

  • 我是否可以执行更多其他测试来更好地了解内核的执行时间限制?
  • 有没有办法在内核中的指令级进行分析?
  • 通过查看分析而不是我获得的分析,可以获得更多结论吗?
  • 如果我开始尝试优化内核,我将从哪里开始?

1 个答案:

答案 0 :(得分:3)

  

我是否可以执行更多其他测试以更好地了解我的   内核执行时间限制?

当然!如果你注意“属性”窗口。您的屏幕截图告诉您内核1.受寄存器使用限制(在“内核Lantency”分析中检查),2 .Warp效率低(低于100%表示线程分叉)(在“Divergent Execution”上查看) )。

  

有没有办法在内核中的指令级进行分析?

是的,您有两种类型的分析:

  1. '内核配置文件 - 指令执行'
  2. '内核配置文件 - PC采样'(仅限麦克斯韦)
  3.   

    通过查看分析,可以获得更多结论   比我获得的那些?

    你应该检查你的内核是否有一些线程分歧。此外,您应该检查共享/全局内存访问模式是否存在问题。

      

    如果我开始尝试优化内核,我将从哪里开始?

    我发现Kernel Latency窗口是最有用的窗口,但我想这取决于你正在分析的内核类型。