【问题标题】:How Do You Profile & Optimize CUDA Kernels?您如何分析和优化 CUDA 内核?
【发布时间】:2011-01-13 08:31:36
【问题描述】:

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

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

您如何确定使您的 CUDA 内核运行得更快的方法?

【问题讨论】:

    标签: optimization profiling cuda


    【解决方案1】:

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

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

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • +1 感谢链接。你发帖的时候我刚去看看。
      【解决方案4】:

      我犹豫了,因为我不是 CUDA 专家,如果代码已经非常接近最优,其他答案也很好。根据我的经验,这是一个很大的 IF,验证它并没有什么坏处。

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

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

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

      您要查找的是调用堆栈上占用率很高的代码行,如包含它们的堆栈样本的一部分所示。这些是你的“瓶颈”。定位它们不需要大量的样本。

      【讨论】:

      • 你说得对,这是一个很大的 IF。我的一个主要问题是如何确定您首先选择了正确的算法。 CPU 上的正确算法可能与 GPU 上的正确算法大不相同。
      • @John-Dibling:好吧,在那种情况下,我会看看如何在 CUDA 处理器上获得堆栈快照。我会非常努力地寻找可以步进或暂停至少一个处理器并显示其状态的调试器。 30 年来,我一直在调整代码、嵌入式代码和其他代码,这就是我使用的方法。唯一可以接近它的分析器是那些获取堆栈样本并在行/指令级别进行汇总的分析器。
      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多