NVIDIA CCCL 3.1 为GPU运算添加浮点确定性控制
Caroline Bishop 2026年3月5日 17:46
NVIDIA的CCCL 3.1为并行归约引入三个确定性级别,让开发者在GPU计算中权衡性能与可重现性。
NVIDIA在CUDA核心计算库(CCCL) 3.1中推出了确定性控制,解决了并行GPU运算中一个长期存在的难题:在多次运行和不同硬件上从浮点运算中获得相同结果。
此更新通过CUB的新单阶段API引入三个可配置的确定性级别,让开发者明确控制多年来困扰GPU应用程序的可重现性与性能之间的权衡。
为什么浮点确定性很重要
问题在于:浮点加法并非严格符合结合律。由于有限精度的舍入,(a + b) + c并不总是等于a + (b + c)。当并行线程以不可预测的顺序组合值时,每次运行都会得到略有不同的结果。对于许多应用程序——金融建模、科学模拟、区块链计算、机器学习训练——这种不一致性会造成实际问题。
新的API让开发者通过三种模式精确指定他们需要的可重现性程度:
非保证确定性优先考虑原始速度。它使用原子操作,按线程运行的任意顺序执行,在单个内核启动中完成归约。结果在不同运行之间可能略有差异,但对于近似答案足够的应用程序,性能提升是显著的——尤其是在内核启动开销占主导地位的较小输入数组上。
运行到运行确定性(默认设置)在使用相同输入、内核配置和GPU时保证相同的输出。NVIDIA通过将归约构建为固定的层次树而非依赖原子操作来实现这一点。元素首先在线程内组合,然后通过洗牌指令跨越warp,接着使用共享内存跨越块,最后由第二个内核聚合最终结果。
GPU到GPU确定性提供最严格的可重现性,确保在不同的NVIDIA GPU上获得相同结果。该实现使用可重现浮点累加器(RFA),将输入值分组到固定的指数范围内——默认为三个区间——以应对在添加不同量级数字时出现的非结合律问题。
性能权衡
NVIDIA在H200 GPU上的基准测试量化了可重现性的成本。对于大问题规模,GPU到GPU确定性相比宽松模式将执行时间增加20%至30%。运行到运行确定性介于两个极端之间。
三区间RFA配置提供了NVIDIA所称的"最优默认设置",平衡了准确性和速度。更多区间可提高数值精度,但会增加中间求和,从而减慢执行速度。
实现细节
开发者通过cuda::execution::require()访问新控制,它构建一个传递给归约函数的执行环境对象。语法很简单——根据需求将确定性设置为not_guaranteed、run_to_run或gpu_to_gpu。
该功能仅适用于CUB的单阶段API;较旧的两阶段API不接受执行环境。
更广泛的影响
跨平台浮点可重现性一直是高性能计算和区块链应用中的已知挑战,不同的编译器、优化标志和硬件架构可能从数学上相同的操作中产生不同的结果。NVIDIA明确将确定性作为可配置参数而非隐藏实现细节的方法代表了一个务实的解决方案。
该公司计划将确定性控制扩展到归约之外的其他并行原语。开发者可以通过NVIDIA的GitHub存储库跟踪进展并请求特定算法,那里有一个公开问题在跟踪扩展的确定性路线图。
图片来源:Shutterstock- nvidia
- gpu运算
- cccl
- 浮点确定性
- cuda


