Recent Developments in NVIDIA Math Libraries
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 性能对比。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。
图示:一个稀疏矩阵的可视化,展示了其大部分元素为零。
cuSPARSE SpGEMM (稀疏乘稀疏矩阵乘法) 具有更低的内存要求
CUDA Toolkit 12.0 发布的新功能:
* 以前的算法存在限制,阻碍了在某些情况下的采用(旧算法已移除:不支持转置,性能低下)。
* ALG1 随 CTK 11 引入,但有内存上限要求。
* 新增两种算法以降低内存要求:
* ALG2:严格内存边界。
* ALG3:可调内存边界。
* 适用于所有 GPU。
- 同时改进了性能和内存使用。
图示:左侧为内存缩减与传统实现的对比,右侧为性能提升与传统实现的对比。图下方为稀疏矩阵乘法的可视化示例。
cuSPARSE BSR - 用于稀疏 Transformer 的分块压缩稀疏行 (CSR) SDDMM
-
SDDMM (又称受限 GEMM):
- 机器学习算法中必需。
- 目前支持 CSR 格式。
- 用户对 BSR 格式兴趣浓厚。
-
CSR 格式在 CUDA 12.0 中进行了优化。
- CUDA 12.1 中支持混合精度 SDDMM。
- BSR 格式将在未来版本中添加。
图示:左侧为 SDDMM BSR 与 CSR 格式性能对比图,显示 BSR 随块大小增加而性能优于 CSR。右侧为稠密稠密矩阵乘法示例图,用于可视化稀疏与稠密矩阵。
cuSOLVER (稠密线性代数)
CUDA 12.1 更新:
* 稠密线性代数核心函数。
* 专注于 H100 优化。
* Cholesky 和 SYEVD 的新实现显著提高了性能。
即将发布:
* QR 分解的进一步优化。
图示: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 硬件解码吞吐量对比。对于 4K UHD 图像,H100 (80GB) 相较于 A100 (40GB) 提供了 1.6X 的吞吐量提升。
第二章:cuBLAS、Hopper和Ada (Chapter 2: cuBLAS, Hopper and Ada)
Tensor Core 性能跨代改进 (从 Volta 到 Hopper 的 100 级 GPU)
图示:从第一代 (GV100) 到第四代 (GH100) Tensor Core 性能的逐代提升,针对 FP64、TF32、FP16/BF16、INT8 和 FP8 等不同精度。可以看到,FP8 在 GH100 上达到了 2141 TFLOPS 的峰值性能。
Tensor Core 可编程性软件栈 (从低抽象级别到高抽象级别)
图示: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 的代际改进)
图示: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 辅助输入/输出的专用缩放。
- 可选的输出绝对最大值,用于训练期间的缩放校准。
图示:左侧为不同浮点精度(FP32、FP16、BF16、FP8)的范围、指数和尾数表示。右侧为 cuBLASLt 中 FP8 支持的计算流程,包括矩阵乘法、去量化、epilogue 和量化步骤,并展示了如何融合这些操作。
cuBLAS FP8 性能亮点
本页展示了 cuBLAS FP8 在 NVIDIA H100 和 L4 GPU 上的性能亮点,主要关注矩阵乘法部分(matmul)。
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 结构:
- 开发 (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 改进互操作性。
分布式对称特征值求解器
本页展示了分布式对称特征值求解器的最新性能。
弱扩展性对比 (PSYEEVD vs ELPA):
- 图表比较了
ELPA和cuSOLVERMp在不同 GPU 数量下的性能。 - 在 32x32 配置,1024 个 GPU 上,
cuSOLVERMp相较于ELPA实现了 1.35 倍的加速。 - 性能测量基于 NVIDIA A100 DGX Super POD,每个 GPU 输入矩阵为 32x32 实数 fp64。
代码示例:
页面左侧提供了 SCALAPACK 和 cuSOLVERMp 的代码片段,展示了调用分布式特征值求解器的 API。
cuSOLVERMp + VASP
本页展示了 cuSOLVERMp 与 VASP 结合如何加速量子化学计算。
PZHEEVD 用于 VASP-BSE 用例的运行时:
- 图表比较了 ELPA1 和 cuSOLVERMp 在不同 GPU 核心配置下的运行时。
- 在 40x25 配置,1000 个 GPU 上,cuSOLVERMp 相较于 ELPA1 实现了 1.43 倍的加速。
- 性能测量基于 NVIDIA A100 DGX Super POD,使用双精度 (fp64) 复数输入矩阵。
cuFFTMp + GROMACS
本页展示了 cuFFTMp 与 GROMACS 结合如何加速分子动力学模拟。
STMV 强扩展性 (1M 原子):
- 图表显示,随着节点数量从 1 增加到 16 (每个节点 4 个 A100 GPU),使用 GPU direct comm 的 PME decomp & GPU direct comm 模式相对于 No PME decomp or GPU direct comm 模式,GROMACS 的性能 (ns/天) 显著提升。
BenchPEP-h 强扩展性 (12M 原子):
- 图表显示,随着节点数量从 1 增加到 64 (每个节点 4 个 A100 GPU),GPU direct comm 和 PME decomp & GPU direct comm 模式的性能 (ns/天) 均显著优于 No PME decomp or GPU direct comm 模式,在 64 个节点时性能达到最高。
- 性能测量基于 NVIDIA A100 DGX Super POD。
cuFFTMp + JAX
本页展示了 cuFFTMp 与 JAX 结合,如何实现新的 Python 工作流。
3D 2048³ fp32 强扩展性:
- 图表比较了 JAX+cufft、JAX+cuFFTMp 和 cuFFTMp 在不同 GPU 数量下的时间 (毫秒)。
- 随着 GPU 数量的增加,cuFFTMp (纯库) 的性能最佳,JAX+cuFFTMp 也表现出优于 JAX+cufft 的良好扩展性,特别是在 16 到 128 个 GPU 范围内。
- 性能测量基于 NVIDIA A100 DGX Super POD。
路线图
本页介绍了 cuSOLVERMp 和 cuFFTMp 的未来性能、功能和更多计划。
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。
- 图表显示,在相同的 GPU 数量下,新的
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: 在 MathDx 中
- 可在
https://developer.nvidia.com/mathdx获取更多信息。 - 2023 年早期访问。
- 支持方阵和非方阵 GEMMs。
- Tensor Core 加速。
- 与自定义用户操作融合。
- 与其他 Dx 库融合。
cuBLASDx 初步性能:
- 图表比较了 cuBLAS 和 cuBLASDx 在不同平方尺寸下的 GFLOPS 性能。
- cuBLASDx 在所有尺寸下均显示出优于 cuBLAS 的性能,例如在尺寸 144 时,cuBLASDx 达到 1,168 GFLOPS,而 cuBLAS 为 833 GFLOPS。
- 性能测量基于 A100 @ Max Clocks。
NVIDIA 性能库 (NVPL)
本页介绍了 NVIDIA 性能库 (NVPL):针对 Arm CPU 优化的数学库。
- 使 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 性能库进行了总结。
-
无缝加速:
- cuBLASLt 中的 FP8。
- 许多其他单 GPU 库更新。
-
可组合性:
- cuFFTDx。
- cuBLASDx。
-
NVPL on Arm:
- 针对 Grace 优化的 NVPL on Arm。
-
多 GPU & 多节点:
- cuSOLVERMp。
- cuFFTMp。
(1) 指即将于 2023 年发布的早期访问版本。