数据中心/云端

NVIDIA Nsight 系统优化 CUDA 内存传输

 

NVIDIA Nsight Systems 是一个综合工具,用于跨 CPU 和 GPU 资源跟踪应用程序性能。它可以帮助确保硬件得到有效使用,跟踪 API 调用,并通过描述低级指标与应用程序性能的总和以及可以改进的地方,深入了解节点间网络通信。

Nsight 系统可以扩展到集群大小的问题,比如 multi-node analysis,但当您刚刚开始优化之旅时,它也可以用于发现简单的性能改进。例如,Nsight Systems 可以用来查看哪里的内存传输比预期的更昂贵。通过快速查看内存活动,可以发现并关联性能损失,并建议如何解决这些损失。

在这篇深入的文章中,我来看看 GROMACS 2019 和 GROMACS 2020 之间的变化。我与 Nsight Systems 一步一步地寻找前一版本中的 GPU 和内存优化机会,并研究它们在新版本中是如何解决的。

GROMACS 2019

GROMACS 是一个通用且广泛使用的软件包,用于生物分子(如蛋白质、脂质和核酸)的分子动力学( MD )模拟。它可以帮助研究人员检查疾病预防和治疗的重要生物过程。

我在带有 NVIDIA Volta GPU 的 Arm 服务器系统上使用 Nsight Systems 分析了 GROMACS 2019 。 Nsight Systems 包括一个用户界面和一个 CLI ,称为nsys.

运行以下命令 nsys 以收集没有 CPU 采样的 CUDA 和 NVTX 的跟踪信息。它可以用于从目标 Arm 服务器收集性能数据,然后可以在 Nsight Systems 用户界面中像往常一样进行分析。更多关于 nsys 和配置文件选项的信息,请参阅 单条命令行示例

nsys profile -t cuda,nvtx -s none gmx mdrun -dlb no -notunepme -noconfout -nsteps 3000

图 1 显示了执行该命令并打开报告文件。

Screenshot shows GROMACS 2019 run on an Arm server system with NVIDIA Volta GPUs before zooming in.
图 1 。 GROMACS 的 Nsight 系统命令行性能分析

Nsight Systems 使用细节级别( LOD )缩放来显示时间轴上每个像素下的 GPU 使用量。然而,在这种缩放级别上,数据过于密集,无法看到真实的图案。放大显示 Nsight Systems 捕获的内容的粒度。

同样,也有关于 GPU 活动的信息,但详细信息是在下拉列表下组织的。展开 GPU 行以显示有关流和上下文的信息。

Screenshot shows an expanded view of the GROMACS 2019 run, zoomed in to 1 second clock time.
图 2 : GROMACS 的硬件级吞吐量指标

在图 2 中,您可以开始看到 GPU 上内存传输和内核活动的重复模式。重复模式是正常的,但你也可以看到很多时间都花在了内存转移上。 GPU 活动中存在差距,表明存在改进的机会。

图 3 进一步放大到 0 . 1 秒的时钟时间。

Screenshot shows a GROMACS 2019 run, zoomed in to 0.1 seconds, revealing a pattern across kernels and memory on the GPU.
图 3 。 GPU 活动模式

在这个分辨率下,您可以清楚地看到 GPU 上的活动模式。在每次重复中,都会有一个主机到设备的内存传输(绿色),一些内核工作(蓝色),然后是一个内存传输回主机(品红色)。您还可以看到每个内核运行后、新内存传输开始前的暂停。

图 3 显示了从上一次设备主机传输结束到本次迭代的设备主机传输(选择标记为绿色)结束的单次迭代中的移位拖动。右键单击此处将显示菜单,您可以放大以隔离此迭代。

Screenshot shows isolating and zooming in on a single pattern of the GROMACS 2019 run for further analysis.
图 4 。利用 Nsight Systems 分析 GPU 吞吐量模式

在图 4 上标记的几件事需要指出:

  1. 这个[All Streams]是流的汇合。关注细分,注意有一个活动上下文和两个活动流(流 22 和 23 ),并且 Default 流是不活动的。每个流都将超过一半的时间用于内存传输。这个高百分比强烈表明您必须优化内存传输的大小,并考虑将其移动到默认流。
  2. 迭代大约需要 19 毫秒,但其中 3 毫秒的时间是在活动块之间的空白间隙中。这意味着有大约 17% 的加速等待被捕获。下一个好的步骤是运行 CPU 配置文件来检查暂停的编程原因。
  3. 内存传输是序列化的。流 23 从主机获取数据,而流 22 等待,在它能够获取数据之前不做任何工作。工作完成后也会发生同样的事情。
  4. 最主要的工作内核是nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_cuda我建议在深入研究单个内核之前,先解决 CPU 和 GPU 时间线上的差距。

要查找最昂贵的内核,请右键单击所有流行并选择在事件视图中显示(图 5 )。

Screenshot shows the GROMACS 2019 events view displaying CUDA kernels and their run times.
图 5 。 Nsight 系统中的 CUDA 内核评测

