英伟达的CUDA,到底是什么?
一文看懂:英伟达的CUDA,到底是什么?
参考视频
当你看到“CUDA”这几个字的时候,大概率是一脸懵逼的。
不过如果你对显卡稍微有一些了解,或者说关注过AI相关的内容,就一定听说过这个东西。而CUDA的全称就是Compute Unified Device Architecture,翻译过来叫计算统一设备架构。
也正是有了这个让你看着一脸懵逼的计算架构的存在,才让英伟达完美地赶上了区块链、科学计算以及AI的风口。
那除了英伟达的显卡,华为昇腾的NPU也有自己的计算架构——CANN。
所以这个重要到可以被称为“护城河”的计算架构,到底是什么?为什么它可以产生这么大的影响?
从一段AI代码说起
不管是区块链、科学计算,还是AI,它们的底层本质上都是在对大量的数学公式进行计算。
一个简化的、不严谨的AI模型代码,大概长这个样子:
def simple_model(x, w1, b1, w2, b2):
# 第一层:线性变换 + ReLU激活
h = relu(x * w1 + b1)
# 第二层:线性变换 + Sigmoid激活
y = sigmoid(h * w2 + b2)
return y
里面就是一堆的公式。这些 relu、sigmoid 之类的函数,可能很多人都没有见过。不过没有关系,本质上它们和 sin、cos 这种三角函数是差不多意思的——反正就是根据输入的值计算一个结果。
那假设我们现在要在CPU上运行这个代码,这里面就有一个小问题:
CPU的底层硬件只支持简单的加法和乘法,并不能直接支持这些复杂的运算。
所以我们需要专门写一些函数来做“对接”。说白了,就是利用CPU能提供的简单的加法和乘法,来实现这些复杂的运算。那这样子,你的AI模型就可以在CPU上跑起来了。
这里面一个一个的函数,在AI领域被称为是算子。这是一个很重要的概念,后面我们还会用到。
问题的出现:代码怎么写到GPU上?
后来你发现,CPU运行这些公式的速度太慢了。这里面有一部分代码,如果能利用GPU的并行计算或者NPU的张量计算来实现,速度要快很多。
所以这个时候,你就需要根据GPU和NPU底层能提供的计算能力,来重新编写这里面的代码。
然后问题就来了:这个代码怎么写?用什么语言写?
可能对很多人来说,面向GPU和NPU编程是理所当然、天经地义的事情——“你可以用C语言、Python、Java对它们进行编程啊!”
但实际上并不是这样。
这些都是针对于CPU的编程语言。
CPU之所以能看懂这些代码,是因为有一种叫做编译器的工具存在。编译器就像是一个翻译,它会把C语言这种方便人类看懂的高级语言,翻译成CPU能看懂的汇编语言。
而一开始的时候,GPU和NPU根本就没有对应的编译器。所以GPU和NPU只能看懂它们自己的汇编。而且不同平台、不同厂家的产品,它们的汇编指令也是完全不一样的。再加上大部分厂家出于保密的需求,也不愿意对外开放自己的汇编指令集。
所以这里面的代码,基本上就是靠芯片厂家自己用汇编实现的。
这也带来了一个非常严重的问题:
厂家提供什么算子,你就只能用什么算子。
如果你的AI模型中需要一个新的算子,那就无法运行了。唯一的办法就是找厂家支持,让他们给你把这个算子的实现写出来。
但是显然这不太合理。一般的厂家大概率没有这么多人力去随时支持你,所以你只能放弃你的AI模型。
而这一切问题的根源就是:没有针对GPU和NPU的高级编程语言和编译器。
计算架构 = 编程语言 + 编译器
所以这个时候,如果有一个做GPU或者NPU的厂家突然站出来说:
“我们针对自己家的计算芯片,专门开发了一个高级编程语言以及对应的编译器,并且都开放了出来。开发者可以自由地去编写这里面的算子。”
那么我想,大家一定会去拥抱这个芯片平台。
而这个“编程语言 + 编译器”合起来,就是计算架构。
在英伟达的CUDA里面:
- 这个编程语言被叫做 CUDA C/C++
- 这个编译器叫做 NVCC
而在华为昇腾的CANN里面:
- 编程语言叫做 Ascend C
- 编译器叫做 毕昇(BiSheng)
除了编译器,还有什么?
那除了基础的编程语言和编译器,计算架构还会提供用它们的编程语言编写的基础算子库,供你使用。
- 英伟达的叫做 cuDNN
- 昇腾的叫做 AOL(Ascend Operator Library)
如果你只是一个AI模型的使用者,那么基本上只需要关注算子库就可以了,里面的算子大概率能满足你的需求。
而如果你是一个比较前沿的AI模型开发者,算子库中又没有你需要的算子,那么就需要自己来写算子了。
那除此之外,昇腾CANN还提供了图引擎、Runtime等工具,方便你更好地开发。
为什么说这是“护城河”?
不管是开发编程语言、还是编译器,又或者是维护不断扩张的算子库,都需要厂家投入巨量的资源。这不是一般的公司玩得转的。
而一旦做起来了,也就构成了所谓的护城河。
因为当千千万万的开发者在你的平台上写代码、做优化、沉淀生态之后,迁移到另一个平台的成本会变得极其高昂。后来者即使硬件性能追上了,也会因为软件生态的差距而难以撼动。
这,就是CUDA之于英伟达的意义。
也是为什么计算架构这件事,值得被反复讨论。
总结
用一张图来概括:
┌─────────────────────────────────────────┐
│ 计算架构(CUDA / CANN) │
├─────────────────────────────────────────┤
│ 高级编程语言(CUDA C/C++ / Ascend C) │
│ ↓ 编译 │
│ 编译器(NVCC / 毕昇) │
│ ↓ 生成 │
│ 底层汇编指令(GPU / NPU可执行) │
├─────────────────────────────────────────┤
│ 基础算子库(cuDNN / AOL) │
│ 图引擎、Runtime等工具 │
└─────────────────────────────────────────┘
核心逻辑其实就一句话:
计算架构的本质,就是让开发者能够用高级语言,自由地为AI芯片编写算子的那一整套工具链。而谁掌握了这套工具链的生态,谁就掌握了AI计算的话语权。
PyTorch 与 CUDA 的关系
一句话:PyTorch 是上层框架,CUDA 是底层地基。
- PyTorch 本身不会直接操作 GPU,它必须调用 CUDA 提供的接口,才能把计算任务放到英伟达显卡上执行。
- 调用链:
Python 代码 → PyTorch 算子 → CUDA/cuDNN 算子库 → CUDA Runtime → GPU 硬件 - 你在 PyTorch 里写
.cuda(),背后是 PyTorch 帮你调用了 CUDA 的算子库(如 cuBLAS、cuDNN)来加速计算。 - PyTorch 有后端解耦设计:CUDA(英伟达)、CPU、MPS(苹果)、以及华为昇腾的
torch_npu(底层走 CANN)。换后端只需要改设备名(如.cuda()→.npu()),代码逻辑不变。 - 关系类比:PyTorch 是餐厅的菜单和服务员,CUDA 是厨房和厨师。你负责点菜(写模型),CUDA 负责用最快的速度把菜炒出来(并行计算)。
Triton 与 CUDA 的关系
一句话:Triton 是架在 CUDA 之上的编译器,让你用“类 Python”代码写 GPU 算子,底层仍依赖 CUDA。
- Triton 是 OpenAI 推出的深度学习编译器,作用是降低手写 CUDA 的门槛:你不用管理线程块、共享内存、同步等底层细节,写类似 Python 的代码就能生成高效的 GPU 内核。
- 调用链:
Python/Triton 代码 → Triton 编译器 → 生成 CUDA 内核 → GPU 执行 - Triton 最终生成的仍然是 CUDA 代码,它只是 CUDA 的“高级封装”或“编译器前端”,并不能替代 CUDA。
- PyTorch 2.0 的 TorchInductor 默认后端之一就是 Triton,所以它成了 AI 编译加速的重要一环。
- 关系类比:CUDA 是手动挡赛车(要自己换挡、控离合),Triton 是自动挡跑车(你只管方向盘和油门)。但自动挡的底盘和发动机,还是 CUDA 的。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)