CUDA 项目涵盖库、SDK、编译器、主机运行时、工具以及预打包的软件和算法。英伟达已经将部分组件添加至整个 Python 式 CUDA 技术栈内。
英伟达的关注重点,是在无需脱离 Python 环境的前提下实现 GPU 加速。Jones 解释道,CUDA Python 不能只是内核产品,而需要在整个技术栈内匹配完整且流畅的执行流程。
Jones 强调,“除了编写内核并将其纳入 PyTorch 之外,我们还必须能够调用 Python 库及所有其他组件。”
实际上,由于项目是围绕即时(JIT)编译构建而成,因此不存在编译器层,从而大大减少了技术栈 GPU 树中的依赖项数量。
Jones 表示,“保持所有各层之间的互操作性,将极大提高生产力并实现对 Python 的端到端使用。”
最初,英伟达先是构建了基础 Python 绑定(其中包括运行时编译器)与 cuPyNumeric(Python 中使用最就我 计算库 NumPy 的替代方案)等 Python 库。cuPyNumeric 仅变更了一条导入指令,即可将 NumPy 代码从 CPU 上运行转变为 GPU 上运行。
去年,英伟达构建了 CUDA Core,Jones 称其是“对 CUDA 运行时的 Python 式重构,确保其自然而然实现 Python 原生化。”
CUDA Core 提供 Python 执行流程,且高度依赖于 JIT 即时编译。
Jones 强调,“我们要做的不是放弃命令行编译器之类的要素,而是将一切融入到流程当中”,并补充称这大大减少了技术栈 GPU 树中的依赖项数量。
英伟达还开发了一套名为 NVMath Python 的库,其具备用于主机端和设备端库调用的统一接口。Jones 指出,这种将库调用加以融合的设计带来了巨大的性能提升。
该公司还构建了能够直接通过 Python 代码访问加速 C++ 库的多个新库。

Jones 解释道,“由于新成果建立在我们多年积累的底层基础架构之上……因此我们并不需要用 Python 做重新实现。只需要确保将其链接到经过微调的 C++ 底层代码,因此产生的性能影响几乎可以忽略不计。”
英伟达还添加了用于分析器和代码分析器的工具。
Python 大大降低了编码难度,确保程序员不必分心于底层硬件。为了更好地达成这个目标,英伟达决定添加一个在 GPU 上执行,且与更高级别抽象相一致的编码层。这套编程模型就是 CuTile,最初为 Python 式 CUDA 开发,随后又针对 C++ CUDA 提供了扩展。

CuTile“从本质上来讲更契合 Python 特性”,因为如今 Python 程序员更多关注数组而非线程(关注线程更接近 C++ 的特性)。开发人员不可能像变魔术一样直接把 Python 代码导出到 GPU 上,来直接获得加速性能。CUDA 需要先将问题拆分成成千上万个较小的块,然后在 GPU 上分别做处理。这些块被拆分成更小的 tiles,由其运行起成千上万个线程以实现单一元素处理。各线程组合起来,就形成了一项操作。
这种并行处理线程级单一元素的能力,赋予了 GPU 强大的计算性能。
但英伟达认为 GPU 执行不该始终局限于线程级别。相反,处理也可以在 tiles 层级上实现中途完成,这也是 CuTile 编程模型的意义所在。
CuTile 能够高效将数组映射至相对不太细粒度的 GPU 上,使得代码更易于理解和调试。Jones 表示,“重要的是,在根本上继续保持相同的性能。”
Tiles 中的数据可以构造为向量、张量或者数组,而编译器则能够更好地将整个数组操作从线程块映射至 GPU。
Jones 解释道,“编译器通常比程序员们做得更好,因为它能深刻理解开发者在做什么……而且熟悉 GPU 的运行细节。”
不同于 C++,Python 在设计上并不强调细粒度。
Jones 在总结时再次称赞了 OpenAI 的项目,“目前有很多相关成果,OpenAI Triton 就是个典型用例。我认为这些项目都特别契合 Python 程序。“