NVIDIA CUDA-X 数学库提供基础的数值计算模块,帮助开发者在人工智能和科学计算等多个高性能计算领域中部署加速应用程序。
cuBLAS 是一个 CUDA-X 数学库,包含经过高度优化的矩阵与向量运算基本线性代数子程序,专为在 NVIDIA 硬件上实现卓越性能而调优。该库提供熟悉且易于使用的 API,便于开发者高效利用硬件能力。
NVIDIA CUDA 工具包 13.0 Update 2 中的 cuBLAS 更新引入了新的 API 和实现,显著提升了双精度 (FP64) 矩阵乘法 (matmuls) 的性能。这一性能提升得益于在 NVIDIA GB200 NVL72 和 NVIDIA RTX PRO 6000 Blackwell Server Edition 等 GPU 架构的 Tensor Core 上实现的浮点 (FP) 仿真。有关 FP32 和 FP64 仿真的 GPU 兼容性详情,请参考 cuBLAS 文档。
这种新的模拟 FP64 矩阵实现是对近期发布的单精度 (FP32) 矩阵仿真的补充。开发者可以调整 FP64 矩阵乘法所需的精度,而 cuBLAS 默认能够保持与原生硬件相当或更高的准确性。系统会通过 FP 仿真(以保留准确性)或原生硬件,自动评估操作的执行效果,并选择更优的实现方式。
本文将介绍 CUDA 工具包 13.0 Update 2 中 cuBLAS 的各项功能,内容包括:
- 通过熟悉且直观的开发者 API,无缝访问 Tensor Core 性能
- 利用 Blackwell BF16 Tensor Core 实现 FP32 仿真,在保持精度的同时,性能优于原生 FP32 矩阵乘法
- 借助 Blackwell INT8 Tensor Core 实现 FP64 仿真,可通过回退至本地执行,实现安全且自动的性能提升
- 通过 FP 仿真技术,提升多种软件领域与硬件平台的运行效率
这是 FP64 矩阵仿真的初始版本,后续发布的版本将包含更多改进。
浮点仿真的实际应用
cuBLAS 库针对 Matmul 仿真提供了两种版本:用于 FP32 的 BF16x9 算法和用于 FP64 的 Ozaki Schema。BF16x9 算法采用静态分解策略,可借助 Blackwell 架构的 BF16 Tensor Core 高效且安全地模拟所有正常的和次正常的 FP32 数值。然而,使用 Ozaki Schema 对 FP64 进行仿真时,一个常见挑战在于问题中的数值需要采用不同的表示方式。
换言之,单一配置无法高效且准确地模拟所有 FP64 数值。具体而言,由于 Ozaki 方案在对操作数进行指数对齐后采用固定点表示,所需的“尾数位”数量取决于输入数据,并且必须大于或等于 IEEE 754 FP64 格式中的 53 位,才能实现相当或更高的精度。
为解决此问题,cuBLAS 库引入了一个自动动态精度 (ADP) 框架,可无缝分析输入数据,判断是否能够安全地采用模拟计算以提升性能。若满足条件,系统将自动配置仿真参数,使其精度达到或超过原生 FP64 矩阵乘法的水平。
应用结果:ecTrans
当天气预报或气候建模应用对地球大气、海洋及其他系统中的复杂物理过程进行模拟时,需要借助网格来离散计算区域并执行相应运算。开源的 ecTrans 库利用线性代数运算,实现基于网格的转换,这些转换被用于 集成预报系统(IFS) 中的天气预报。
如图 1 所示,采用 NVIDIA Blackwell Tensor Core 进行 FP32 仿真,可将矩阵乘法计算速度提升 2.4 倍,从而显著增强 ecTrans 的性能。
除了提升性能外,FP 仿真实现的数值精度均不低于使用原生 FP32 时的结果。为验证这一点,在实际模拟中,对真实数据字段进行了连续 1000 次的频谱正反向变换。
在此过程中,我们采用 BF16x9 FP 仿真来追踪速度(U 和 V)与温度(T)的误差分布,并将其与使用标准 FP32 精度(欧洲中期天气预报中心用于日常预报的运行精度)所得结果进行对比。
图 2 展示了 FP32、TF32 和 BF16x9 浮点仿真中绝对误差的概率密度函数。这些图形反映了在随机采样速度和温度条件下出现特定误差的可能性。曲线越接近以 0 为中心的脉冲函数,表明底层实现的精度越高。
由于误差较大,速度图中未显示 TF32 的结果。在放大后,速度和温度的显著误差将清晰可见,反映出天气建模对精度的高度敏感性。然而,BF16x9 FP 仿真不仅精度处于可接受范围内,甚至在某些方面达到或超过了原生 FP32 的精度,同时在性能上优于 FP32。
应用结果:BerkeleyGW
研究人员利用 BerkeleyGW 代码研究电子在改变能量状态时对材料物理特性的影响。该代码具有大规模并行能力,已在主流超级计算机上得到广泛应用。相比仅使用 CPU 的实现方式,结合 GPU 使用 BerkeleyGW 可将性能提升 86 倍,且还能通过 FP 仿真进一步加速。
在 BerkeleyGW Epsilon 模块的 CHISUM 例程中,通过采用模拟复数 FP64 矩阵运算(ZGEMM),可在准确性和性能之间实现良好的平衡。默认情况下,cuBLAS 利用其 ADP 框架自动选择参数,确保计算结果与原生 FP64 精度下的结果保持一致。该过程由系统自动完成,用户无需干预,即可获得如图 3 所示的性能提升。
但是,cuBLAS API 允许用户通过减少 FP64 模拟运算中的位数来进一步微调性能。BerkeleyGW 对两种情况进行了测试。与参考值相比,采用默认 ADP 设置以及手动设置为 55 位尾数位的浮点模拟,均能在广泛接受的误差容限(10E-10)范围内实现良好的精度,其中使用 55 位尾数位的方案可带来更高的加速比。
性能差异的原因在于 ADP 判定需要超过 55 个尾数位;然而,手动将尾数位精度设置为 55 并不会影响这些测试中的应用级精度。若需提升性能,cuBLAS API 允许您调整仿真过程中使用的精度,并验证调整后的精度是否满足应用需求。
应用结果:Quantum Espresso
开源 Quantum Espresso (QE) 应用集合被广泛应用于全球范围内的基于密度泛函理论 (DFT) 的材料科学计算。这些应用的核心针对横向扩展的分布式计算以及节点内的细粒度并行进行了高度优化。
量化宽松依赖于高效的双精度 GEMM,在基本迭代周期的每一步中通过应用算子来确定原子和材料的基态能量。由于这种双精度 GEMM 的使用方式与许多其他基于 DFT 的应用相似,因此通过 FP 模拟实现的 Quantum Espresso 性能提升,预计也将适用于许多其他 DFT 应用。
对于图 4 所示的结果,我们采用 Ausurf 基准测试数据集 来评估数值结果的准确性,同时测试在 RTX PRO Blackwell 服务器版 GPU 的 cuBLAS 库中启用 FP 模拟时 QE 的性能表现。
图 4 显示,使用 ADP 的 FP 仿真可实现 1.5 倍的端到端加速,进一步优化至 39 个尾数位后,端到端加速比接近 3 倍。对于所有配置,在采用具有 39 个尾数位的模拟 FP64 之前,精度结果均无明显差异。该配置可使应用程序输出值达到最多 12 个(基数为 10 的)有效数字。
ADP 与 55 个尾数位之间的性能差异源于 ADP 框架确定了实现 IEEE 754 FP64 级精度所需的有效尾数位数超过 55 位;然而在实际应用中,使用较少的尾数位并不会影响所测得的应用级精度。
基准测试结果:热力图
除了通过 FP 模拟提升端到端应用程序性能之外,在分析模拟对应用程序性能的影响时,明确模拟的适用范围也至关重要。图 5-7 中的三个热图展示了在 GB200 NVL72 GPU(支持 FP32 和 FP64)以及 RTX PRO Blackwell Server Edition(支持 FP64)上,针对不同矩阵形状的模拟矩阵所实现的性能提升情况。
这三个热图均展示了在中等和大型问题规模上的显著性能提升。此外,在图 6 和图 7 中,ADP 框架使用了 55 个尾数位,可以看出,当问题规模过小而无法从模拟中获益时,由于 cuBLAS 启发式算法会选择原生 FP64 算法,因此尝试模拟不会带来性能损失。我们预计在未来的 cuBLAS 版本中,性能和适用性将进一步提升。
FP 仿真的下一步发展方向是什么
尽管 FP 仿真已在加速实际应用中取得进展,NVIDIA 仍在多个关键领域持续推进并优化该技术。CUDA-X 数学库中的其他核心 BLAS 3 级和 LAPACK 例程将通过 FP32 和 FP64 仿真实现加速。团队还将持续改进 FP64 仿真,包括优化 ADP 框架、GEMM 内核、降低工作空间内存需求,以及进一步完善 Ozaki-II Schema。
开始使用 CUDA 工具包 13.0 Update 2 中的浮点模拟功能
使用本文讨论的策略,您可以在采用矩阵乘法的算法中充分发挥 Tensor Core 的性能优势,同时无需修改代码或进行繁琐的性能分析。cuBLAS 将自动选择合适的执行策略,在确保所需精度的前提下提供高效性能。
要开始使用 FP 仿真并探索其在您自身应用中的优势,请下载 CUDA 工具包 13.0 Update 2。
如需了解详情,请参考以下相关资源:
- 请参阅 cuBLAS 官方文档中的浮点仿真相关内容
- 观看 关于利用 Tensor Core 加速混合精度计算与浮点仿真实现高能效超级计算的视频
- 浏览 “Precision Redefined:解锁并充分发挥现代 GPU 在科学计算中的能力”演示文稿中的幻灯片
- 查看 GitHub 上 CUDA 库示例中的仿真实现