解释 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++ 库问题