按持续时间对 Events 视图进行排序会显示最昂贵的内核。不同的实例略有不同,但目前最昂贵的是约 10 毫秒。单击某个特定的内核实例会以青色高亮显示时间线上与其相关的所有事件。

在图 6 中,闭合行上的青色标记表示该行中的某些内容高亮显示。时间线顶部或左侧的箭头表示高亮显示的内容当前不在屏幕上。

Screenshot shows selecting a kernel from the Events View of the GROMACS 2019 run reveals its location on the timeline.
图 6 。 Nsight 系统内核分析

或者,您可以在事件表中单击鼠标右键,然后选择在日程表中显示当前以将时间轴缩放到该内核。

Screenshot shows menu for right-clicking on a CUDA kernel to analyze it with Nsight Compute.
图 7 。从 Nsight Systems 启动 Nsight Compute

大多数时候,您会集中精力消除时间线间隙,并确保在深入到各个内核之前,工作已分配给所有 CPU 和 GPU 。届时,或者如果内核性能与您的期望不符,您可以右键单击感兴趣的内核并选择使用 NVIDIA Nsight Compute 分析所选内核.

Nsight Compute 是一个强大的独立工具,用于分析、调试和优化 CUDA 内核。如果它已安装在您的机器上,您可以直接从 Nsight Systems 中有问题的内核启动它的用户界面或 CLI。

GROMACS 2020

NVIDIA 与斯德哥尔摩 GROMACS 开发团队合作,对 GROMACS 进行了改进。有关详细信息,请参阅 《将 Gromacs 带入现代多 GPU 系统的新速度》

您可能会注意到以下几个变化:

  • 这个nbnxn_gpu_x_to_nbat_x_内核是一个函数的 GPU 实现,该函数将原子的坐标数据从“ XYZ ”转换为一个结构,该结构中也有数据局部性的电荷: XYZQ 。在 GROMACS 2019 中,这是在 CPU 上完成的。 2020 版本调整了内存传输的大小,并将其移动到默认流。
  • 长内核nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_cuda现在启用两个流之间的重叠内核执行。
Nsight Systems performance analysis of GROMACS 2020 zoomed in on the timeline to show ~0.1 sec.
图 8 。 Nsight Systems 2020 GROMACS 简介

将图 8 中的结果与图 3 中的结果进行比较。两者都显示约 100 毫秒的挂钟时间。如图 8 所示, GPU 中有更多的时间实际上是在工作。 GPU 的使用显然在不同版本之间进行了优化。

几乎所有的内存传输工作都转移到了默认流上,这意味着这两个活动流在内存传输操作上花费的时间很少( 4% 和 2.5% ,而 GROMACS 2019 中超过 50% )。小的内存传输也被组合成更大的大小,仍然适合传输缓冲区。

Screenshot shows Nsight Systems isolating a single pattern of GPU activity for GROMACS 2020.
图 9 。放大到 GROMACS 2020 的单次迭代

将图 4 ( GROMACS 2019 的一个工作片段)与图 9 ( GROMACS 2020 的一个作品片段)进行比较并不公平。正如我前面提到的,大部分内存传输都被打包并转移到默认流。有几件有趣的事情需要注意:

  • 在这两个流之间有更多的并行内核执行。
  • 这个nbnxn_gpu_x_to_nbat_x_在进行昂贵的计算之前,内核正在 GPU 上运行。将其移动到 GPU 而不是 CPU 不仅填充了一些间隙时间,而且还消除了一些存储器传输开销。
  • 昂贵的内核,nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_cuda,并没有变得更快。最长的实例仍然大约是 10 毫秒。然而,由于它在整个运行迭代中更有效地提供了数据,因此这项工作减少到了 10 毫秒,而不是 GROMACS 2019 中的 19 毫秒。

既然间隙被清除了,nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_cuda在运行时占主导地位,这表明您的性能调优之旅接下来应该转到该内核。

主要收获

改进 CUDA 内核并不是优化 GPU 代码时应该做的第一件事。提高内存利用率并确保 GPU 得到足够的“馈送”,会产生最直接的影响。

当最初重构 GPU 或转移到新一代的 GPU 硬件时,这一点尤其重要。如果 GPU 缺乏工作,您将永远无法实现可用的性能提升。

准备好开始了吗?

这只是 Nsight Systems 必须提供的所有系统性能信息的开始。

您可以从 NVIDIA CUDA ToolKit public download 中获取 NVIDIA Nsight Systems。此外,您还可以在 NVIDIA CUDA 工具包中获取最新的 Nsight Systems 增强和修复,请访问 Nsight Systems 页面。

想了解更多关于 GROMACS 的信息,请参阅 http://manual.gromacs.org/documentation/

关于最近的其他帖子,请参阅以下内容:

有关文章、视频和其他教程的完整列表,请参阅 Nsight Systems 文档的Other Resources第节。

有任何问题吗?请将其发布到 NVIDIA 论坛 NVIDIA Nsight Systems,或者将邮件发送至 nsight-systems-feedback@NVIDIA.com。或者,只需在应用程序中选择 反馈,让我们知道您所看到的以及您的想法。

 

Tags