解释 NVIDIA Visual Profiler 输出

Posted

技术标签:

【中文标题】解释 NVIDIA Visual Profiler 输出【英文标题】:Interpreting NVIDIA Visual Profiler outputs 【发布时间】:2016-06-23 22:01:29 【问题描述】:

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

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

作为示例: 一个在 for 循环中调用单个内核的 CUDA 代码约 360 次。每次,内核计算512^2 次大约 1000 次 3D 纹理内存读取。每个512^2 的单位分配一个线程。需要一些算术来知道在纹理内存中读取哪个位置。纹理内存读取是在没有插值的情况下执行的,总是在精确的数据索引中。之所以选择 3D 纹理内存,是因为 memreads 会比较随机,所以不希望内存合并。我找不到这方面的参考资料,但肯定在某处读过。

描述很简短,但我希望它对内核所做的操作提供一个小的概述(发布整个内核可能太多了,但如果需要我可以)。

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


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

从这里我看到了几件事:

内存复制/计算重叠率低 0%。这是意料之中的,因为我运行一个大内核,等到它完成然后再进行内存复制。不应有重叠。 低内核并发 0%。我刚得到 1 个内核,这是意料之中的。 低内存复制重叠 0%。一样。我只在乞求中进行一次memcopy,并且在每个内核之后我都进行一次memcopy。这是意料之中的。

从内核执行“条”中,我可以看到顶部和右侧:

大部分时间都在运行内核。内存开销很小。 所有内核都需要相同的时间(好) 最大的标志是占用率,总是低于 45%,是寄存器限制器。但是,optimizing occupancy doesn't seem to be always a priority。

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

我可以在这里看到

内核中的计算和内存利用率很低。分析器表明低于 60% 是不好的。 大部分时间都在计算和二级缓存读取。

还有什么?

我继续Perform Latency Analysis,因为分析器表明最大的瓶颈就在那里。

最大的 3 个失速原因似乎是

内存依赖。纹理记忆读物太多?但我需要这么多的内存读取。 执行依赖。 “可以通过增加指令级并行度来减少”。这是否意味着我应该尝试改变例如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】:

我可以执行更多额外的测试来更好地理解我的 内核执行时间限制?

当然!如果你注意“属性”窗口。您的屏幕截图告诉您,您的内核 1. 受寄存器使用限制(在 'Kernel Lantency' analisys 上检查),并且 2.Warp 效率低(低于 100% 意味着线程发散)(在 'Divergent Execution' 上检查)。

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

是的,您可以使用两种类型的分析:

    '内核配置文件 - 指令执行' “内核配置文件 - PC 采样”(仅在 Maxwell 中)

通过查看配置文件可以获得更多结论吗 比我得到的那些?

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

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

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

【讨论】:

以上是关于解释 NVIDIA Visual Profiler 输出的主要内容,如果未能解决你的问题,请参考以下文章

markdown 如何使用NVIDIA profiler #cuda

符合 Nvidia Tegra profiler 2.0 的移动设备

使用 Visual Studio 2012 Profiler 分析 C++

Visual Studio 2008 Profiler - C++ 库问题

从命令行与 Visual Studio 运行 Profiler

如何使用 Visual Profiler 分析 PyCuda 代码?