Recent Developments in NVIDIA Math Libraries

Harun Bayraktar, Director of Engineering
Roman Dubtsov, Principal Engineer
Samuel Rodriguez Bernabeu, Senior Engineer
GTC Spring 2023 | S51176

目录 (Table of Contents)


第一章:单GPU库的进展 (Chapter 1: Developments in Single-GPU libraries)

数学API (MATH API)

支持8位浮点数 (FP8) 和动态编程 (DPX)。

8位浮点数 (FP8) 类型和转换 从 CUDA Toolkit 11.8 开始可用:

  • 支持 E4M3 和 E5M2。
  • 包含在 cuda_fp8.h 头文件中。
  • 与 C & C++ 兼容。
  • 两种用于缩小的饱和模式:无饱和、饱和至有限。
  • 标量和打包存储容器:_nv_fp8_e4m3_nv_fp8_e5m2_nv_fp8x2_e4m3_nv_fp8x2_e5m2_nv_fp8x4_e4m3_nv_fp8x4_e5m2

动态编程 (DPX) 指令 从 CUDA Toolkit 12.0 开始可用:
* 用于标量和打包整数类型的融合算术运算。
* 3路最大值 + ReLU:max(max(max(a, b), c), 0) - _vimax3_s32_relu
* 融合加法 + 最大值:max(a + b, c) - _viaddmax_u32
* 加速基因组算法。

Smith and Waterman Performance A100 vs. H100+DPX (Page 4)
图示:Smith and Waterman 性能对比。H100 (DPX) 相较于 A100 (INT32) 实现了 7.8X 的加速。

cuSPARSE (通用更新)

CUDA 12.0 更新:
* 稀疏三角求解器改进:
* 预处理快 2.5X。
* 单 RHS (SpSV) 执行快 1.1X。
* 多 RHS (SpSM) 执行快 3.0X。

  • 稀疏 x 稀疏矩阵乘法 (SpGEMM):引入了内存利用率更低、性能更好的新算法。

CUDA 12.1 更新:
* 引入了原地 SpSV & SpSM。
* SDDMM (稠密矩阵乘稀疏矩阵输出的稠密矩阵乘积) 性能改进。

CUDA 12.1 之后的规划
* SpSV 将支持修改矩阵的非零元素,无需新的分析阶段。
* 支持用于 SpMV 和 SpSV 的 ELLPACK 格式 (针对“模板矩阵”)。
* 分块压缩稀疏行 (CSR) SDDMM。

Sparse Matrix Visualization (Page 5)
图示:一个稀疏矩阵的可视化,展示了其大部分元素为零。

cuSPARSE SpGEMM (稀疏乘稀疏矩阵乘法) 具有更低的内存要求

CUDA Toolkit 12.0 发布的新功能:
* 以前的算法存在限制,阻碍了在某些情况下的采用(旧算法已移除:不支持转置,性能低下)。
* ALG1 随 CTK 11 引入,但有内存上限要求。
* 新增两种算法以降低内存要求:
* ALG2:严格内存边界。
* ALG3:可调内存边界。
* 适用于所有 GPU。

  • 同时改进了性能和内存使用。

Memory Reduction and Performance Improvement Relative to Legacy Implementation (Page 6)
图示:左侧为内存缩减与传统实现的对比,右侧为性能提升与传统实现的对比。图下方为稀疏矩阵乘法的可视化示例。

cuSPARSE BSR - 用于稀疏 Transformer 的分块压缩稀疏行 (CSR) SDDMM

  • SDDMM (又称受限 GEMM):

    • 机器学习算法中必需。
    • 目前支持 CSR 格式。
    • 用户对 BSR 格式兴趣浓厚。
  • CSR 格式在 CUDA 12.0 中进行了优化。

  • CUDA 12.1 中支持混合精度 SDDMM。
  • BSR 格式将在未来版本中添加。

SDDMM BSR vs CSR performance comparison and Sampled Dense Dense Matrix Multiply Operation (Page 7)
图示:左侧为 SDDMM BSR 与 CSR 格式性能对比图,显示 BSR 随块大小增加而性能优于 CSR。右侧为稠密稠密矩阵乘法示例图,用于可视化稀疏与稠密矩阵。

cuSOLVER (稠密线性代数)

