你如何描述&优化CUDA内核?

时间:2010-02-05 01:40:16

标签: optimization profiling cuda

我对CUDA视觉分析器和占用电子表格有点熟悉,虽然我可能没有尽可能地利用它们。剖析&优化CUDA代码不像分析和优化在CPU上运行的代码。所以我希望从您的经验中学习如何充分利用我的代码。

最近有一篇帖子正在寻找最快的代码来识别self numbers,我提供了CUDA implementation。我不满意这段代码尽可能快,但我不知道要找出正确的问题是什么,以及我可以从哪个工具中得到答案。

如何确定使CUDA内核执行速度更快的方法?

4 个答案:

答案 0 :(得分:21)

如果您正在Linux上进行开发,那么CUDA Visual Profiler会为您提供大量信息,知道如何处理它可能有点棘手。在Windows上,您还可以使用CUDA Visual Profiler,或者(在Vista / 7/2008上),您可以使用与Visual Studio很好地集成的Nexus,并为您提供组合的主机和GPU配置文件信息。

获得数据后,您需要知道如何解释数据。来自GTC的Advanced CUDA C演示文稿提供了一些有用的提示。需要注意的主要事项是:

  • 最佳内存访问:您需要知道您希望代码执行的操作,然后查找异常。因此,如果您总是加载浮点数,并且每个线程从数组加载不同的浮点数,那么您可能只会看到64字节的加载(在当前的h / w上)。任何其他负载都是低效的。未来的h / w可能会改进分析信息。
  • 最小化序列化:“warp serialize”计数器表示您有共享内存库冲突或持续序列化,演示文稿详细说明以及如何处理SDK(例如缩减示例)
  • 重叠I / O和计算:这是Nexus真正发光的地方(你可以使用cudaEvents手动获取相同的信息),如果你有大量的数据传输你想要重叠计算和I / O
  • 执行配置:占用计算器可以为此提供帮助,但是评估计算以测量预期带宽和测量带宽等简单方法非常有用(反之亦然,计算吞吐量)

这只是一个开始,请查看GTC演示文稿以及NVIDIA网站上的其他网络研讨会。

答案 1 :(得分:0)

CUDA分析器相当粗糙,并没有提供很多有用的信息。认真微优化代码的唯一方法(假设您已经选择了最佳算法)是深入了解GPU架构,特别是在使用共享内存,外部内存访问模式,寄存器使用,线程占用方面,经线等

也许你可以在这里发布你的内核代码并得到一些反馈?

nVidia CUDA developer forum论坛也是寻求这类问题帮助的好地方。

答案 2 :(得分:0)

如果您使用的是Windows ...请检查Nexus:

http://developer.nvidia.com/object/nexus.html

答案 3 :(得分:0)

我回来了,因为我不是CUDA专家,如果代码已经非常接近最佳,其他答案也相当不错。根据我的经验,这是一个很大的IF,并且在验证它时没有任何害处。

要验证它,您需要确定代码是否确实没有做任何它不需要做的事情。我可以通过以下方式验证:

  • 在vanilla处理器上运行相同的代码,然后取stackshots,或者使用Oprofile或RotateRight / Zoom等分析器,它们可以为您提供相同的信息。

  • 在CUDA处理器上运行,并尽可能做同样的事情。

您正在寻找的是在调用堆栈上具有高占用率的代码行,如包含它们的堆栈样本的分数所示。那些是你的“瓶颈”。它不需要大量的样本来定位它们。