CUDA 13.2 发布了一项重大更新:NVIDIA CUDA Tile 现在支持计算能力为 8.X(NVIDIA Ampere 和 NVIDIA Ada)、10.X、11.X 和 12.X(NVIDIA Blackwell)架构的设备。在即将发布的 CUDA 工具包中,从 Ampere 开始的所有 GPU 架构都将得到全面支持。如果你使用的是 Ampere、Ada 或 Blackwell GPU 架构,请查阅 cuTile Python 快速入门指南,开始使用 CUDA Tile。
本文将探讨 CUDA 13.2 版本,该版本通过增加各种 Python 新功能(包括 CUDA Python 性能分析和 Numba 内核调试)来提高开发人员的工作效率。数学库扩展了对高性能仿真库的支持,CUDA 核心计算库(CCCL)也在性能和功能上持续改进,为 C++ 开发人员提供了高性能、现代化的 GPU 编程接口。
cuTile Python
cuTile Python 是 CUDA Tile 编程模型的 Python DSL 实现,本次发布带来了多项功能增强。包括对以下功能的语言支持增强:
- 递归函数
- 带捕获的闭包(嵌套函数、lambda 函数)
- 自定义归约和扫描函数
- 允许带类型注解的赋值
- 增强对
Array.slice的支持,以创建子数组的视图
我们还提供了一个简单的安装路径。以下 pip install 命令将安装 cuTile Python 并拉取所有必需的依赖项,无需单独进行系统级的 CUDA 工具包安装。
pip install cuda-tile[tileiras]
核心增强
CUDA 13.2 的核心增强内容如下。
带属性的异步内存拷贝
CUDA 的先前版本(12.8)引入了批处理内存拷贝 API。这些 API 允许你指定一批内存拷贝,并通过单个函数调用执行。你还可以指定属性来更好地控制和优化内存传输。
这些 API 提供了对内存传输的更多控制。但是,如果你只需要一次传输,并且也想使用属性功能,则需要调用批处理 API,然后将批处理大小设置为 1。这有点麻烦。
为了简化此用例,新增了两个 API 函数:cudaMemcpyWithAttributesAsync 和 cudaMemcpy3DWithAttributesAsync。这些函数允许你在内存调用中使用属性,而无需使用更复杂的批处理接口。
为了方便编程,如果你已经在使用 cudaMemcpyAsync 进行传输,并想使用属性,可以继续使用 cudaMemcpyAsync。它已重载,具有与 cudaMemcpyWithAttributesAsync 相同的参数列表。
Windows 中按上下文的本地内存占用减少
GPU 上的本地内存(LMEM)按线程分配,用于寄存器溢出、栈变量等。从 CUDA 13.2 和 CUDA 驱动程序 R595 开始,在 Windows 上以 WDDM 驱动程序模式运行时,LMEM 的使用量已显著减少。此更改的影响将主要在内存受限的 vGPU 环境中体现。
查询内存池属性
CUDA 提供了使用内存池进行高效内存管理的能力。CUDA 13.2 引入了一个 API,用于从内存池句柄查询内存池的属性。这些属性通过调用带有适当标志的 cudaMemPoolGetAttribute 获得。
此新功能的一个用例是创建与已创建内存池相同类型的内存池。例如,在使用 CUDA Graphs 时,API cudaGraphAddMemAllocNode 接受池属性作为参数。你可以使用当前内存池的属性来创建具有相同属性的新池。
Windows 计算驱动程序默认使用 MCDM 而非 TCC
在 Microsoft Windows 系统上,从 CUDA 驱动程序版本 R595 开始,在兼容的系统上,以前默认以 TCC 模式启动的 GPU 现在将默认以 MCDM 模式启动。此更改应解决某些系统上的兼容性问题,在这些系统中,用户由于与操作系统/系统功能存在某些不兼容性,在启动时其 TCC GPU 上会出现黄色感叹号。对于依赖 TCC 的用户,目前仍然可用,并且可以通过 nvidia-smi -dm 1 -g <GPU ID> 启用。
未来,我们打算逐步永久过渡到 MCDM,因为它带来了以前仅在 WDDM 模式下的 GPU 才具有的功能:
- WSL2:MCDM GPU 将在 WSL2 中显示,并能在 WSL 中运行 CUDA
- 容器:支持原生(和 WSL)容器
- 高级内存管理 API:现在支持
cuMemCreate、cudaMallocAsync及其所有相关 API - RDMA:通过 CUDA 工具包 13.1 中发布的 WDDM RDMA 相同的接口
- 内存超额订阅和修剪通知
由于 MCDM 中存在一些额外开销,我们目前意识到提交延迟略高于 TCC,我们正在积极努力使其(在 WDDM 和 MCDM 上)与 TCC 和 Linux 原生保持一致,以确保 WDDM/MCDM 成为适用于 Windows 上所有 GPU 的合适且面向未来的驱动程序模型。
CUDA_DISABLE_PERF_BOOST
CUDA 工具包 13.2 和 CUDA 驱动程序版本 580 及更高版本添加了一个新的环境变量 CUDA_DISABLE_PERF_BOOST。此变量允许禁用在运行 CUDA 应用程序时将 GPU 提升到更高电源状态的默认行为。将此环境变量设置为 1 将禁用性能提升。禁用性能提升可能会在使用 NVENC/NVDEC 等功能时节省电量。
CUDA Graphs 多态函数以获取图节点参数
CUDA Graphs 使你能够将 GPU 操作(如内核启动和内存拷贝)的工作流创建为单个单元,而不是一系列单独的命令。CUDA 13.2 添加了一个新的多态 API 函数 cudaGraphNodeGetParams,允许你获取图节点的参数。这是一个与现有多态函数(如 cudaGraphNodeSetParams、cudaGraphAddNode 和 cudaGraphExecNodeSetParams)配套的函数。
编译器
CUDA 13.2 带来了新的编译器更新,包括对 Visual Studio 2026 等新主机编译器的支持、对 gcc 的 ARM C 语言扩展支持,以及针对 Tegra 和桌面 GPU 的统一工具包,从而减少了容器和库的开销。
嵌入式设备
此前,在 CUDA 13.0(和 NVIDIA JetPack 7.0)中,引入了统一的 Arm 版 CUDA,通过统一跨服务器级和嵌入式设备(如 NVIDIA Jetson Thor)的 CUDA 工具包,简化了 Arm 平台的开发。
从 CUDA 13.2(以及即将发布的 JetPack 7.2——敬请期待)开始,相同的 Arm SBSA CUDA 工具包可用于所有 Arm 目标。此版本还支持在相同的 CUDA SBSA 工具包上运行 NVIDIA Jetson Orin 设备。对于开发人员而言,这意味着减少了 CI 流水线中的重复工作、简化了容器管理,并消除了因使用不同 SDK 而导致的细微错误和不一致问题。
CUDA 13.2 和 JetPack 7.2 引入了 NVIDIA 多实例 GPU(MIG)支持,允许将与 Jetson Thor 集成的 GPU 划分为两个完全隔离的实例,每个实例都有专用的内存、缓存和计算资源。此功能对于混合关键性应用(如人形机器人)尤其有价值。在这些情况下,开发人员可以将安全关键型工作负载(例如,电机控制和安全系统)与非关键处理任务隔离开来。
如果没有 MIG,在同一 GPU 上运行的安全关键型和非关键型工作负载(例如,低延迟电机控制与较重的感知或语言模型)会竞争共享资源。一个具有高内存带宽需求的突发任务可能会占用安全关键型内核的容量,导致控制系统和安全系统出现抖动并错过延迟截止时间。
借助 MIG,关键型和非关键型工作负载在不同的 GPU 实例上运行,每个实例都有专用的计算、内存和带宽。这种隔离为控制和关键任务提供了可预测的延迟和服务质量,同时通过在另一个实例上并发运行更重的感知或语言工作负载,使 GPU 保持高利用率。
数学库
CUDA 13.2 为数学库(包括 NVIDIA cuBLAS 和 NVIDIA cuSOLVER)引入了改进。
NVIDIA cuBLAS
一个新的实验性 API(Grouped GEMM)现在支持 NVIDIA Blackwell GPU 的 MXFP8。之前的支持(在 CUDA 13.1 中)包括 FP8 和 BF16/FP16 Blackwell GPU 支持。针对上述数据类型的 Grouped GEMM 与 CUDA Graphs 支持一起,提供了一种无需主机同步的实现,并在混合专家(MoE)用例中,与多流 GEMM 实现相比,速度提升了高达 4 倍。
NVIDIA cuSOLVER
引入了用于 FP64 仿真计算的 cuSOLVERD API。这使得在 INT8 与 FP64 吞吐量比率较高的平台上能够获得显著的性能提升,特别是在计算密集型工作负载中。仿真的优势在 QR、LU 和 Cholesky 分解的关键 API 中最为明显。要了解 NVIDIA 在仿真技术方面的最新进展,请参阅《在 cuBLAS 中利用浮点仿真解锁 Tensor Core 性能》。
图 1 显示了在 NVIDIA B200 系统上,FP64 仿真的 GDEQRF、DGETRF 和 DPOTRF 的结果。性能优势随着矩阵大小而增加,对于 QR 操作(这三种操作中计算量最大的),当矩阵大小接近 80K 时,速度提升可达 2 倍。
图 1. NVIDIA B200 系统上的 FP64 仿真 GDEQRF、DGETRF 和 DPOTRF
开发者工具
本节详细介绍此版本中新增的开发者工具。
NVIDIA Nsight Python
NVIDIA Nsight Python 是一个新的内核性能分析接口,将 NVIDIA 性能分析工具的强大功能直接带给 Python 开发人员。通过此版本,你可以直接在 Python 中,跨多种配置,无缝分析通过 Python 框架启动的 CUDA 内核。
用户只需使用几个装饰器,即可自动配置、分析和绘制内核性能比较图。Nsight Python 还提供对常用 Python 数据结构中性能数据的访问,以进行高级分析。从 PyPI 下载 Nsight Python。你也可以为 NVIDIA/nsight-python GitHub 仓库贡献代码,并访问 NVIDIA 开发者论坛提出任何问题或反馈。
@nsight.analyze.plot("02_paramater_sweep.png")
@nsight.analyze.kernel(configs=sizes, runs=10)
def benchmark_matmul_sizes(n: int) -> None:
"""
对不同大小的矩阵乘法进行基准测试。
'n' 参数来自 configs 列表。
"""
a = torch.randn(n, n, device="cuda")
b = torch.randn(n, n, device="cuda")
with nsight.annotate("matmul"):
_ = a @ b
Numba-CUDA 调试
首次实现了在 GPU 上运行 Numba-CUDA 内核的调试功能,支持 CUDA-GDB 命令行调试和 NVIDIA Nsight Visual Studio Code 版。用户可以像使用主机和原生 CUDA 调试器一样,设置断点、单步执行语句以及检查程序状态。此初始支持的功能集有限,团队正积极寻求反馈以改进它。要了解更多信息,请查看 Numba-CUDA 调试文档,并在开发者论坛上寻求帮助或提供反馈。
NVIDIA Nsight 工具更新
NVIDIA Nsight Compute 2026.1 包含一个新的报告聚类和合并工具,可通过“文件”>“合并报告”菜单访问。这有助于用户理解来自重复实验、单独的性能分析会话或生成多个报告的多进程应用程序的数据。
图 2. Nsight Compute 报告聚类工具
“源”页面上的新寄存器依赖相关性窗口帮助用户识别源代码行依赖关系,从而快速定位瓶颈。CUDA Graphs 查看器工具窗口得到了显著改进,可以在交互式性能分析模式下显示图形的构建和分析过程,并将收集的结果与图形节点进行视觉关联。Nsight Compute 包含在 CUDA 工具包中,也可作为独立下载提供。
NVIDIA Nsight Cloud 包括对 Kubernetes 的 Nsight Operator 以及 Nsight Streamer Kubernetes 和 Docker 容器的更新,用于从集群内部访问和查看 Nsight 工具报告。
NVIDIA Nsight Copilot 是一款免费的 AI 驱动的 CUDA 编码助手,现在所有拥有 NVIDIA 开发者帐户的用户均可使用。
NVIDIA Nsight Systems 2026.1 包括:
- PyTorch 性能分析改进,用于显示前向和后向扩展模块的形状和训练参数
- Python 采样功能对 Python 3.14 的支持
- 一个新的选项,用于捕获 GPUDirect Storage DMA 操作的指标
CCCL
CUDA 13.2 附带 CCCL 的 3.2 版本。亮点包括新的现代 CUDA C++ 运行时 API 和新的优化算法,包括 Top-K。
现代 CUDA C++ 运行时
CCCL 3.2 广泛地为核心 CUDA 运行时和驱动程序功能引入了新的符合 C++ 习惯用法的接口。
如果你写过 CUDA C++,你可能已经围绕当前的 C 风格 API(如 cudaMalloc 或 cudaStreamCreate)构建(或采用)了某种形式的便捷封装。
CCCL 3.2 中添加的新 API 旨在为核心 CUDA 结构提供 C++ 的生产力和安全性优势,这样你就可以花更少的时间重新发明封装,而将更多时间用于编写内核和算法。
亮点包括:
- 为核心 CUDA 概念(
cuda::stream、cuda::event、cuda::arch_traits)提供新的便捷词汇类型 - 通过 Memory Resources 和
cuda::buffer简化内存管理 - 通过
cuda::launch实现更强大、更便捷的内核启动
示例(向量加法,重新实现):
cuda::device_ref device = cuda::devices[0];
cuda::stream stream{device};
auto pool = cuda::device_default_memory_pool(device);
int num_elements = 1000;
auto A = cuda::make_buffer<float>(stream, pool, num_elements, 1.0);
auto B = cuda::make_buffer<float>(stream, pool, num_elements, 2.0);
auto C = cuda::make_buffer<float>(stream, pool, num_elements, cuda::no_init);
constexpr int threads_per_block = 256;
auto config = cuda::distribute<threads_per_block>(num_elements);
auto kernel = [] __device__ (auto config, cuda::std::span<const float> A,
cuda::std::span<const float> B,
cuda::std::span<float> C){
auto tid = cuda::gpu_thread.rank(cuda::grid, config);
if (tid < A.size())
C[tid] = A[tid] + B[tid];
};
cuda::launch(stream, config, kernel, config, A, B, C);
在 Compiler Explorer 上实时尝试此示例。请继续关注关于设计目标和预期使用模式,以及这些新 API 如何与现有 CUDA API 共存的深入探讨。
新算法
本节详细介绍 CUDA 13.2 中新增的算法。
Top-K 选择
CCCL 3.2 引入了 cub::DeviceTopK(例如,cub::DeviceTopK::MaxKeys),用于选择 K 个最大(或最小)的元素,而无需对整个输入进行排序。对于 K 较小的工作负载,这可以比完整的基数排序快 5 倍,并且在不需要排序结果时可以降低内存消耗。
图 3. 归一化执行时间:新的 cub::DeviceTopK::MaxKeys(K=3)与执行完整基数排序的常见解决方案的比较
固定大小分段归约
CCCL 3.2 现在提供一个新的 cub::DeviceSegmentedReduce 变体,它接受统一的 segment_size,从而在段大小固定的常见情况下消除了偏移迭代器的开销。这为小段大小(高达 66 倍)和大段大小(高达 14 倍)都实现了优化。
// 新 API 接受固定的 segment_size,而不是每个段的开始/结束偏移量
cub::DeviceSegmentedReduce::Sum(d_temp, temp_bytes, input, output,
num_segments, segment_size);
在图 4 中,与为每个段指定开始和结束偏移量的现有实现相比,新的固定大小变体对小段和大段都显示出显着的加速。
图 4. 归一化执行时间:新的固定大小分段归约重载与现有实现的比较
CCCL 3.2 中的更多新算法
- 分段扫描:
cub::DeviceSegmentedScan提供并行扫描的分段版本,可有效地在多个独立段上计算扫描操作。 - 二分查找:
cub::DeviceFind::[Upper/LowerBound]在有序序列中并行搜索多个值。 - 搜索:
cub::DeviceFind::FindIf在无序输入中搜索满足给定条件的第一个元素。由于其提前退出逻辑,它可以比搜索整个序列快 7 倍。
CUDA Python
CuPy 现在支持 CUDA 13.0 和 13.1,并且 PyPI 上提供了 CUDA 12 和 CUDA 13 的轮子。这意味着在没有系统级 CUDA 工具包的情况下安装 CuPy 比以往任何时候都更容易。
pip install cupy-cuda12x
pip install cupy-cuda13x
CuPy 现在实现了 CUDA Stream 协议,允许与 PyTorch、JAX 和其他支持该协议的框架直接共享流。这意味着无需手动指针管理即可实现零拷贝互操作性。
# 与 PyTorch 共享 CuPy 流
pytorch_stream = torch.cuda.ExternalStream(cupy_stream)
# 或将外部流导入 CuPy
cupy_stream = cupy.cuda.Stream.from_external(pytorch_stream)
增加了对 ml_dtypes.bfloat16 的支持,这为 CuPy 带来了原生降低精度计算,这是 AI 训练和推理中常用的类型。通过对通用 ufunc、数组运算符和标量处理进行快速路径优化,一些核心操作的性能得到了提升。对多线程应用程序的支持得到了改进。现在可以通过 ndarray.mdspan 将 CuPy 数组视为 cuda::std::mdspan 对象,并可控制 32 位和 64 位索引。这为用户提供了对算术运算和性能的更多控制。
cuda.core 0.6 引入了用于 GPU 监控和管理的 NVML 绑定(cuda.bindings.nvml),以及用于胖二进制文件操作的新 nvFatbin 绑定(cuda.bindings.nvfatbin)。新的 cuda.core.system 模块在 NVML 之上,提供了对系统信息(例如设备温度监控和 CPU/GPU 亲和性)的 Pythonic 访问。
构建 CUDA Graphs 的支持已从实验性命名空间中毕业,现在可以在主 cuda.core 命名空间下使用。这使开发人员能够捕获操作序列并以最小开销重放它们,并支持高级模式,如条件执行(if_cond 和 while_loop)、分叉-合并。以下代码展示了 API 的工作方式:
# 通过捕获操作构建图形
gb = device.create_graph_builder()
gb.begin_building()
# 在图形中捕获内核启动(不执行)
launch(gb, LaunchConfig(grid=256, block=256), kernel_a, data_ptr)
launch(gb, LaunchConfig(grid=256, block=256), kernel_b, data_ptr)
launch(gb, LaunchConfig(grid=256, block=256), kernel_c, data_ptr)
# 完成并实例化图形
graph = gb.end_building().complete()
# 将图形启动到现有的 CUDA 流中
graph.launch(stream)
如需更多信息,请参阅 cuda.core.GraphBuilder 文档和示例。
开始使用 CUDA 13.2
CUDA 13.2 通过持续提升 Python 的地位并引入注重生产力的语言特性,在易用性和峰值 GPU 性能之间架起桥梁,从而简化了高性能开发。
下载 CUDA 13.2 工具包即可开始使用。
致谢
感谢 NVIDIA 的贡献者:Jake Hemstad、Becca Zandstein、Jackson Marusarz、Mridula Prakash、Rekha Mukund、Daniel Rodriquez、Bo Dong、Andy Terrel、Raphael Boissel 和 Rob Armstrong。FINISHED