CUDA 12.1 更新:
* 稠密线性代数核心函数。
* 专注于 H100 优化。
* Cholesky 和 SYEVD 的新实现显著提高了性能。

即将发布
* QR 分解的进一步优化。

Dense Linear Algebra Routines Performance Improvements - H100 vs A100 (Page 8)
图示:H100 相较于 A100 的稠密线性代数例程性能改进,涵盖 Cholesky (DPOTRF)、LU (DGETRF)、QR (DGEQRF) 和对称特征值求解器 (DSYEVD) 等,随着矩阵尺寸的增大,H100 展现出显著的加速。

图像处理库 (GPU加速的图像编码和解码)

nvJPEG
* 支持 jpeg 无损 (过程 14,一阶预测)。
* 将在即将发布的 CUDA 版本和 DALI 1.23 中提供。
* 基于软件的编码/解码现已在 L4T (Jetson) 上可用。

nvJPEG2000
* 高吞吐量 JPEG2000 解码。
* v0.7 版本已于 2023 年 3 月发布。

未来几个月的计划
* nvTIFF 中支持 geoTIFF。
* nvPNG 将于 2023 年晚些时候提供。

相关演讲
* S51182:克服基于 AI 的图像和计算机视觉管线中的预处理和后处理瓶颈。
* S51286:基于 CUDA 的 PNG 图像编码器和解码器加速。

nvJPEG HW decoding throughput (Page 9)
图示:nvJPEG 硬件解码吞吐量对比。对于 4K UHD 图像,H100 (80GB) 相较于 A100 (40GB) 提供了 1.6X 的吞吐量提升。


第二章:cuBLAS、Hopper和Ada (Chapter 2: cuBLAS, Hopper and Ada)

Tensor Core 性能跨代改进 (从 Volta 到 Hopper 的 100 级 GPU)

Tensor Core Performance Improvements Over Generations (Page 11)
图示:从第一代 (GV100) 到第四代 (GH100) Tensor Core 性能的逐代提升,针对 FP64、TF32、FP16/BF16、INT8 和 FP8 等不同精度。可以看到,FP8 在 GH100 上达到了 2141 TFLOPS 的峰值性能。

Tensor Core 可编程性软件栈 (从低抽象级别到高抽象级别)

Tensor Cores Programmability Software Stack (Page 12)
图示:Tensor Core 可编程性软件栈,从底层直接可编程性(如 mma.async)到顶层主机 API 库(如 cuBLAS/Lt、cuTENSOR),展示了不同抽象级别的组件。Dx 库能够融合 NVIDIA 优化库功能和用户代码。
(1) 简化图示目的。库在某些情况下使用其他内核源。
(2) 未来版本。
(3) https://developer.nvidia.com/math/cutlass
(4) https://github.com/NVIDIA/cutlass

cuBLAS 家族概述 (概览)

  • cuBLAS(1):一个 GPU 加速的 NETLIB BLAS。扩展为较低和混合精度提供有限支持。
  • cuBLASLt:一个较低级别的 matmul API。灵活的类型组合。启发式选择最优的结尾操作。可编程启发式算法可在硬件发布时选择最佳内核。
  • cuBLASXt:一个多 GPU 单节点。
  • cuBLASDx:一个设备端 BLAS 库。早期访问预览将于 2023 年晚些时候提供。
  • CUTLASS(2):一个 CUDA C++ 模板抽象集合,用于在 CUDA 中实现各种级别和规模的高性能矩阵-矩阵乘法 (GEMM) 及相关计算。明确——你可以得到你“正好”需要的东西!你需要“正好”知道你需要什么才能获得最佳性能!
Library Kernel selection heuristics Multi-GPU support Host API Device API
cuBLAS via cuBLASLt - -
cuBLASLt Full - -
cuBLASXt via cuBLAS -
cuBLASDx Partial - -
CUTLASS None -

表:cuBLAS 家族各组件特性概览。
(1) 最新 cuBLAS 博客文章。
(2) S51413 - 在 Hopper Tensor Cores 上开发最优 CUDA 内核。

NVIDIA H100 GPU 上的 cuBLAS 性能亮点 (100 级 NVIDIA GPU 的代际改进)

