📑 本页目录(点开跳转)
00 · 怎么用这份教程
⏱ 30 分钟 | ⭐ 这不是 C++ 教程 —— 它只回答「你从 Python 一路往下追,会撞到哪几堵墙」
🎯 一句话
这个板块很窄,而且是故意的。 它不教你写 C++,只教你读懂那几处「Python 到此为止」的地方 —— 一共六堵墙,一章一堵。
⏱ 先说清楚这套的章比站内其他板块长(普遍 50–120 分钟,站内其他板块的中位是 30)—— 因为每个知识点都带实跑代码和真实报错,压不下去。设计上就没打算让你一次读完: 超过 55 分钟的章在中间有 🛑 休息点,最长的几章有两个,停在那里下次接着读就行。 徽章是按 170 字/分钟实测校准的,宁可吓到你,也不骗你。
🧩 一、先说它不是什么
这一条放在最前面,因为它决定你要不要往下读。
| 你以为的 | 实际 |
|---|---|
| 一套 C++ 入门课 | ❌ 这里没有 int main() 从零讲起,没有 STL 巡礼,没有模板元编程 |
| 教你写 CUDA kernel | ❌ 本板块没有能跑的 CUDA 代码(作者机器上没有 nvcc,见第五节的诚实声明) |
| 教你做 C++ 后端 / 游戏 / 客户端 | ❌ 完全不碰 |
| 学完能去写 PyTorch | ❌ 学完能读,写要另花几个月 |
⭐ 它真正的坐标原点是 PyTorch,不是 C++ 语言本身。 每一章的立项理由都是同一个形状:站内某一章讲到某句话就停住了,而停住的原因是 C++。
举三个站内的原话:
- 《AI 基础设施》的导读章,「适合谁」那张表最后一行写着「想写 CUDA kernel ⚠️ 这套教程不教这个」,「前置知识」的「❌ 不需要」清单第一条就是「CUDA 编程」。⭐ 站点自己声明了这个洞。
- 《AI 基础设施》第 2 章画了一张五层图:
PyTorch → cuBLAS/cuDNN/CUTLASS → 自定义 kernel → 驱动 → 硬件,然后只讲了最上面那层。 - 《AI 全栈》第 14 章精确描述了
ImportError: libxxx.so.1: cannot open shared object file这个症状,给了「用容器」这个解药,然后在走神救援里明确写「⚠️ 容器不解决:GPU/CUDA(宿主机的事)」—— 它把最高频的那一类装不上,划到了自己范围之外。
🧩 二、六堵墙,一章一堵
这个板块的章节不是按「C++ 语法顺序」排的,是按你会撞上它们的顺序排的。
| 章 | 你撞上它的那一刻 | 这一章给你什么 |
|---|---|---|
| 01 | 「为什么我这段 Python 慢一百倍,而 torch.matmul 不慢」 |
边界在哪、跨过去要付什么、跨过去之后那把锁怎么处理 |
| 02 | 读源码时满屏 const Tensor&、std::move、unique_ptr,一行读不下去 |
谁负责释放 —— C++ 世界的这一半规则 |
| 03 | 「换个遍历顺序为什么慢十几倍」「为什么大家老说要连续」 | cache line 是什么、结构体为什么会变胖 |
| 04 | undefined symbol: _ZN3c10... / libxxx.so.1: cannot open shared object file |
这三种报错分别断在哪一步、ldd 怎么看 |
| 05 | 想给 PyTorch 加一个自己的算子,或者想知道 torch.relu(x) 之后发生了什么 |
算子是怎么注册进去的:schema、dispatch key、那张表 |
| 06 | 报错信息里有一个陌生的 C++ 文件名和行号,然后你不知道下一步做什么 | 从报错文本定位到实现的固定路线 |
⭐ 01 到 06 是一条链,但每一章都能单独读。尤其是 04:如果你只是「老是装不上包」,可以直接跳进去,不需要前三章。
🧩 三、它不讲什么,以及那些内容在哪
⭐ 这一节比章节地图重要。 这个板块被砍过一轮,砍掉的部分不是消失了,是归给了别的板块。写在这里,免得你在这儿找一个根本不在这儿的东西。
| 你可能想在这里找的 | 实际在哪 | 为什么这样分 |
|---|---|---|
GIL 是什么、线程 vs 进程 vs async 怎么选、multiprocessing 为什么慢 |
《Python 会咬你的地方》 | 那是 Python 语言自己的事。本板块 01 章只讲一件事:跨语言调用的那一刻,锁要不要放开 |
stride、.contiguous()、view 和 reshape 为什么有时报错 |
《NumPy 与向量化思维》 | 那是缓冲区层的事。本板块 03 章只讲硬件层:cache line、AoS/SoA、对齐 —— ⭐ 一个字都不碰 stride |
autograd.Function 怎么写、前向存什么反向还什么 |
《PyTorch 这个框架本身》 | 那是框架的 Python 接口。本板块 05 章只讲算子怎么被注册进 dispatcher |
venv、sys.path、锁文件、pip 依赖解析 |
《Python 会咬你的地方》 | 「装不上」有两半,Python 那一半在那边;本板块 04 章只写 ABI / 符号 / 动态库这一半 |
| 算子融合能省多少、Roofline、MFU、显存优化 | AI 基础设施 07 · 04 · 09 | 那边有完整的账。本板块不重算那笔账 |
| 模型怎么转 ONNX、转完精度掉多少、手机端怎么跑 | 前半段站内已经有了:PyTorch 这个框架本身 10 · 把模型交出去 讲了 TorchScript、ONNX 导出(含 onnxruntime 实跑对拍)、torch.export 和怎么选;⚠️ 后半段仍要外找 —— CoreML / TensorRT 怎么转、量化后精度掉多少、端侧 runtime 怎么选(全景导论 07 把这一半标成「📙 半有」) |
本板块不重讲交付格式那一段 |
🧩 四、三条读法
① 只想读懂别人的 C++ 源码(最常见)
👉 02 → 03 → 06,跳过 01、05。约 4.3 小时。
02 给你所有权词汇,03 给你「为什么这样排数据」,06 给你从报错找到实现的路。
② 老是装不上带编译扩展的包(bitsandbytes、flash-attn、各种 -cu121 的轮子)
👉 直接读 04,一章就够,约 84 分钟(章内有 🛑 断点)。前面三章都不是前置。
③ 想给 PyTorch 加一个自己的算子
👉 全读,重点 01 → 05。⚠️ 但先去 AI 基础设施 07 确认你真的需要:那一章给了三个条件,不满足就别写。
⏱ 全板块正文合计约 8.5 小时(7 章,含本章)。
🧩 五、⚠️ 关于代码:一份诚实声明
本项目有一条硬规矩:声称「实跑过」之前,每段代码必须单独写进一个空文件跑一遍。 那么这个板块的代码是什么状况:
| 类型 | 状况 |
|---|---|
| 纯 C++(02 / 03 / 04 章的全部代码) | ✅ 每段都单独编译运行过,用 g++ 15.1.0 (MinGW-w64),-O2 -std=c++17 |
Python 侧(ctypes、sys.getsizeof、dis、torch 的 dispatch 表) |
✅ 实跑,CPython 3.13.14 + torch 2.13.0+cpu |
| pybind11 代码(01 章) | 🗓️ 未实跑 —— 本机没装 pybind11,而且是 MinGW g++ 配 MSVC 编译的 CPython,编不出能导入的扩展。01 章改用 ctypes 做等价演示,那部分是实跑的 |
| CUDA 代码(05 章的对照片段) | 🗓️ 未实跑 —— 本机无 nvcc,torch 也是 CPU 版。凡是这类代码块都带标记 |
⭐ 凡是没跑过的代码块,正文里都写着 🗓️ 未实跑,并且绝不出现「实测」两个字。
⚠️ 所有耗时数字都是一台普通 Windows 笔记本上跑出来的,你的数值一定和它不同 —— 要看的是倍数关系,不是绝对值。
🔗 这一章连到哪里
| 相关的地方 | 为什么 |
|---|---|
| AI 基础设施 00 | 那一章的「适合谁」表里写着「想写 CUDA kernel ⚠️ 这套教程不教这个」—— 这个板块就是接在那句话后面的 |
| AI 基础设施 02 | 那张五层抽象图是本板块的地图;⭐ 但 SM / warp / 合并访存归它讲,本板块 03 章只讲 CPU 这一侧 |
| AI 全栈 14 | 它讲容器解决什么,本板块 04 章讲它明说不解决的那块(GPU/CUDA、系统库、ABI) |
| ML 基础 15 | 先会用 PyTorch 再来这里;那一章的「六个高频 Bug」是站内的实践入口 |
| 《Python 会咬你的地方》 | GIL、并发选择、打包与 sys.path 全在那边 |
| 《NumPy 与向量化思维》 | stride、视图与拷贝、.contiguous() 全在那边 |
| 《PyTorch 这个框架本身》 | autograd.Function、state_dict、eval() 全在那边 |
✅ 检查点
- 这个板块不教哪四类东西?(提示:看第一节那张表)
- 「站内某一章讲到这里就停住了」为什么比「C++ 很重要」更能当立项理由?
- 如果你只是老装不上带编译扩展的包,应该直接读第几章?大约要多久?
- GIL 本身归哪个板块讲?本板块 01 章只讲 GIL 的哪一个侧面?
- stride 和
.contiguous()归哪个板块?本板块 03 章讲的是哪一层? - 本板块哪些代码是实跑过的,哪些带
🗓️ 未实跑标记?为什么 pybind11 那部分跑不了? - 《AI 全栈》第 14 章的走神救援里,明确说容器不解决的是什么?
👀 答案
- ① C++ 语言入门(没有
int main()从零讲起、没有 STL 巡礼、没有模板元编程)② 能跑的 CUDA kernel ③ C++ 后端 / 游戏 / 客户端 ④ 教你写 PyTorch —— 学完是能读,写要另花几个月。 - 因为「重要」是主观判断,任何主题都能这么说;而「站内第 X 章第 Y 句依赖了它、而站内没人讲」是能被核对的。本板块三条最硬的证据都是站内原话:AI 基础设施 00 的「⚠️ 这套教程不教这个」、「❌ 不需要:CUDA 编程」,以及 AI 全栈 14 走神救援里的「容器不解决:GPU/CUDA」。
- 直接读 04 章,约 84 分钟,前面三章都不是前置 —— 04 是设计成独立可读的。
- GIL 本身归 《Python 会咬你的地方》。本板块 01 章只讲跨语言调用的那一刻锁要不要放开(
gil_scoped_release)。 - 归 《NumPy 与向量化思维》。本板块 03 章讲的是硬件层:cache line、AoS/SoA、对齐 padding,一个字都不碰 stride。
- 实跑:02 / 03 / 04 章的全部 C++ 代码(g++ 15.1.0,
-O2 -std=c++17,每段单独一个文件),以及 Python 侧的ctypes/sys.getsizeof/dis/ torch dispatch 表(CPython 3.13.14 + torch 2.13.0+cpu)。带🗓️ 未实跑的:01 章的 pybind11 代码(本机没装 pybind11,而且 MinGW g++ 配 MSVC 编译的 CPython 编不出能导入的扩展)和 05 章的 CUDA 片段(无 nvcc)。 - 「⚠️ 容器不解决:云服务不一致、GPU/CUDA(宿主机的事)、它不是安全隔离边界。」
🛑 可以停在这里
⚡ 走神救援
📕 ⭐ 这个板块很窄,而且是故意的。它不是 C++ 教程——没有从零讲起、没有 STL 巡礼、没有模板元编程、不碰后端游戏客户端。学完是能读那一层,写要另花几个月。
⭐ 它的坐标原点是 PyTorch 不是 C++ 语言,每一章的立项理由都是同一个形状:站内某一章讲到某句话就停住了,而停住的原因是 C++。 三处站内原话都白纸黑字写着「这套教程不教这个」「不需要 CUDA 编程」「容器不解决 GPU 那一层」。
🧱 六堵墙一章一堵,按你撞上它们的顺序排:边界与那把锁、谁负责释放、cache line 与结构体胖瘦、三种装不上的报错、算子怎么注册进 dispatcher、从报错文本定位到实现。
⭐ 每章都能单独读,其中「装不上」那一章是专门设计成独立可读的——只是老装不上包的读者直接跳进去,前三章都不是前置。
⛔ ⭐ 不讲什么比讲什么更要记住(这个板块被砍过一轮,砍掉的部分归了别人):GIL 与并发模型归 Python 板块、stride 与 view 归 NumPy 板块(本板块一个字都不碰 stride,只讲硬件层)、自定义反向的写法归 PyTorch 板块、融合省多少与显存账归 AI 基础设施。⭐ 而移动端转换站内确实没有,就不假装填上。
⚠️ 代码的诚实声明:中间那几章的每段 C++ 都单独写进空文件跑过,Python 侧的实验也是实跑;⭐ 而绑定层和 CUDA 片段一律标「未实跑」——本机没有那套工具链。凡未跑过的绝不出现「实测」二字,所有耗时看倍数不看绝对值。
下一节 👉 01-Python调C++的那条边界.md