NVSHMEM 性能#

本节介绍在使用 NVSHMEM 运行时开发应用程序时需要考虑的一些关键 NVSHMEM 性能因素。

在应用程序中使用 16 字节对齐的缓冲区#

应用程序将倾向于使用分配的 16 字节对齐的 GPU 缓冲区,因为在内部,NVSHMEM 运行时将尝试使用 16 字节写入完成数据传输,这比 8 字节或未对齐的写入更有效。

为异构传输配置使用 nvshmem_*block#

如果应用程序工作流程与控制流程匹配,它将使用集体调用,例如 nvshmem_<OPS>_block。这些调用在远程传输和通过 NVIDIA (R) NVLink (R) 进行通信之间提供更好的性能可移植性,因为 NVLink 受益于使用多个线程来驱动更高的传输吞吐量。

调整 IBGDA 的队列对类型和配置#

NVSHMEM IBGDA 传输是 Mellanox Connect-X 设备的 GPUDirect Async Kernel-initiated 技术 (GDA-KI) 的实现。

GDA-KI 将通过远程网络发送内存的整个过程卸载到 GPU。这种传输与其他依赖于将消息传递给 CPU 代理线程以启动传输的传输不同。直接从 GPU 提交传输允许高度并行地向网络接口提交请求。小消息的增加的消息速率允许用户使用更小的数据缓冲区来饱和网络带宽。

增加的并行性带来了独特的性能特征和挑战

  • GPU 上的线程无法像 CPU 线程那样快速地填充工作队列条目 (WQE)。这导致单个消息的延迟更高。

  • 从资源分配的角度来看,为每个 GPU 线程提供唯一的队列对 (QP) 并非始终可行,并且它会增加静默和栅栏延迟。IBGDA 传输提供了几个调整参数,以平衡内存消耗和性能之间的权衡。
    第一组选项控制传输中使用的 QP 类型,以下是选项
    • NVSHMEM_IBGDA_NUM_DCI:每个 PE 创建的动态连接发起程序 (DCI) 的数量。

      动态连接的 QP 允许 DCI 连接到多个远程动态连接目标 (DCT)。在 NVSHMEM 中,这意味着每个 PE 可以有一个 DCI,该 DCI 连接到每个远程 PE 上的一个或多个 DCT。然而,DCT 实现的灵活性和内存节省是以相对于专用 QP(例如,可靠连接或 RC)降低性能为代价的。每次 DCI 切换到不同的 DCT 时,都必须使用半握手协议重新协商连接,这会增加传输的延迟。

      默认值等于设备上 SM 的数量。

    • NVSHMEM_IBGDA_NUM_DCT:每个 PE 创建的 DCT 的数量。

      此值应设置为至少 2,以保证充分利用底层 NIC 的带宽。

      默认值为 2。

    • NVSHMEM_IBGDA_NUM_RC_PER_PE:每个远程 PE 在本地 PE 上创建的可靠连接 (RC) QP 的数量。

      RC QP 为消息传输提供最低的延迟。然而,为每个远程 PE 创建专用 QP 的内存开销对于大规模应用程序来说可能是令人望而却步的。对于中小型作业,在连接总数不重要的情况下,我们建议您使用 RC QP。

      默认值为 2。

    如果用户指定了 DCI 和 RC,则传输将仅使用 RC 进行连接。如果两者都未指定,则传输将默认使用 DCI。这两个选项都具有基于映射类型的不同默认值,但用户可以覆盖它们。在某些情况下,如下所述,这是可取的。

    • 第二组选项可以与第一组选项结合使用,以便为某些工作负载类型提供更好的性能,或减少主机和目标所需的 QP 总数。这些选项有两种风格,分别对应于两种类型的 QP。
      • NVSHMEM_IBGDA_DCI_MAP_BY 包括以下选项
        • CTA:根据 CUDA 线程块(也称为调用 NVSHMEM API 的协同线程阵列 (CTA))选择要使用的 DCI。

          CTA 保证被调度到流式多处理器 (SM),但同一个 SM 上可能存在多个 CTA。此选项对于调度工作负载的应用程序很有用,在这些应用程序中,每个 SM 调度多个 CTA。如果用户未设置 IBGDA_NUM_DCI,则 NVSHMEM 默认情况下将为每个 SM 创建一个 DCI。例如,当您启动的最大 CTA 数量小于 SM 总数时,将默认值设置为用户将同时使用的最大 CTA 数量(低资源,低同步开销)。

        • SM:此选项与上一个选项类似,但使用底层硬件 SM 来确定要使用的 DCI。

          此选项对于以匹配 SM 大小的单元调度工作的用户很有用。与上面的选项一样,如果用户未设置 IBGDA_NUM_DCI,则 NVSHMEM 默认情况下将为每个 SM 创建一个 DCI。此选项相对于 CTA 选项具有额外的开销。多个 CTA 可以映射到 SM 这一事实需要在向 QP 提交操作时进行更重的同步。对于 CTA,您可以使用块作用域原子操作来避免 QP 上的争用,但在 SM 情况下,需要执行开销更大的完整设备原子操作。

注意

CTA 是首选选项(低资源,高同步开销)。

  • WARP:此选项对于从 CTA 的较小子集驱动到多个对等点的 IO 的应用程序很有用。

    例如,在具有每个 CTA 32 个 warp 和 32 个对等点的全对全通信模式中,用户可以将 DCI 的数量设置为 32,并使用 WARP 映射来确保每个 warp 都有一个专用的 DCI。通过这种映射方式,用户可以避免序列化提交到 QP 和为每个提交操作的 warp 重新协商连接的惩罚。此选项比之前的选项更占用内存。如果用户未设置 IBGDA_NUM_DCI,则 NVSHMEM 默认情况下将创建 num_warps_per_sm * num_sms 个 DCI(高资源,低同步开销)。

  • DCT:如果有足够的 DCI,此选项会将每个 DCI 锁定到一个特定的 DCT。

    此选项强制 DCI 到 DCT 的一对一映射,即使 DCI 随时间被不同的 warp CTA 或 SM 使用,也消除了在迭代之间重新建立连接的需要。然而,选择 DC 而不是 RC 的一些内存节省优势会丢失。用户可以在 NVSHMEM_IBGDA_NUM_DCI 中指定较少的 DCI,以完成与 DCT 的一对一映射。在这种情况下,每个 DCI 将被锁定到 DCT 的一个小子集。用户可以指定比 DCT 数量更少的 DCI,因此此选项仍然比 RC 更节省内存,RC 需要在每个 QP 的两端创建和连接。此选项还需要设备作用域原子操作来保证正确性(高资源,高同步开销)。

默认值为 CTA

  • NVSHMEM_IBGDA_RC_MAP_BY 包括以下选项

对于这些选项,没有创建的 QP 的默认数量,因此用户必须根据映射类型指定要创建的 QP 数量(RC 比 DCI 具有更低的延迟)。

  • CTA:这在语义上与 DCI 选项相同。

  • SM:这在语义上与 DCI 选项相同。

  • WARP:这在语义上与 DCI 选项相同。

默认值为 CTA