cuBLAS performance highlights on NVIDIA H100 GPU (Page 14)
图示:NVIDIA H100 GPU 上的 cuBLAS 性能亮点,对比了 V100、A100、H100-PCI 和 H100-SXM 在不同精度(INT8、FP16->FP16、FP16->FP32、BF16->FP32*、TF32、FP64)下的加速比。H100-SXM 在 FP16->FP16 方面显示出最高达 8.9 倍的加速。
*FP->FP16 和 FP32->BF16 的比率差异是由于不同的基准。这些数据类型的性能在标称条件下是相同的。

cuBLASLt 中的 FP8 支持 (在 L4 和 H100 上支持)

  • FP8 支持 是 cuBLASLt 的一项主要新功能,可在 Hopper 和 Ada GPU 上使用。
  • 集成到 Transformer Engine、PyTorch (通过 TE) 和 TensorFlow/XLA 中。
  • 支持多种 A/B/C/D 类型组合:精度与范围的权衡,FP32 中的中间累加。
  • 与 CUDA 图兼容的融合量化和去量化操作。
  • 可选的乘法输入和输出缩放。
  • 用于 epilogue 辅助输入/输出的专用缩放。
  • 可选的输出绝对最大值,用于训练期间的缩放校准。

FP8 support in cuBLASLt (Page 15)
图示:左侧为不同浮点精度(FP32、FP16、BF16、FP8)的范围、指数和尾数表示。右侧为 cuBLASLt 中 FP8 支持的计算流程,包括矩阵乘法、去量化、epilogue 和量化步骤,并展示了如何融合这些操作。

cuBLAS FP8 性能亮点

本页展示了 cuBLAS FP8 在 NVIDIA H100 和 L4 GPU 上的性能亮点,主要关注矩阵乘法部分(matmul)。

cuBLAS FP8 performance highlights on NVIDIA H100 and L4 GPUs (Page 16)
cuBLAS FP8 performance highlights on NVIDIA H100 and L4 GPUs (Page 16)

GPT-3 175B 训练矩阵乘法时间加速
- BF16:
- A100: 1.0 倍基准
- H100-PCI: 1.7 倍
- H100-SXM: 2.5 倍

  • BF16+FP8:
    • H100-PCI: 2.6 倍
    • H100-SXM: 3.9 倍

BERT Large 推理 (预览)

  • FP16:

    • T4: 1.0 倍基准
    • L4: 2.5 倍
  • FP8:

    • L4: 4.2 倍

数据是基于一系列批次大小和平均序列长度计算的。

cuBLAS 的质量改进

本页介绍了 cuBLAS 的质量改进,旨在减少开销并使 API 面向未来。

  • 启发式结果缓存:

    • 减少了为重复出现的问题选择最佳内核的时间。
    • 用户可以根据需要控制缓存容量。
  • cuBLAS 的 64 位整数接口:

    • 支持 64 位范围和步长,便于与 ILP64 CPU 代码互操作。
    • 明确的 64 位函数原型,便于在同一共享对象中混合使用 32 位和 64 位功能。
  • 页面展示了从使用 int 类型到使用 int64_t 类型作为参数的 cublasDtrum_v2 函数原型示例,体现了 64 位接口的改变。


第三章:多GPU多节点(MGMN)库 (Chapter 3: Multi-GPU Multi-Node (MGMN) Libraries)

多 GPU 多节点 (MGMN) 库

本页介绍了多 GPU 多节点 (MGMN) 库,旨在推动大规模科学研究。
它列举了利用这些库的典型应用和工具:

  • VASP: 原子尺度材料建模。
  • GROMACS: 分子动力学模拟。
  • JAX: 高性能可扩展 Python。
  • cuSOLVERMp: 可扩展的分解和特征求解器。
  • cuFFTMp: 2D 和 3D 快速傅里叶变换。

NVIDIA HPC-SDK

本页介绍了 NVIDIA HPC-SDK,它已准备好部署 MGMN 库。

NVIDIA HPC-SDK - Ready to deploy MGMN libraries (Page 20)
NVIDIA HPC-SDK - Ready to deploy MGMN libraries (Page 20)

