解释NVIDIA可视探查器输出 我最近开始使用英伟达视觉分析器(CUDA 7.5)来计时我的应用程序。p>

解释NVIDIA可视探查器输出 我最近开始使用英伟达视觉分析器(CUDA 7.5)来计时我的应用程序。p>,cuda,profiling,Cuda,Profiling,然而,我似乎并不完全理解我得到的结果的含义。我不知道如何处理不同的分析器输出 例如:在for循环中调用单个内核约360次的CUDA代码。每次,内核计算大约1000次3D纹理内存读取。每个512^2单元分配一个线程。需要一些算法来知道在纹理内存中读取哪个位置。纹理内存读取不进行插值,始终以精确的数据索引执行。之所以选择3D纹理内存,是因为memreads将是相对随机的,因此不期望内存合并。我找不到这方面的参考资料,但肯定是在某处读到的 描述很短,但我希望它能对内核所做的操作给出一个小的概述(发布整

然而,我似乎并不完全理解我得到的结果的含义。我不知道如何处理不同的分析器输出

例如:在for循环中调用单个内核约360次的CUDA代码。每次,内核计算大约1000次3D纹理内存读取。每个
512^2
单元分配一个线程。需要一些算法来知道在纹理内存中读取哪个位置。纹理内存读取不进行插值,始终以精确的数据索引执行。之所以选择3D纹理内存,是因为memreads将是相对随机的,因此不期望内存合并。我找不到这方面的参考资料,但肯定是在某处读到的

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

从现在起,我将描述我对分析器的解释


评测时,如果我运行
检查GPU使用情况
我会得到(单击放大):

从这里我看到了几件事:

  • 低内存复制/计算重叠0%。这是预期的,因为我运行一个大内核,等待它完成,然后是memcopy。不应该有重叠
  • 低内核并发性0%。我刚刚得到一个内核,这是预期的
  • 低拷贝重叠0%。同样的事情。我在乞讨中只复制一次memcopy,在每个内核之后复制一次memcopy。这是意料之中的
从内核执行“条”的顶部和右侧,我可以看到:

  • 大部分时间是运行内核。内存开销很少
  • 所有内核占用相同的时间(好)
  • 最大的标志是占用率,始终低于45%,这是限制因素。然而
我通过运行
Perform Kernel Analysis
来跟踪我的评测,获得:

我可以在这里看到

  • 内核中的计算和内存利用率较低。剖析者认为低于60%是不好的
  • 大部分时间用于计算和二级缓存读取
还有别的吗

我继续执行延迟分析,因为探查器显示最大的瓶颈在那里

最大的三个原因似乎是

  • 内存依赖关系。纹理模念太多?但我需要这么多的记忆
  • 执行依赖关系。“可以通过增加指令级并行性来减少”。这是否意味着我应该尝试更改,例如
    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。受寄存器使用限制(在“内核Lantency”分析中检查),2.扭曲效率低(小于100%表示线程发散)(在“发散执行”中检查)

有没有办法在内核内部的指令级进行评测

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

  • '内核配置文件-指令执行'
  • “内核配置文件-PC采样”(仅在Maxwell中)
  • 通过查看剖面图,是否可以得出更多的结论 比我得到的要多

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

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

    我发现内核延迟窗口是最有用的窗口,但我认为它取决于您正在分析的内核类型