NVIDIA 近日介绍了 CCCL Runtime,这是一组面向 CUDA 基础编程模型的新型现代 C++ API,已从 CUDA 13.2 开始提供。它的目标不是取代开发者熟悉的 CUDA 能力本身,而是以更符合现代 C++ 习惯的方式,重新组织流管理、内存分配、内核启动等核心接口,让 CUDA 开发在复杂项目中更安全、更清晰,也更便于组合使用。
文章指出,传统 CUDA Runtime 最初是对底层 Driver API 的一层便捷封装,而 CCCL Runtime 则是在吸收多年 CUDA 演进经验后,尝试提供另一种更现代的表达方式。它采用了更强的类型系统和更显式的依赖传递方式,例如设备使用 `device_ref`、流使用 `stream` 对象,而不是依赖隐式全局状态。这样做的好处是,开发者无需追踪“当前设备”之类的上下文,也能在局部代码中直接看清资源归属和调用关系。
在内存管理方面,CCCL Runtime 默认更强调异步与流有序语义。通过 `make_buffer` 等接口,开发者可以在指定 stream 和 memory pool 上完成分配、初始化和释放,并让缓冲区生命周期与 GPU 执行顺序更自然地绑定。NVIDIA 认为,这种以内存池和异步分配为默认思路的做法,更符合现代高性能 CUDA 程序的实际需求,也有助于减少同步点和难以排查的未初始化内存问题。
在内核启动层,CCCL Runtime 通过 `cuda::launch` 与更清晰的配置对象,把线程层级、启动参数和 kernel 参数组织得更明确。一个重要变化是,它可以把编译期配置信息通过类型系统传递到设备端,使 kernel 在实现时能更直接利用这些静态信息。例如 block 大小等约束可以在编译期被感知和验证,从而让部分计算更高效,也让调用端和 kernel 实现之间的约定更加可靠。
文章还特别提到,CCCL Runtime 支持以 kernel functor 形式来定义设备端调用逻辑,而不仅仅局限于传统的 `__global__` 函数。这种设计有利于模板参数推导,也更契合现代 C++ 风格。同时,CCCL Runtime 也没有要求开发者一次性重写所有既有代码,而是提供与传统 CUDA Runtime 的兼容辅助能力,方便团队在大型工程中按需逐步迁移。
对 CUDA 开发者而言,CCCL Runtime 的意义不只是“写法更现代”,更在于当设备、流、内存池和多个库之间的关系日益复杂时,一套显式依赖、强类型、默认异步且兼容旧代码的接口设计,可以显著提升可维护性和协作效率。随着 CUDA Toolkit 继续演进,这类基础抽象层的升级,也可能成为未来 GPU 软件工程体验改善的重要方向。
WeChat
Profile