NVIDIA HPC-SDK 结构:
- 开发 (DEVELOPMENT):
- 编程模型: Standard C++ & Fortran, OpenACC & OpenMP, CUDA。
- 编译器: nvc, nvc++, nvfortran。
- 核心库: libcu++, Thrust, CUB。
- 数学库: cuBLAS, cuTENSOR, cuSPARSE, cuSOLVER, cuFFT, cuRAND。
- 通信库: HPC-X (MPI, UCX, SHMEM, SHARP, HCOLL, NVSHMEM), NCCL。

  • 分析 (ANALYSIS):
    • 分析器: Nsight, Systems, Compute。
    • 调试器: cuda-gdb, Host, Device。

重点突出:

  • cuSOLVERMp:

    • 线性求解器 (LU, Cholesky, QR)。
    • 对称特征值求解器。
    • 支持 UCC。
  • cuFFTMp:

    • 支持 Hopper 架构。
    • 通过 NVSHMEM 改进互操作性。

分布式对称特征值求解器

本页展示了分布式对称特征值求解器的最新性能。

Distributed Symmetric Eigenvalue Solver - State of the art performance (Page 21)
Distributed Symmetric Eigenvalue Solver - State of the art performance (Page 21)

弱扩展性对比 (PSYEEVD vs ELPA):

  • 图表比较了 ELPAcuSOLVERMp 在不同 GPU 数量下的性能。
  • 在 32x32 配置,1024 个 GPU 上,cuSOLVERMp 相较于 ELPA 实现了 1.35 倍的加速。
  • 性能测量基于 NVIDIA A100 DGX Super POD,每个 GPU 输入矩阵为 32x32 实数 fp64。

代码示例:
页面左侧提供了 SCALAPACK 和 cuSOLVERMp 的代码片段,展示了调用分布式特征值求解器的 API。

cuSOLVERMp + VASP

本页展示了 cuSOLVERMp 与 VASP 结合如何加速量子化学计算。

cuSOLVERMp + VASP - Accelerating Quantum Chemistry (Page 22)
cuSOLVERMp + VASP - Accelerating Quantum Chemistry (Page 22)

PZHEEVD 用于 VASP-BSE 用例的运行时:
- 图表比较了 ELPA1cuSOLVERMp 在不同 GPU 核心配置下的运行时。
- 在 40x25 配置,1000 个 GPU 上,cuSOLVERMp 相较于 ELPA1 实现了 1.43 倍的加速。
- 性能测量基于 NVIDIA A100 DGX Super POD,使用双精度 (fp64) 复数输入矩阵。

cuFFTMp + GROMACS

本页展示了 cuFFTMp 与 GROMACS 结合如何加速分子动力学模拟。

cuFFTMp + GROMACS - Accelerating Molecular Dynamics (Page 23)
cuFFTMp + GROMACS - Accelerating Molecular Dynamics (Page 23)

STMV 强扩展性 (1M 原子):
- 图表显示,随着节点数量从 1 增加到 16 (每个节点 4 个 A100 GPU),使用 GPU direct commPME decomp & GPU direct comm 模式相对于 No PME decomp or GPU direct comm 模式,GROMACS 的性能 (ns/天) 显著提升。

BenchPEP-h 强扩展性 (12M 原子):
- 图表显示,随着节点数量从 1 增加到 64 (每个节点 4 个 A100 GPU),GPU direct commPME decomp & GPU direct comm 模式的性能 (ns/天) 均显著优于 No PME decomp or GPU direct comm 模式,在 64 个节点时性能达到最高。
- 性能测量基于 NVIDIA A100 DGX Super POD。

cuFFTMp + JAX

本页展示了 cuFFTMp 与 JAX 结合,如何实现新的 Python 工作流。

cuFFTMp + JAX - Enabling new workflows with Python (Page 24)
cuFFTMp + JAX - Enabling new workflows with Python (Page 24)

3D 2048³ fp32 强扩展性:
- 图表比较了 JAX+cufftJAX+cuFFTMpcuFFTMp 在不同 GPU 数量下的时间 (毫秒)。
- 随着 GPU 数量的增加,cuFFTMp (纯库) 的性能最佳,JAX+cuFFTMp 也表现出优于 JAX+cufft 的良好扩展性,特别是在 16 到 128 个 GPU 范围内。
- 性能测量基于 NVIDIA A100 DGX Super POD。

路线图

