引言
今天(6月5日),AI 圈流传着一则颇具黑客浪漫色彩的新闻:AMD 主动把顶级 AI 加速卡送给了传奇黑客 George Hotz——就是那个 17 岁破解 iPhone、18 岁破解 PS3 的人。
Hotz 的判断很直接:英伟达真正的护城河不是 GPU 硬件,而是 CUDA 软件生态。 他声称要用「两万行代码」撕开这道壁垒。
这句话乍听很豪气,但仔细想想会让人背脊发凉——CUDA 生态真实的代码规模,远不止两万行。
作为一个长期盯着 AI 基础设施的观察者,我想借今天这个新闻,认真讲清楚一件事:CUDA 的护城河到底建在哪里,为什么这么多年没有人能复制?
问题背景:GPU 不贵,但用 GPU 的"语言"贵
先说一个容易被忽视的事实。
从纯硬件算力论,AMD 的旗舰卡 MI300X 理论峰值算力(1307 TFLOPS FP16)已经超过英伟达 H100(989 TFLOPS),而且配备了惊人的 192GB HBM3 显存——是 H100 的 2.4 倍。
价格上,AMD 也更便宜。
但现实是:2026 年,全球 AI 训练市场英伟达占有率仍然超过 80%。
原因只有一个:硬件买来了,软件跑不起来。
这里说的"软件",不是一个 .exe 或一个 Python 包,而是一个已经运转了 20 年的完整软件生态——CUDA。
技术原理:CUDA 护城河的四层结构
要理解 CUDA 为什么难复制,需要把它拆成四层来看。
第一层:编程模型——思维方式的迁移成本
CUDA 的核心是一套 GPU 并行编程抽象。它把 GPU 计算组织成这样一个层次结构:
Thread(线程)
└── Warp(32个线程的执行单元)
└── Block(若干 Warp 构成的块)
└── Grid(若干 Block 构成的网格)
这个抽象看起来简单,但"Warp 是以 32 线程为单位同步执行的"这一设计,深刻影响了全球开发者 20 年来写并行代码的方式。
比如,一个经典的矩阵乘法 CUDA Kernel:
// CUDA 矩阵乘法 Kernel(简化版)
__global__ void matmul(float* A, float* B, float* C, int N) {
// 每个线程负责计算 C 矩阵的一个元素
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
float sum = 0.0f;
for (int k = 0; k < N; k++) {
sum += A[row * N + k] * B[k * N + col];
}
C[row * N + col] = sum;
}
// 调用:16x16 线程块
dim3 blockSize(16, 16);
dim3 gridSize((N + 15) / 16, (N + 15) / 16);
matmul<<<gridSize, blockSize>>>(A, B, C, N);
而 AMD 的 ROCm/HIP 选择了 Wavefront = 64 线程。别看只是数字不同,这意味着所有针对 Warp=32 精心调优过的 Kernel——包括 Warp-level 原语(__shfl_sync、__ballot_sync)——迁移到 AMD 都需要重写。
这不是翻译问题,这是思维模式的迁移。
第二层:高性能算子库——20 年工程师心血的结晶
光有编程模型不够,AI 框架真正调用的是底层算子库。
CUDA 生态的核心库矩阵如下:
CUDA 核心库生态
├── cuBLAS ← 矩阵运算,所有深度学习的基石
├── cuDNN ← 卷积/注意力/归一化,已深度优化 10 年
├── cuFFT ← 快速傅里叶变换
├── NCCL ← 多卡通信,分布式训练的核心
├── TensorRT ← 推理引擎,量化/融合算子
└── CUTLASS ← 模板化矩阵乘法库,FlashAttention 的底层
这些库不是"可以用",而是"被数百万工程师踩过所有 corner case 之后的稳定产物"。
以 cuDNN 的卷积为例,它内部根据输入 shape、硬件型号、batch size 自动选择最优算法(Winograd、FFT、直接卷积),这背后是英伟达工程师逐款 GPU 手动调优的产物。
AMD 的对应物 MIOpen 也在追赶,但差距仍然明显,尤其在:
- Transformer 注意力机制的 FlashAttention 优化
- 混合精度(BF16 + FP8)训练
- 动态 shape 推理
第三层:PyTorch/JAX 的深度绑定——生态的"引力场"
深度学习框架是 CUDA 护城河的"引力场"。
PyTorch 与 CUDA 的绑定已经到了分子级别:
# PyTorch 内部,几乎所有算子都走这个路径
# aten/src/ATen/native/cuda/...(数千个 CUDA 专属 kernel)
import torch
# 这一行背后:torch.Tensor 的存储、autograd 引擎、
# 算子分发、内存池,全部与 CUDA 深度集成
x = torch.randn(1024, 1024, device='cuda')
y = torch.matmul(x, x.T) # 实际调用 cublas + cuda memory manager
# ROCm 路径虽然存在,但:
# 1. 版本滞后 1-2 个月
# 2. 部分自定义算子(Triton kernel)ROCm 不支持
# 3. CUDA Graph 在 ROCm 上支持不完整
更致命的是 Triton——OpenAI 开源的 GPU 编程语言,现在大量 FlashAttention、混合精度 Kernel 都用 Triton 写,而 Triton 的主要优化目标是英伟达 GPU。
第四层:工具链生态——"调试 GPU 程序"的能力壁垒
这一层最容易被忽视,却是实战中最痛苦的。
- Nsight Compute:可以精确到每个 SM(流处理器)的指令级性能分析
- cuda-gdb:GPU 代码调试器,支持断点、内存检查
- CUDA sanitizer:检测内存越界、数据竞争
AMD 的对应工具(rocgdb、rocProf、Omniperf)虽然在进步,但与英伟达工具链在文档质量、Stack Overflow 资源、企业支持上的差距,用"代际差"来形容并不夸张。
代码示例:tinygrad 的反叛哲学
George Hotz 的 tinygrad 是目前最有趣的"反 CUDA"尝试。
它的核心设计哲学是:用最少的代码支持最多的硬件后端。
# tinygrad 的极简设计理念
# 整个框架核心只有约 2000 行 Python
from tinygrad.tensor import Tensor
from tinygrad.helpers import Timing
# 同一套代码,可以跑在:
# - CUDA(英伟达)
# - Metal(苹果 M 系列)
# - ROCm(AMD)
# - WebGPU(浏览器)
# - CPU
# 设置后端:AMD GPU
import os
os.environ['GPU'] = '1' # AMD ROCm 后端
# 定义一个简单神经网络
class TinyNet:
def __init__(self):
self.w1 = Tensor.randn(784, 128)
self.w2 = Tensor.randn(128, 10)
def forward(self, x):
# 所有操作都是懒计算(lazy evaluation)
# tinygrad 会自动生成对应后端的 kernel
return x.dot(self.w1).relu().dot(self.w2)
model = TinyNet()
x = Tensor.randn(32, 784) # batch_size=32
with Timing("forward pass: "):
out = model.forward(x)
out.realize() # 触发真正的计算
# tinygrad 的"对抗 CUDA"方式:
# 不是复制 CUDA,而是绕过它
# 用 LLVM IR / PTX / Metal shader 直接生成硬件指令
# 证明"高性能不一定需要 CUDA"
tinygrad 的意义不在于性能,而在于证明了一个可能性:用干净的抽象,可以以极小的代码量支持多种硬件后端。这是 CUDA 的反面——CUDA 用复杂性换性能,tinygrad 用简洁换可移植性。
个人观点:黑暗森林中的软件帝国
我一直觉得,英伟达是科技史上最成功的软件公司之一——只是恰好用 GPU 作为发行媒介。
CUDA 诞生于 2006 年,距今整整 20 年。这 20 年里,英伟达干了一件很聪明的事:把软件生态做成了迁移成本。
你不是在买 GPU,你是在买"过去 20 年所有 CUDA 代码的可运行权"。
这是一种极其高级的"技术锁定"——不是靠专利壁垒(CUDA 的很多底层概念已被学术界广泛理解),而是靠生态惯性:
- 所有 AI 论文的代码都用 CUDA 跑
- 所有 AI 工程师都学 CUDA
- 所有 AI 框架都为 CUDA 优化
- → 所有新公司都选英伟达
- → 英伟达继续投资优化 CUDA
- → 回到第 1 步
这个飞轮一旦转起来,AMD 再强的硬件也很难打破。
但 George Hotz 的思路是对的:不要正面复制 CUDA,而是找到一个新的抽象层,让硬件后端可插拔。这是更有价值的方向。
AMD 赠送芯片给 Hotz,本质上是在投资"CUDA 替代叙事"——哪怕成功率只有 10%,对 AMD 来说也值得押注。
问题是:两万行代码能撬动两千万行代码的生态吗?
我的答案是:短期不能,但方向是对的。 真正的破局点不在于复制 CUDA,而在于等待下一个范式跃迁——比如光子计算、存内计算——让所有人都重新站在同一起跑线上。
到那时,谁的软件抽象层更干净,谁才是真正的赢家。
总结
| 维度 | CUDA(英伟达) | ROCm/HIP(AMD) |
|---|---|---|
| 编程模型 | Warp=32,成熟 20 年 | Wavefront=64,迁移有代价 |
| 核心算子库 | cuDNN/cuBLAS 深度优化 | MIOpen/rocBLAS 追赶中 |
| 框架生态 | PyTorch/JAX 原生 | 滞后 1-2 版本,部分不稳定 |
| 工具链 | Nsight 全套 | rocProf,文档较弱 |
| 护城河来源 | 软件惯性 + 生态锁定 | 硬件性价比,显存领先 |
核心结论:GPU 硬件是可以被复制的,但 20 年深度优化的软件生态不能。CUDA 的护城河本质上是迁移成本,而非技术门槛。George Hotz 的挑战有象征意义,但真正的破局需要等待范式级别的跃迁。