NVIDIA cuda.compute 助力GPU MODE榜单登顶

3 阅读6分钟

使用NVIDIA cuda.compute登顶GPU MODE内核排行榜

该排行榜用于衡量用户自定义GPU内核在解决向量加法、排序和矩阵乘法等一系列标准问题时的速度。

2026年2月18日

作者:Daniel Rodriguez 和 Nader Al Awar

Python因其易用性在机器学习领域占据主导地位,但要编写真正快速的GPU代码,传统上需要转向C++编写自定义内核并维护回Python的绑定。对于大多数Python开发者和研究人员来说,这是一个巨大的入门障碍。

像PyTorch这样的框架通过在CUDA C++中实现内核来解决这个问题——要么手写内核,要么利用像某机构CUDA核心计算库这样的库。手写内核非常耗时,并且需要深入的低级架构专业知识。使用CUB(CCCL中的一个C++库)通常是更好的选择,因为其原语针对每种架构都进行了高度优化并经过了严格测试。但传统上将CUB暴露给Python意味着要构建和维护绑定,并用固定的类型和运算符预实例化C++模板——这限制了Python端的灵活性。

某机构cuda.compute库通过为设备端范围的CUB原语提供高级、Python化的API来克服这些限制。

使用cuda.compute帮助某机构CCCL团队登顶了GPU MODE排行榜,这是一个由拥有超过20,000名成员的在线社区举办的内核竞赛,专注于学习和改进GPU编程。GPU MODE举办内核竞赛旨在为各种任务找到最佳实现,从简单的向量加法到更复杂的块矩阵乘法。

某机构CCCL团队专注于通过高级抽象提供跨GPU架构的并行原语“光速”(SOL)实现。该团队在受测的GPU架构(某机构B200、某机构H100、某机构A100和某机构L4)上获得了最多的第一名。

在这篇博客中,将分享更多关于如何在排行榜上取得如此高排名的细节。

CUDA Python:GPU性能与生产力的结合

CUB为常见的并行操作提供了高度优化的CUDA内核,包括GPU MODE竞赛中的那些操作。这些内核经过架构调整,被广泛认为是接近光速的实现。

cuda.compute库支持直接在Python中定义自定义类型和运算符。在底层,它通过即时(JIT)编译专门的内核并应用链接时优化,以提供与CUDA C++相当、接近光速的性能。用户可以在保持Python环境的同时,获得模板的灵活性和经过调优的CUDA内核的性能。

使用cuda.compute,您可以获得:

  • Python中快速、可组合的CUDA工作流:直接在Python中开发高效、模块化的CUDA应用程序。
  • 自定义数据类型和运算符:使用自定义数据类型和运算符,无需C++绑定。
  • 优化的性能:通过经过验证的CUB原语实现架构感知性能。
  • 快速迭代:通过JIT编译加速开发,同时保持CUDA C++级别的性能。JIT编译通过提供开发者所需的灵活性和快速迭代周期来加速开发流程,同时不牺牲性能。

排行榜结果

使用cuda.compute,我们针对GPU MODE基准测试中的PrefixSum、VectorAdd、Histogram、Sort和Grayscale提交了参赛作品(请查找用户名Nader)。

对于排序等算法,CUB的实现比第二名的提交快两到四倍。这正是CCCL承诺的体现:对于标准原语,提供超越自定义内核的SOL级别算法,而这些原语通常需要花费数月时间来构建。

在未获得第一名的项目中,差距通常在于我们尚未针对该特定GPU制定调优策略。在某些情况下,我们的实现是一个更通用的解决方案,而排名更高的提交则针对特定问题规模进行了专门优化。

在其他情况下,第一名的提交已经在底层使用了CUB或cuda.compute。这突显出这些库已经代表了许多标准GPU算法的性能上限,并且其性能特性已被领先的参赛者充分理解并有意识地依赖。

这不仅仅是为了获胜

排行榜结果只是一个副产品;真正的目标是与社区一起学习,进行透明的基准测试,并展示Python在高性能GPU工作方面的能力。

我们的目的不是劝阻手写CUDA内核。对于自定义内核——如新颖的算法、紧密融合或特殊的内存访问模式——有很多合理的用例,但对于标准原语(排序、扫描、规约、直方图等),首选应该是经过验证的高性能实现。通过cuda.compute,这些经过调优的CUB原语现在可以直接从原生Python访问,允许用户构建高质量、生产级的、GPU加速的Python库。

这对于任何正在构建下一个CuPy、RAPIDS组件或自定义Python GPU加速库的人来说都是个好消息:更快的迭代、更少的胶水层以及生产级性能,同时保持纯Python环境。

cuda.compute的实际应用

任何人在学习GPU编程时编写的第一个例子之一就是向量加法。使用cuda.compute,可以通过调用一个设备端原语在纯Python中解决这个问题。

import cuda.compute
from cuda.compute import OpKind

# 构建时张量(用于特化可调用对象)
build_A = torch.empty(2, 2, dtype=torch.float16, device="cuda")
build_B = torch.empty(2, 2, dtype=torch.float16, device="cuda")
build_out = torch.empty(2, 2, dtype=torch.float16, device="cuda")

# JIT编译变换内核
transform = cuda.compute.make_binary_transform(build_A, build_B, build_out, OpKind.PLUS)

# 提交到GPU MODE竞赛需要定义custom_kernel
def custom_kernel(data):
    # 对输入数据调用变换操作
    A, B, out = data
    transform(A, B, out, A.numel())
    return out

您可以在GPU MODE排行榜上找到更多cuda.compute的示例。其模式是一致的:通过调用由CCCL为每一代GPU自动优化的设备端构建模块,以简洁的代码实现光速性能。

VectorAdd类别中的其他顶级参赛作品需要深入到C++和内联PTX,导致代码高度依赖特定架构。

立即尝试cuda.compute

如果您正在构建Python GPU软件、自定义管道、库组件或性能敏感型代码,cuda.compute为您提供了直接在Python中使用CCCL CUB原语的选择,并利用为架构感知光速性能而设计的构建模块。

要立即尝试cuda.compute,您可以通过pip或conda安装:

pip install cuda-cccl[cu13] (或 [cu12])

conda install -c conda-forge cccl-python cuda-version=12 (或 13)

我们正在与社区共同构建这个库——您的反馈和基准测试将塑造我们的路线图,因此请随时在Github或GPU MODE discord上与我们联系。FINISHED