如何对CUDA核心进行性能分析和优化?

19
我对CUDA可视化分析器和占用率电子表格有一定了解,但可能没有充分利用。优化CUDA代码与优化在CPU上运行的代码不同。因此,我希望从您的经验中学习如何充分利用我的代码。
最近有一篇帖子寻找最快的自身数字识别代码,我提供了CUDA实现。我不满意这段代码的速度,但我无法确定正确的问题和可以得到答案的工具。
您如何确定使CUDA内核运行更快的方法?
4个回答

22
如果你在Linux上开发,则CUDA可视化分析器会提供大量信息,但要知道如何使用它可能有点棘手。在Windows上,你也可以使用CUDA可视化分析器,或者(在Vista/7/2008上)可以使用与Visual Studio很好集成并提供组合主机和GPU配置文件信息的Nexus。
一旦你获得了数据,就需要知道如何解释它。GTC的Advanced CUDA C演示文稿提供了一些有用的提示。需要注意的主要事项包括:
- 最佳内存访问:你需要知道你希望代码执行什么操作,然后寻找异常。因此,如果你始终加载浮点数,并且每个线程从数组中加载不同的浮点数,则应该只看到64字节的加载(在当前硬件上)。任何其他加载都是低效的。性能分析信息可能会在未来的硬件中得到改进。 - 最小化串行化: "warp serialize"计数器表示你有共享内存冲突或常量串行化,演示文稿详细介绍了这一点以及如何处理此问题,SDK(例如缩减示例)也是如此。 - 重叠I/O和计算:这是Nexus真正闪耀的地方(你可以使用cudaEvents手动获取相同的信息),如果你有大量数据传输,你希望重叠计算和I/O。 - 执行配置:占用率计算器可以帮助解决此问题,但简单的方法是注释计算以测量预期带宽与实际带宽(反之亦然)。
这只是一个开始,请查看NVIDIA网站上的GTC演示文稿和其他网络研讨会。

谢谢,汤姆。那个演示文稿可以下载吗? - John Dibling
2
这是之前我提供的同一个链接!http://www.nvidia.com/content/GTC/videos/GTC09-1086.flv http://www.nvidia.com/content/GTC/videos/GTC09-1086.mp4 - Tom
谢谢,汤姆。我可能没看到你前几天对我的评论的回复。 - John Dibling
我在哪里可以获取Nexus?它是免费提供的吗? - username_4567
它是免费提供的。这个问题非常古老,Nexus已经变成了Parallel Nsight:http://developer.nvidia.com/nvidia-parallel-nsight - Tom

1

0

CUDA分析器相当粗糙,提供的有用信息不多。如果您已经选择了最佳算法,严肃微调代码的唯一方法是深入了解GPU架构,特别是关于使用共享内存、外部内存访问模式、寄存器使用、线程占用率、线程束等方面。

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

nVidia CUDA开发者论坛也是解决此类问题的好地方。


0

我没有回答,因为我不是CUDA专家,而且其他答案已经很好了,如果代码已经非常接近最优,那么这些答案就足够了。但是根据我的经验,这是一个大的假设,验证一下也无妨。

要进行验证,您需要找出代码是否确实没有做任何它不必要做的事情。以下是我可以看到的验证方法:

  • 在普通处理器上运行相同的代码,并获取stackshots,或使用Oprofile或RotateRight/Zoom等分析工具,以获得等效信息。

  • 在CUDA处理器上运行它,并尽可能地执行相同的操作。

您要查找的是在调用堆栈上具有高占用率的代码行,如包含它们的堆栈样本的分数所示。这些是您的“瓶颈”。定位它们并不需要很多样本。


你说得没错,那确实是个很大的“如果”。而我最关心的问题之一是如何确定你在第一时间选择了正确的算法。在 CPU 上正确的算法可能与在 GPU 上正确的算法有很大不同。 - John Dibling
@John-Dibling:那么,在这种情况下,我会看看如何在CUDA处理器上获取堆栈快照。我会努力寻找一个调试器,它可以至少暂停或步进一个处理器,并显示其状态。我已经调整代码,包括嵌入式代码和其他代码,已经有30年了,这是我使用的方法。唯一能够接近它的分析器是那些采用堆栈采样并在行/指令级别进行总结的分析器。 - Mike Dunlavey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接