我最近开始使用NVIDIA Visual Profiler(CUDA 7.5)来为我的应用程序计时。
但是,我似乎并不完全理解我得到的产出的含义。我没有准备好知道如何对不同的探查器输出采取行动。
作为示例:在for循环中调用单个内核~360次的CUDA代码。每次,内核计算512^2
次约1000个3D纹理内存读取。每单位512^2
分配一个线程。需要一些算术来知道在纹理存储器中读取哪个位置。纹理存储器读取在没有插值的情况下执行,始终在精确数据索引中。选择3D纹理内存的原因是因为memreads将是相对随机的,因此不期望内存合并。我找不到这方面的参考,但绝对在某处读到它。
描述很简短,但我希望它能简要概述一下内核的操作(可能会发布整个内核过多,但如果需要,我可以发布)。
从现在开始,我将描述我对分析器的解释。
分析时,如果我运行Examine GPU usage
我得到(点击放大):
从这里我看到几件事:
从内核执行“bars”,top和right我可以看到:
我通过运行Perform Kernel Analysis
跟踪我的分析,获得:
我在这里可以看到
还有别的吗?
我继续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;
? 问题:
答案 0 :(得分:3)
我是否可以执行更多其他测试以更好地了解我的 内核执行时间限制?
当然!如果你注意“属性”窗口。您的屏幕截图告诉您内核1.受寄存器使用限制(在“内核Lantency”分析中检查),2 .Warp效率低(低于100%表示线程分叉)(在“Divergent Execution”上查看) )。
有没有办法在内核中的指令级进行分析?
是的,您有两种类型的分析:
通过查看分析,可以获得更多结论 比我获得的那些?
你应该检查你的内核是否有一些线程分歧。此外,您应该检查共享/全局内存访问模式是否存在问题。
如果我开始尝试优化内核,我将从哪里开始?
我发现Kernel Latency窗口是最有用的窗口,但我想这取决于你正在分析的内核类型。