第 29 章 · 番外
从沙子到 CPU/GPU
你已经在这本书里见过很多矩阵乘法、梯度、Transformer 和大模型。但所有这些东西最后都要落到一块真实芯片上, 变成电流的通断、加法器的进位、寄存器的一拍一拍更新。 这一章不讲大模型怎么训练,只补一条更底层的链路:一粒沙子里的硅,到底怎么一路变成 CPU 和 GPU?
《从沙子到 Mythos》是视觉化时间线,负责把整段历史串成一条路。 本章是普通正文版,只拆硬件这半段:沙子、硅、半导体、二极管、三极管、逻辑门、加法器、存储、时钟、CPU、GPU。 后面的神经网络、大模型工程仍然回到第 1 章、第 21 章等主线章节里看。
读完这一章,你会明白
- 为什么偏偏是硅这种材料撑起了现代芯片;
- 半导体的关键不是“半导”,而是能被控制;
- 二极管为什么像电流单向阀,三极管为什么多一个“控制端”后就能做开关;
- 晶体管为什么可以看成一个由电信号控制的开关;
- 二极管网络、三极管反相器、NAND/NOR 门是怎么接起来的;
- 0/1、逻辑门、加法器、寄存器、时钟是怎么一层层堆成计算机的;
- CPU 和 GPU 为什么走向两种完全不同的设计:一个追低延迟,一个追高吞吐。
1. 起点:沙子里有什么
沙子的主要成分之一是二氧化硅 SiO2。它不能直接拿来做芯片,但它提供了现代芯片最重要的元素: 硅。把二氧化硅还原、提纯、拉成单晶,再切成薄薄的晶圆,后面的电路才有地方生长。
硅之所以重要,不是因为它“天生会计算”,而是因为它刚好站在两个极端之间: 金属太容易导电,橡胶太不导电,它们都不方便做可控开关。硅是半导体,导电能力可以被杂质、电场和结构精细调节。 计算机需要的不是一根永远通电的线,而是一亿亿个听话的开关。
芯片的地基不是普通沙粒,而是经过提纯、拉晶、切片后的高纯单晶硅晶圆。
1.1 晶圆上怎么“长出”电路
晶圆本身只是一片很干净、很平整的硅。要让它变成芯片,还要反复做几类工艺: 覆一层材料、涂光刻胶、用掩膜曝光、显影、蚀刻、掺杂、再覆下一层。每一轮只做一小层, 最后几十上百层叠起来,才形成金属线、晶体管、缓存、计算单元。
光刻的直觉:用光和模板把图案投到晶圆表面,再通过显影、蚀刻、掺杂等步骤把图案变成真实结构。
2. 半导体:关键是“可控制”
纯硅每个原子最外层有 4 个电子,喜欢和周围硅原子形成稳定的共价键。这样一来,电子不太自由,纯硅本身并不是好导体。 但只要往硅里掺入极少量其他元素,情况就变了。
- 掺磷:磷比硅多一个价电子,多出来的电子容易流动,形成 N 型半导体。
- 掺硼:硼比硅少一个价电子,晶格里像多了一个“空位”,形成 P 型半导体。
这叫掺杂。掺杂不是把硅弄脏,而是有意给它一点“性格”:有的区域更愿意给出电子,有的区域更愿意接收电子。 把这些区域按特定结构排起来,电流就不再是随便流,而是可以被我们设计的规则控制。
掺杂的直觉:只换掉极少数硅原子,就能让局部区域偏向“多电子”或“多空位”,从而变得可设计、可控制。
“半导体”这个名字容易误导。它真正厉害的地方不是导电能力卡在中间,而是导电能力可以被改变。 可改变,才可控制;可控制,才可做开关;可做开关,才可做数字电路。
3. 二极管:先做出电流的单向阀
有了 P 型和 N 型半导体,第一件自然的事是把它们贴在一起。这条边界叫 PN 结。 PN 结很特别:它不是一根普通导线,而像一个电流单向阀。电压方向合适时,电子和空位被推向交界处, 电流容易通过;电压方向反过来时,交界处的“耗尽层”变宽,电流很难通过。
这就是二极管的核心:两个端子,只偏向让电流朝一个方向走。它已经能做整流、保护、简单逻辑, 但还不够成为计算机的核心开关。原因也很简单:二极管只有两个端子,电流能不能过主要取决于自己两端电压, 缺一个独立的“控制端”。
二极管的直觉:PN 结像单向阀,正向容易导通,反向大多截止。
4. 三极管:多一个控制端,电路才会“听话”
二极管能控制方向,但不能用一个独立信号去控制另一条电流。真正的跃迁来自三端器件。 早期电子时代常讲三极管(BJT),它有发射极、基极、集电极。直觉上: 基极一股很小的电流,可以控制集电极到发射极之间一股大得多的电流。
这件事非常关键。因为有了“控制端”,电路就能做两件事:一是放大(小信号控制大信号), 二是开关(基极没有信号就关,有足够信号就开)。数字计算主要吃第二个能力。
BJT 三极管的直觉:基极的小信号决定主通道的大电流能不能流。
传统教材里“二极管、三极管”常指 PN 结二极管和 BJT 三极管。现代 CPU/GPU 里的主角则是 MOSFET, 也是三端器件:源极、漏极、栅极。它不用基极电流控制,而是用栅极电压控制源漏之间是否导通。 所以本章接下来会把“三端可控开关”的直觉落到 MOSFET 上,因为真实数字芯片主要靠 CMOS MOSFET 搭出来。
5. MOSFET:现代芯片里的主力开关
芯片里最关键的积木是晶体管。早期电子学常讲三极管,现代数字芯片里更常见的是 MOSFET。 名字可以先放一边,核心直觉一样:用一个小信号,控制另一条电流通不通。
你可以把 MOSFET 想成一条水渠。源极和漏极之间本来不一定通,栅极像水闸的控制杆。 给栅极一个合适电压,下面就形成一条可通电的“沟道”;撤掉这个电压,沟道消失,电流被切断。 于是一个晶体管就有了两种稳定姿态:
| 栅极信号 | 源极到漏极 | 数字抽象 |
|---|---|---|
| 低电压 | 不导通 | 0 |
| 高电压 | 导通 | 1 |
真实电路比这复杂,但入门时先记住这一层:晶体管就是可以被电压控制的开关。
MOSFET 的入门直觉:栅极电压像闸门,决定源极到漏极之间是否形成通路。
6. 0 和 1:从电压到数字
计算机里的 0 和 1 并不是某种神秘符号,在电路底层通常就是两个电压范围。 低于某个范围,电路把它当作 0;高于某个范围,电路把它当作 1。中间留出一段灰区,是为了抗噪声: 真实电压会抖动,线路会受干扰,但只要还落在安全范围内,数字意义就不变。
为什么不用 0 到 9 十种电压来表示十进制?因为区分十档电压太容易被噪声打乱。 二进制只有两档,容错空间大,电路简单,可以堆得极深、跑得极快。 数字计算的强大,很大一部分来自“把模糊的连续电压,硬切成稳定的两种状态”。
二进制抗噪声:电压不是精确等于 0V 或某个固定高电压,而是落在“安全区间”里就算 0 或 1。
7. 逻辑门:开关组合成判断
一个晶体管只能控制通断,但多个晶体管连起来,就能做逻辑。 最基本的逻辑门有三类:NOT、AND、OR。
| 逻辑门 | 输入和输出关系 | 直觉 |
|---|---|---|
| NOT | 输入 0 输出 1,输入 1 输出 0 | 反过来 |
| AND | 两个输入都为 1 才输出 1 | 两个条件都满足 |
| OR | 任一输入为 1 就输出 1 | 有一个条件满足 |
逻辑门接收 0/1,输出也是 0/1。复杂判断都能拆成这些简单门的组合。
这一步很关键:晶体管本来只是物理开关,逻辑门让它第一次有了“判断”的味道。 只要能做判断,就能把判断继续组合成算术、存储、控制和程序。
7.1 二极管和三极管怎样拼出门电路
历史上真的存在过“二极管-三极管逻辑”(DTL)。它的思路可以这样理解: 二极管负责把多个输入先合并成一个逻辑条件,三极管负责把这个条件放大、反相、拉成干净的 0/1 输出。 二极管像几道单向阀,三极管像最后的电控闸门。
DTL 的直觉链路:二极管处理多个输入的方向和组合,三极管/晶体管把结果整理成稳定输出。现代芯片则主要用 CMOS 直接用 MOSFET 拼门。
7.2 现代芯片更常用 CMOS:用两个 MOSFET 造反相器
今天的 CPU/GPU 不会主要靠二极管和 BJT 三极管搭逻辑门,而是用 CMOS。最小的 CMOS 门是反相器: 上面一个 PMOS 负责把输出拉到高电压,下面一个 NMOS 负责把输出拉到低电压。输入为 0 时,上面的 PMOS 打开、下面的 NMOS 关闭, 输出被拉高;输入为 1 时正好相反,输出被拉低。于是它实现了 NOT。
CMOS 反相器把“可控开关”变成 NOT 门。NAND、NOR 等门也是把 PMOS/NMOS 网络按不同方式串并联。
逻辑门符号不必死背。先抓住含义:NOT 取反,AND 要全部满足,OR 只要一个满足。
8. 加法器:判断组合成算术
计算机里的加法也不是魔法。先看一位二进制加法:
| A | B | 本位结果 S | 进位 C |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
1 + 1 在二进制里写成 10,所以本位是 0,向高位进 1。
这张表可以用逻辑门实现:本位结果 S 是 XOR,进位 C 是 AND。把许多一位加法器串起来,就能加多位二进制数。 乘法也可以拆成“移位 + 多次加法”。于是从逻辑门出发,机器就长出了算术能力。
CPU 里的 ALU,也就是算术逻辑单元,本质上就是把这些加法、位运算、比较等电路组织起来。
当你在 C++ 里写 a + b 时,最后一定会落到这类硬件结构上。
加法器的关键不是复杂公式,而是把“一位的和”和“进位”都用逻辑门算出来,再把进位一级级传下去。
9. 存储和时钟:机器有了状态
只会算还不够。没有存储,机器每一步算完就忘,无法执行连续程序。 所以电路还需要“记住一位”的结构:锁存器、触发器、寄存器。
一个直觉是:把逻辑门的输出绕回输入,形成反馈,电路就可能稳定在 0 或 1 的某个状态。 再给它加上控制信号,它就能在指定时刻接收新值,平时保持旧值。这就是触发器和寄存器的基本思想。
如果所有电路都随时乱改状态,信号会互相追不上,结果很容易乱。时钟把时间切成一格一格: 第一个节拍取指令,第二个节拍译码,第三个节拍执行,后面再写回结果。 芯片不是一团电路自由发挥,而是一支按节拍行动的队伍。
有了逻辑门,机器会判断;有了加法器,机器会算数;有了寄存器和时钟,机器会记住并按步骤推进。 到这里,计算机最核心的骨架已经出现。
存储和时钟让“组合逻辑”变成“时序机器”:不只是算出结果,还能在正确节拍保存结果、推进下一步。
10. 这些零件怎么一步步拼成 CPU
到这里我们有了几块关键积木:逻辑门能判断,加法器能算数,触发器能记一位,时钟能让状态按节拍更新。 但 CPU 不是把这些零件随便堆在一起,而是把它们组织成几个明确模块:
| 底层电路 | 组合后的模块 | 它在 CPU 里负责什么 |
|---|---|---|
| 逻辑门 + 加法器 + 比较器 | ALU | 做加减、比较、位运算等真正的计算 |
| 很多触发器并排 | 寄存器组 | 临时放操作数和结果,离 ALU 最近 |
| 计数器 + 寄存器 | PC 程序计数器 | 记住下一条指令在内存的哪个地址 |
| 译码逻辑 | 控制单元 | 看懂指令,发出“读寄存器/让 ALU 加/写回”等控制信号 |
| 锁存器阵列 / SRAM / DRAM | 缓存和内存 | 存放程序指令和数据 |
CPU 不是一个更神秘的新东西,而是把“会算、会记、会按节拍行动”的电路组织成可执行指令的机器。
关键转折是指令。人类不再直接拨开关,而是把“要做什么”编码成一串 0/1,放进内存。 比如某条机器指令可以表示“把寄存器 R2 和 R3 里的数相加,结果写回 R1”。CPU 每个时钟周期附近反复做同一个循环:
- 取指:PC 指向内存地址,CPU 把那里的指令读进来。
- 译码:控制单元拆开这串 0/1,看出它是加法、访存、跳转,还是别的操作。
- 读数:从寄存器组或内存里取出需要的输入。
- 执行:ALU 做加法、比较等操作;如果是访存指令,就去读写内存;如果是跳转指令,就改 PC。
- 写回:把结果写回寄存器或内存,PC 指到下一条指令。
这就是“从电路到 CPU”的关键拼装:能算的 ALU、能暂存的寄存器、能找下一条指令的 PC、能发控制信号的译码器,再加上内存和时钟。
假设内存里有一条 ADD R1, R2, R3。CPU 先用 PC 找到它,把它取进指令寄存器;
控制单元译码出“这是加法”;寄存器组读出 R2 和 R3;ALU 把两个数相加;结果写回 R1;PC 再指向下一条指令。
这就是你写的高级代码最终会变成的底层节奏。
11. CPU:为通用程序而生
CPU 的任务很杂:运行操作系统、调度进程、处理文件、响应鼠标键盘、跑浏览器、编译代码、执行各种业务逻辑。 这些任务有大量分支和依赖,经常是“上一步结果决定下一步走哪条路”。
所以 CPU 的设计目标不是“把同一种小计算复制一万份”,而是把一条复杂指令流尽量快、尽量稳地跑完。 它会把很多晶体管花在这些地方:
- 复杂控制单元:取指、译码、调度、处理分支。
- 大缓存:尽量把马上要用的数据放在离核心很近的地方。
- 分支预测:提前猜 if-else 会走哪边,猜对就省时间。
- 乱序执行:当前指令在等数据时,先把不依赖它的其他指令做掉。
这些结构不直接做加法乘法,但能让少数几个强核心在复杂任务上跑得很快。 所以 CPU 像一个很强的通用指挥中心:人不多,但每个人装备精良、能处理复杂局面。
CPU 的复杂来自通用性:程序下一步可能跳到任何地方,数据可能在内存深处,所以它需要很多控制和缓存电路来服务少数强核心。
12. GPU:为海量并行而生
GPU 最早服务于图形渲染。屏幕上有成千上万个像素,每个像素都要做相似的计算: 光照、颜色、纹理、深度。它们之间大多互不依赖,非常适合同时算。
于是 GPU 走了和 CPU 相反的路线:少做复杂控制,少放大缓存,把更多面积塞进大量简单计算单元。 单个 GPU 核心没有 CPU 核心聪明,但数量极多,总体吞吐非常高。
CPU 把晶体管花在“少数强核 + 缓存 + 控制”;GPU 把晶体管花在“大量计算单元”。这不是谁高级谁低级,而是服务的任务不同。
后来 CUDA 等通用计算平台出现,程序员不必再把数据伪装成图像,可以直接让 GPU 做通用并行计算。 这就是 GPU 从“显卡”变成“深度学习算力底座”的关键转折。
12.1 GPU 的诀窍:一条指令,很多数据一起走
GPU 为了省控制电路,不会给每个小核心都配一套完整“指挥系统”。它常把一组线程绑在一起, 让它们执行同一条指令,只是处理不同的数据。这个思想常叫 SIMD / SIMT。 好处是控制电路省下来了,可以塞更多计算单元;坏处是很怕分支:如果同一组线程里有人要走 if 的左边、有人要走右边, 它们往往只能分批走,效率会掉。
GPU 的吞吐来自“齐步走”:同一批线程最好执行同一条指令,只处理不同数据。矩阵乘法正好符合这个形状。
13. 为什么 GPU 后来接住了神经网络
神经网络的核心计算,恰好是 GPU 最擅长的形状。比如第 3 章里的全连接层:
矩阵乘法里的很多位置可以并行计算:输出矩阵里的每个格子,基本都是“一行乘一列再加起来”。 这些乘加数量巨大、规则统一、分支很少,正好能喂给 GPU 的大量计算单元。
所以 CPU/GPU 的区别不只是“GPU 更快”这么简单。更准确地说: CPU 适合复杂、串行、分支多的通用程序;GPU 适合规则、批量、可并行的数值计算。 深度学习刚好属于后者,于是从 2012 年 AlexNet 开始,GPU 成了深度学习爆发的重要底座。
神经网络层里的 XW 不是“一步神秘运算”,而是一堆互不太依赖的点积。GPU 正是靠并行计算这些格子获得高吞吐。
小结:从物质到计算
- 沙子提供硅,高纯单晶硅晶圆提供芯片地基。
- 硅是半导体,关键在于导电能力能被掺杂和电场控制。
- 晶体管把“电压控制电流”变成稳定开关,再抽象成 0 和 1。
- 逻辑门让开关能判断,加法器让判断能算数,寄存器和时钟让机器能记住并按步骤推进。
- CPU 追求复杂通用任务的低延迟,GPU 追求海量相似任务的高吞吐。
- 神经网络大量使用矩阵乘法,刚好踩在 GPU 的强项上。
动手与思考
问题 1:为什么芯片喜欢用硅,而不是随便找一种导体?
导体永远容易导电,不好做可控开关。硅是半导体,导电能力可以通过掺杂、电场和结构控制;再加上硅资源丰富、氧化层稳定、工艺成熟,才适合大规模制造晶体管。
问题 2:一个晶体管为什么能表示 0/1?
因为它可以被控制在导通或不导通两种状态。电路把低电压范围解释成 0,高电压范围解释成 1。真实电压是连续的,但数字电路把它切成两个稳定区间。
问题 3:CPU 和 GPU 最大区别是什么?
CPU 把大量晶体管花在复杂控制、大缓存、分支预测和少数强核心上,适合复杂串行任务;GPU 把更多晶体管花在大量简单计算单元上,适合把同一种计算铺到海量数据上。
问题 4:为什么神经网络特别适合 GPU?
因为神经网络的核心是矩阵乘法和向量运算,它们包含大量规则、相似、互相独立的乘加。GPU 不擅长复杂判断,但特别擅长把这种小计算并行做完。
番外收束 · 从算法回到机器
到这里,第七部分的四块拼图也补齐了:你先有了机器学习全景图,再看过无监督/自监督、经典树模型, 最后把所有算法落回真实硬件——硅、晶体管、门电路、CPU 和 GPU。 这本书真正想串起来的,就是从一个神经元到大模型、再从大模型落回机器本身的整条链路。