【发布时间】: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;? - 指令获取 (??????)
问题:
- 我是否可以执行更多其他测试来更好地了解我的内核执行时间限制?
- 有没有办法在内核内部的指令级进行分析?
- 通过分析可以得到比我得到的更多的结论吗?
- 如果我要开始尝试优化内核,我会从哪里开始?
【问题讨论】: