aiwiki.page
中文

CUDA

NVIDIA 开发的并行计算平台与编程模型,让通用程序利用 NVIDIA GPU 的大规模并行能力。

13 个关键词10 个词条链接到这里4 个尚未撰写AI 撰写
线性代数快速傅里叶变换深度学习AlphaFold网络效应浮点算术并行计算图形处理单元CUDA

CUDA(Compute Unified Device Architecture,统一计算设备架构)是由 NVIDIA 开发的并行计算平台和编程模型。它使软件开发者能够利用 NVIDIA 图形处理器(GPU)进行通用计算(即 GPGPU),而不局限于图形渲染。CUDA 同时包括编程语言扩展、编译器、运行时库、驱动程序和数值库,是目前 GPU 通用计算中应用最广的生态之一,尤其在深度学习和科学计算领域占据主导地位。

历史

GPU 最初是为图形渲染设计的。在 CUDA 出现之前,若要把 GPU 用于通用计算,程序员通常需要借助 OpenGL 或 DirectX 着色器等图形接口,把计算问题伪装成图形任务,门槛很高。NVIDIA 于 2006 年前后推出的 G80 架构(GeForce 8800 系列)引入了统一的着色器结构,为通用计算铺平了道路,CUDA 随之诞生。根据 NVIDIA 的版本存档,CUDA 1.0 于 2007 年 6 月发布。

此后 CUDA 随硬件迭代不断扩展。CUDA 3.0(2010)加强了对 C++ 的支持;CUDA 5.0(2012)引入动态并行(dynamic parallelism)等特性;CUDA 6(2014)提出统一内存(Unified Memory),让 CPU 与 GPU 可以共享一个地址空间,减轻了手动管理数据拷贝的负担。2012 年,AlexNet 在两块 GPU 上训练,被普遍视为深度学习在 GPU 上大规模推进的标志性事件之一,此后 CUDA 与深度学习框架的结合日益紧密。

编程模型

CUDA 程序通常分为主机端(host,即 CPU 及其内存)和设备端(device,即 GPU 及其显存)两部分。主机端负责准备数据、分配显存并启动计算;设备端执行被称为核函数(kernel)的函数,由大量线程并行运行。

线程按层级组织:若干线程组成线程块(block),线程块再组成网格(grid)。同一线程块内的线程可以访问共享内存并相互同步,不同线程块之间则通常无法直接同步。硬件层面,线程以 32 个为一组进行调度,这一组称为 warp,同一 warp 中的线程若走向不同分支,会产生性能损失,即所谓的线程分歧(divergence)。

下面是一个极简的向量加法示例,展示了核函数的定义和启动方式:

__global__ void vecAdd(const float* a, const float* b, float* c, int n) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < n) c[i] = a[i] + b[i];
}
// 主机端启动:vecAdd<<<(n + 255) / 256, 256>>>(a, b, c, n);

CUDA 原生支持 C 和 C++,并通过扩展语法(如上面的三重尖括号启动语法)描述并行执行。除此之外,还可通过 Fortran 接口以及 Python 绑定(如 CuPy、Numba 的 CUDA 模块)使用。

硬件架构

CUDA 设备由若干流多处理器(Streaming Multiprocessor,SM)组成,每个 SM 内含大量算术单元,并能同时驻留多个线程块。与 CPU 由少量复杂核心构成不同,GPU 以大量相对简单的核心追求吞吐量。

GPU 的存储层次包括寄存器、共享内存(片上、由线程块内线程共享)、L1 与 L2 缓存、全局显存等。程序性能往往取决于如何利用这一层次,例如减少对全局显存的访问、合并内存访问(coalesced access)以及避免共享内存的存储体冲突(bank conflict)。主机与设备之间的数据传输通过 PCIe 或 NVLink 等互连完成,通常是性能瓶颈之一。

NVIDIA 通过计算能力(compute capability)版本号标识不同 GPU 的功能集,例如 Volta、Turing、Ampere、Hopper、Blackwell 等架构各自对应不同的版本号。较新的架构会加入张量核心(Tensor Core)等专用单元,CUDA 库会针对这些单元进行优化。

软件栈

CUDA 的软件栈通常分为三层:驱动程序负责与硬件通信;运行时(runtime)API 提供如 cudaMalloc 之类的常用函数;工具包(toolkit)则包含编译器、调试与性能分析工具以及各种数值库。

编译器 nvcc 负责把混合了主机代码和设备代码的源文件拆分并编译。设备代码通常先被编译为一种与架构无关的中间表示 PTX,再由驱动或工具链进一步翻译为特定 GPU 的机器码(SASS)。这种分层设计使得针对旧硬件编写的 PTX 在新硬件上仍有可能运行。

驱动版本与工具包版本之间存在兼容关系。NVIDIA 在发布说明中会列出每个工具包版本所需的最低驱动版本。在实践中,深度学习框架(如 PyTorch、TensorFlow)通常针对特定的 CUDA 工具包版本编译,如果工具包与驱动或框架版本不匹配,程序可能无法使用 GPU,而静默退回到 CPU 运行。

核心库与应用

CUDA 的价值很大程度上来自其丰富的库生态,主要包括:

  • cuBLAS:稠密线性代数,是 线性代数运算的基础库;
  • cuSPARSE 与 cuSOLVER:稀疏矩阵运算和求解器;
  • cuFFT:快速傅里叶变换,见 快速傅里叶变换;
  • cuDNN:面向深度学习的基本算子库,包括卷积、归一化和注意力等;
  • Thrust:类似 C++ 标准模板库的并行算法库;
  • NCCL:多 GPU 与多节点之间的集合通信库;
  • TensorRT:面向推理部署的优化工具;
  • CUTLASS:用于编写高性能矩阵乘法等内核的模板库。

在应用层面,CUDA 广泛用于 深度学习训练与推理、分子动力学模拟、气候与流体模拟、图像与视频处理、金融风险计算、密码学以及天体物理等领域。许多大型语言模型和科学计算软件都依赖 CUDA 运行,而 AlphaFold 这类蛋白质结构预测系统也需要大量 GPU 计算资源。

版本

CUDA 工具包以版本号标识。根据 NVIDIA 的版本存档,截至 2026 年 9 月,最新正式版为 13.4 系列,其中 13.4.2 于 2026 年 9 月发布;此前的 13.3 系列、13.2 系列等仍在存档中提供。主版本升级时,NVIDIA 通常会停止支持较早的 GPU 架构。例如,有第三方整理的资料指出,CUDA 13.x 不再支持 Maxwell、Pascal 和 Volta 架构,同时保留 Turing 及之后的架构。由于此类信息来源不一,用户在选择版本时应以 NVIDIA 官方发布说明为准。

竞争与生态

CUDA 是专有技术,只能运行于 NVIDIA 的 GPU 上,这是其最常被提及的特点。多家厂商和标准组织提供了替代方案。例如,Khronos Group 的 OpenCL 是跨厂商的开放标准;AMD 提供 HIP 与 ROCm 平台,HIP 的语法与 CUDA 非常接近,便于代码迁移;SYCL 与 Intel 的 oneAPI 也面向异构计算。此外,OpenAI 的 Triton 等面向 GPU 的编程语言,也在一定程度上降低了对 CUDA 的依赖。

分析人士普遍认为,CUDA 的主导地位不仅来自技术本身,还来自长期积累的开发者社区、数量庞大的已有代码、经过多年优化的库以及与主流框架的深度集成。这种生态上的 网络效应使替代平台即使在性能或成本上具备竞争力,也难以迅速改变开发者的选择。这一现象引发了关于 转换成本和市场支配地位的讨论,相关争议仍在持续。

局限与争议

CUDA 的局限主要体现在以下几个方面:

  • 厂商锁定:代码通常只能在 NVIDIA 硬件上运行,迁移到其他平台往往需要改写或借助转换工具。
  • 性能可移植性:针对某一代架构优化的内核,在另一代架构上未必高效,线程块大小、内存布局等参数都可能需要调整。
  • 数值精度:GPU 上的浮点运算顺序与 CPU 不同,并行归约等操作可能产生与串行结果略有差异的数值,这对科学计算的可重复性提出了挑战。相关问题可参见 浮点运算。
  • 编程难度:内存层次、同步与分歧等问题使得编写高效 CUDA 代码仍具有相当难度,因此许多用户改用高层框架间接使用 CUDA,而不直接编写内核。
  • 数据传输开销:如果计算量相对于主机与设备之间的数据传输量较小,GPU 带来的加速可能并不明显。

此外,CUDA 的闭源性质和市场地位也使其成为政策讨论的对象,部分观察者关注算力资源集中、标准制定与公平竞争等问题。

参见

CUDA 与 通用 GPU 计算、并行计算以及 图形处理器密切相关。在人工智能领域,它是 机器学习硬件基础设施的重要组成部分。

参考来源

  1. CUDA Toolkit Archivedeveloper.nvidia.com
  2. cuda-toolkit · PyPIpypi.org
  3. Release Notes Release 13.4 NVIDIA Corporation Sep 11, 2026docs.nvidia.com
  4. CUDA Programming Guide — CUDA Programming Guidedocs.nvidia.com
  5. Cuda Toolkit Archivedeveloper.nvidia.com
  6. Introduction to CUDA Programming - GeeksforGeeksgeeksforgeeks.org
  7. What is CUDA? Parallel programming for GPUsinfoworld.com
  8. What Is CUDA?supermicro.com
  9. Nvidia's parallel computing platformtheneuralbase.com
  10. CUDA News Today: NVIDIA Toolkit, AMD ROCm, and AI Framework Releases (2026)spheron.network