本页介绍了 cuSOLVERMpcuFFTMp 的未来性能、功能和更多计划。

Roadmap - Performance, features and more! (Page 25)
Roadmap - Performance, features and more! (Page 25)

cuSOLVERMp:
- 与 HPC SDK 23.1 相比,性能有所提升。
- 即将推出:
- 通用特征求解器 (PSYGVD)。
- 支持 Hopper 架构。

  • PZHEEVD 强扩展性对比 23.1 版本:
    • 图表显示,在相同的 GPU 数量下,新的 cuSOLVERMp 在各种问题规模 (2560, 5120, 10240, 20480) 上,相比 HPC SDK 23.1 版本,实现了显著的加速,最高可达 15 倍。
    • 性能测量基于 NVIDIA A100 DGX Super POD。

cuFFTMp:

  • 多维 FFT。
  • 3D FFT, FP32 DGX H100 vs DGX A100:
    • 图表比较了 DGX H100 和 DGX A100 在不同 GPU 数量和问题规模下的 TFLOPS 性能。
    • H100 在所有测试场景下均显著优于 A100,例如在 8 个 GPU 下,H100 能够提供接近 40 TFLOPS 的性能,而 A100 约为 25 TFLOPS。
    • 性能测量基于 NVIDIA A100 DGX Super POD。

第四章:未来展望与总结 (Chapter 4: Future Outlook & Closing Remarks)

cuBLASDx

本页介绍了 cuBLASDx:内联矩阵乘法。

cuBLASDx - Inlined Matrix Multiplication (Page 27)
cuBLASDx - Inlined Matrix Multiplication (Page 27)

cuBLASDx: 在 MathDx 中

  • 可在 https://developer.nvidia.com/mathdx 获取更多信息。
  • 2023 年早期访问。
  • 支持方阵和非方阵 GEMMs。
  • Tensor Core 加速。
  • 与自定义用户操作融合。
  • 与其他 Dx 库融合。

cuBLASDx 初步性能:
- 图表比较了 cuBLAScuBLASDx 在不同平方尺寸下的 GFLOPS 性能。
- cuBLASDx 在所有尺寸下均显示出优于 cuBLAS 的性能,例如在尺寸 144 时,cuBLASDx 达到 1,168 GFLOPS,而 cuBLAS 为 833 GFLOPS。
- 性能测量基于 A100 @ Max Clocks。

NVIDIA 性能库 (NVPL)

本页介绍了 NVIDIA 性能库 (NVPL):针对 Arm CPU 优化的数学库。

NVIDIA Performance Libraries (NVPL) - Math Libraries Optimized for Arm CPUs (Page 28)
NVIDIA Performance Libraries (NVPL) - Math Libraries Optimized for Arm CPUs (Page 28)
  • 使 HPC 应用程序能够轻松移植到基于 NVIDIA Grace CPU 的平台,以实现行业领先的性能和效率。
  • 标准接口: 例如 BLAS, FFTW。
  • 新接口: 例如 SPARSE, TENSOR。
  • 2023 年下半年早期访问。

支持库: BLAS, LAPACK, PBLAS, SCALAPACK, TENSOR, SPARSE, RNG, FFTW。

nvplBLAS DGEMM 效率:
- 图表显示了 nvplBLAS DGEMM 在不同矩阵大小 (m=n=k) 和线程数 (1, 8, 72 线程) 下的效率,最高可达 90% 以上。

NVIDIA Grace Superchip:
- 144 核 Arm Neoverse V2 内核,通过 NVLink-C2C 连接。
- 900 GB/s 双向带宽。
- LPDDR5X ECC,1TB/s 内存带宽。

总结

本页对 NVIDIA 性能库进行了总结。

Closing Remarks - NVIDIA Performance Libraries (Page 29)
Closing Remarks - NVIDIA Performance Libraries (Page 29)
  • 无缝加速:

    • cuBLASLt 中的 FP8。
    • 许多其他单 GPU 库更新。
  • 可组合性:

    • cuFFTDx。
    • cuBLASDx。
  • NVPL on Arm:

    • 针对 Grace 优化的 NVPL on Arm。
  • 多 GPU & 多节点:

    • cuSOLVERMp。
    • cuFFTMp。

(1) 指即将于 2023 年发布的早期访问版本。