第 29 章 · 番外

从沙子到 CPU/GPU

你已经在这本书里见过很多矩阵乘法、梯度、Transformer 和大模型。但所有这些东西最后都要落到一块真实芯片上, 变成电流的通断、加法器的进位、寄存器的一拍一拍更新。 这一章不讲大模型怎么训练,只补一条更底层的链路:一粒沙子里的硅,到底怎么一路变成 CPU 和 GPU?

这一章和《从沙子到 Mythos》的关系

《从沙子到 Mythos》是视觉化时间线,负责把整段历史串成一条路。 本章是普通正文版,只拆硬件这半段:沙子、硅、半导体、二极管、三极管、逻辑门、加法器、存储、时钟、CPU、GPU。 后面的神经网络、大模型工程仍然回到第 1 章、第 21 章等主线章节里看。

读完这一章,你会明白

  • 为什么偏偏是这种材料撑起了现代芯片;
  • 半导体的关键不是“半导”,而是能被控制;
  • 二极管为什么像电流单向阀,三极管为什么多一个“控制端”后就能做开关;
  • 晶体管为什么可以看成一个由电信号控制的开关;
  • 二极管网络、三极管反相器、NAND/NOR 门是怎么接起来的;
  • 0/1、逻辑门、加法器、寄存器、时钟是怎么一层层堆成计算机的;
  • CPU 和 GPU 为什么走向两种完全不同的设计:一个追低延迟,一个追高吞吐。

1. 起点:沙子里有什么

沙子的主要成分之一是二氧化硅 SiO2。它不能直接拿来做芯片,但它提供了现代芯片最重要的元素: 。把二氧化硅还原、提纯、拉成单晶,再切成薄薄的晶圆,后面的电路才有地方生长。

硅之所以重要,不是因为它“天生会计算”,而是因为它刚好站在两个极端之间: 金属太容易导电,橡胶太不导电,它们都不方便做可控开关。硅是半导体,导电能力可以被杂质、电场和结构精细调节。 计算机需要的不是一根永远通电的线,而是一亿亿个听话的开关。

沙子 SiO₂ 很多 提纯硅 杂质极少 单晶硅棒 原子排列整齐 晶圆 芯片地基 不是沙子直接变芯片,而是从沙子中得到高纯度、规则排列、可加工的硅晶圆

芯片的地基不是普通沙粒,而是经过提纯、拉晶、切片后的高纯单晶硅晶圆。

1.1 晶圆上怎么“长出”电路

晶圆本身只是一片很干净、很平整的硅。要让它变成芯片,还要反复做几类工艺: 覆一层材料、涂光刻胶、用掩膜曝光、显影、蚀刻、掺杂、再覆下一层。每一轮只做一小层, 最后几十上百层叠起来,才形成金属线、晶体管、缓存、计算单元。

1. 涂胶 硅片上盖一层光刻胶 2. 曝光 掩膜像模板,只让部分区域见光 3. 显影/蚀刻 露出的地方被洗掉或刻掉 4. 叠很多层 晶体管和金属连线一层层堆起来 光刻不是“画一张图”就完事,而是把极小的图案一层层转移到晶圆上

光刻的直觉:用光和模板把图案投到晶圆表面,再通过显影、蚀刻、掺杂等步骤把图案变成真实结构。

2. 半导体:关键是“可控制”

纯硅每个原子最外层有 4 个电子,喜欢和周围硅原子形成稳定的共价键。这样一来,电子不太自由,纯硅本身并不是好导体。 但只要往硅里掺入极少量其他元素,情况就变了。

这叫掺杂。掺杂不是把硅弄脏,而是有意给它一点“性格”:有的区域更愿意给出电子,有的区域更愿意接收电子。 把这些区域按特定结构排起来,电流就不再是随便流,而是可以被我们设计的规则控制。

纯硅 SiSiSi SiSiSi SiSiSi 电子被共价键“绑住”,不太自由 N 型:多一个电子 P e 磷多出一个电子,更容易导电 P 型:多一个空位 B 硼少一个电子,像留下一个“空位”

掺杂的直觉:只换掉极少数硅原子,就能让局部区域偏向“多电子”或“多空位”,从而变得可设计、可控制。

半导体不是“导一半电”

“半导体”这个名字容易误导。它真正厉害的地方不是导电能力卡在中间,而是导电能力可以被改变。 可改变,才可控制;可控制,才可做开关;可做开关,才可做数字电路。

3. 二极管:先做出电流的单向阀

有了 P 型和 N 型半导体,第一件自然的事是把它们贴在一起。这条边界叫 PN 结。 PN 结很特别:它不是一根普通导线,而像一个电流单向阀。电压方向合适时,电子和空位被推向交界处, 电流容易通过;电压方向反过来时,交界处的“耗尽层”变宽,电流很难通过。

这就是二极管的核心:两个端子,只偏向让电流朝一个方向走。它已经能做整流、保护、简单逻辑, 但还不够成为计算机的核心开关。原因也很简单:二极管只有两个端子,电流能不能过主要取决于自己两端电压, 缺一个独立的“控制端”

正向偏置:容易导通 反向偏置:很难通过 P N 耗尽层较窄 电流能过 P N 耗尽层变宽 电流被挡住 PN 结让“方向”有了意义:同一块半导体结构,正着推和反着推的结果完全不同

二极管的直觉:PN 结像单向阀,正向容易导通,反向大多截止。

4. 三极管:多一个控制端,电路才会“听话”

二极管能控制方向,但不能用一个独立信号去控制另一条电流。真正的跃迁来自三端器件。 早期电子时代常讲三极管(BJT),它有发射极、基极、集电极。直觉上: 基极一股很小的电流,可以控制集电极到发射极之间一股大得多的电流。

这件事非常关键。因为有了“控制端”,电路就能做两件事:一是放大(小信号控制大信号), 二是开关(基极没有信号就关,有足够信号就开)。数字计算主要吃第二个能力。

三极管:用小信号控制大电流 N P N 集电极 C 基极 B 发射极 E 大电流 小基极电流 控制 三极管比二极管多出的不是“又一个脚”这么简单,而是多了一个能控制电流通断的入口

BJT 三极管的直觉:基极的小信号决定主通道的大电流能不能流。

那 MOSFET 和三极管是什么关系?

传统教材里“二极管、三极管”常指 PN 结二极管和 BJT 三极管。现代 CPU/GPU 里的主角则是 MOSFET, 也是三端器件:源极、漏极、栅极。它不用基极电流控制,而是用栅极电压控制源漏之间是否导通。 所以本章接下来会把“三端可控开关”的直觉落到 MOSFET 上,因为真实数字芯片主要靠 CMOS MOSFET 搭出来。

5. MOSFET:现代芯片里的主力开关

芯片里最关键的积木是晶体管。早期电子学常讲三极管,现代数字芯片里更常见的是 MOSFET。 名字可以先放一边,核心直觉一样:用一个小信号,控制另一条电流通不通。

你可以把 MOSFET 想成一条水渠。源极和漏极之间本来不一定通,栅极像水闸的控制杆。 给栅极一个合适电压,下面就形成一条可通电的“沟道”;撤掉这个电压,沟道消失,电流被切断。 于是一个晶体管就有了两种稳定姿态:

栅极信号源极到漏极数字抽象
低电压不导通0
高电压导通1

真实电路比这复杂,但入门时先记住这一层:晶体管就是可以被电压控制的开关。

源极 漏极 栅极 栅极没给足电压:沟道断开,不导通 源极 漏极 栅极 栅极给足电压:形成沟道,电流可以通过

MOSFET 的入门直觉:栅极电压像闸门,决定源极到漏极之间是否形成通路。

6. 0 和 1:从电压到数字

计算机里的 0 和 1 并不是某种神秘符号,在电路底层通常就是两个电压范围。 低于某个范围,电路把它当作 0;高于某个范围,电路把它当作 1。中间留出一段灰区,是为了抗噪声: 真实电压会抖动,线路会受干扰,但只要还落在安全范围内,数字意义就不变。

为什么不用 0 到 9 十种电压来表示十进制?因为区分十档电压太容易被噪声打乱。 二进制只有两档,容错空间大,电路简单,可以堆得极深、跑得极快。 数字计算的强大,很大一部分来自“把模糊的连续电压,硬切成稳定的两种状态”。

电压 安全的 0 灰区 安全的 1 低阈值 高阈值 真实电压会抖动,但只要还在安全区,数字含义就不会变

二进制抗噪声:电压不是精确等于 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 输出。 二极管像几道单向阀,三极管像最后的电控闸门。

从器件到门:二极管合并输入,三极管整理输出 二极管网络 A B 输入先经过二极管“汇合” 三极管/晶体管级 开关 负责放大、反相、拉成干净输出 输出 0 或 1 给下一级门继续使用 门电路不是抽象表格凭空出现,而是由“单向阀 + 可控开关 + 电阻/电源”这些器件接出来的

DTL 的直觉链路:二极管处理多个输入的方向和组合,三极管/晶体管把结果整理成稳定输出。现代芯片则主要用 CMOS 直接用 MOSFET 拼门。

7.2 现代芯片更常用 CMOS:用两个 MOSFET 造反相器

今天的 CPU/GPU 不会主要靠二极管和 BJT 三极管搭逻辑门,而是用 CMOS。最小的 CMOS 门是反相器: 上面一个 PMOS 负责把输出拉到高电压,下面一个 NMOS 负责把输出拉到低电压。输入为 0 时,上面的 PMOS 打开、下面的 NMOS 关闭, 输出被拉高;输入为 1 时正好相反,输出被拉低。于是它实现了 NOT。

CMOS 反相器:现代数字电路的最小门之一 输入 0 → 输出 1 Vdd PMOS 开 NMOS 关 输出高 输入 0 输入 1 → 输出 0 Vdd PMOS 关 NMOS 开 输出低 输入 1 NOT 门就是这样来的:一个输入信号,控制上下两条通路谁打开,输出自然变成相反值

CMOS 反相器把“可控开关”变成 NOT 门。NAND、NOR 等门也是把 PMOS/NMOS 网络按不同方式串并联。

NOT 取反:0→1,1→0 AND 全都满足才输出 1 OR 有一个满足就输出 1 门电路像电路里的“语法”:每个门都很简单,但组合起来可以表达任意复杂判断

逻辑门符号不必死背。先抓住含义:NOT 取反,AND 要全部满足,OR 只要一个满足。

8. 加法器:判断组合成算术

计算机里的加法也不是魔法。先看一位二进制加法:

AB本位结果 S进位 C
0000
0110
1010
1101

1 + 1 在二进制里写成 10,所以本位是 0,向高位进 1。

这张表可以用逻辑门实现:本位结果 S 是 XOR,进位 C 是 AND。把许多一位加法器串起来,就能加多位二进制数。 乘法也可以拆成“移位 + 多次加法”。于是从逻辑门出发,机器就长出了算术能力。

CPU 里的 ALU,也就是算术逻辑单元,本质上就是把这些加法、位运算、比较等电路组织起来。 当你在 C++ 里写 a + b 时,最后一定会落到这类硬件结构上。

半加器:一位加法 A B XOR AND 本位 S 进位 C S=A XOR B, C=A AND B 串起来:多位加法 第 0 位 第 1 位 第 2 位 进位 进位 低位算出的进位,交给高位继续加

加法器的关键不是复杂公式,而是把“一位的和”和“进位”都用逻辑门算出来,再把进位一级级传下去。

9. 存储和时钟:机器有了状态

只会算还不够。没有存储,机器每一步算完就忘,无法执行连续程序。 所以电路还需要“记住一位”的结构:锁存器、触发器、寄存器。

一个直觉是:把逻辑门的输出绕回输入,形成反馈,电路就可能稳定在 0 或 1 的某个状态。 再给它加上控制信号,它就能在指定时刻接收新值,平时保持旧值。这就是触发器和寄存器的基本思想。

时钟像全芯片的节拍器

如果所有电路都随时乱改状态,信号会互相追不上,结果很容易乱。时钟把时间切成一格一格: 第一个节拍取指令,第二个节拍译码,第三个节拍执行,后面再写回结果。 芯片不是一团电路自由发挥,而是一支按节拍行动的队伍。

有了逻辑门,机器会判断;有了加法器,机器会算数;有了寄存器和时钟,机器会记住并按步骤推进。 到这里,计算机最核心的骨架已经出现。

反馈让电路能记住 NOR NOR 输出绕回输入,状态就能保持 时钟决定什么时候更新 D 触发器 D CLK Q 只在边沿那一刻采样 取指 译码 执行 写回 CPU 指令流也是按时钟一步步推进

存储和时钟让“组合逻辑”变成“时序机器”:不只是算出结果,还能在正确节拍保存结果、推进下一步。

10. 这些零件怎么一步步拼成 CPU

到这里我们有了几块关键积木:逻辑门能判断,加法器能算数,触发器能记一位,时钟能让状态按节拍更新。 但 CPU 不是把这些零件随便堆在一起,而是把它们组织成几个明确模块:

底层电路组合后的模块它在 CPU 里负责什么
逻辑门 + 加法器 + 比较器ALU做加减、比较、位运算等真正的计算
很多触发器并排寄存器组临时放操作数和结果,离 ALU 最近
计数器 + 寄存器PC 程序计数器记住下一条指令在内存的哪个地址
译码逻辑控制单元看懂指令,发出“读寄存器/让 ALU 加/写回”等控制信号
锁存器阵列 / SRAM / DRAM缓存和内存存放程序指令和数据

CPU 不是一个更神秘的新东西,而是把“会算、会记、会按节拍行动”的电路组织成可执行指令的机器。

关键转折是指令。人类不再直接拨开关,而是把“要做什么”编码成一串 0/1,放进内存。 比如某条机器指令可以表示“把寄存器 R2 和 R3 里的数相加,结果写回 R1”。CPU 每个时钟周期附近反复做同一个循环:

  1. 取指:PC 指向内存地址,CPU 把那里的指令读进来。
  2. 译码:控制单元拆开这串 0/1,看出它是加法、访存、跳转,还是别的操作。
  3. 读数:从寄存器组或内存里取出需要的输入。
  4. 执行:ALU 做加法、比较等操作;如果是访存指令,就去读写内存;如果是跳转指令,就改 PC。
  5. 写回:把结果写回寄存器或内存,PC 指到下一条指令。
最小 CPU 的骨架:取指 → 译码 → 执行 → 写回 内存 指令 0 指令 1 数据 PC 下一条地址 指令寄存器 刚取来的指令 控制单元 译码并发信号 寄存器组 R2 R3 ALU 加 / 减 / 比较 / 与或非 写回 结果 → R1 或写回内存 取指 控制信号 写回寄存器 PC 给地址 程序 = 内存里的一串指令;CPU = 按时钟不断取出一条、看懂一条、执行一条的机器

这就是“从电路到 CPU”的关键拼装:能算的 ALU、能暂存的寄存器、能找下一条指令的 PC、能发控制信号的译码器,再加上内存和时钟。

用一句伪机器指令串起来

假设内存里有一条 ADD R1, R2, R3。CPU 先用 PC 找到它,把它取进指令寄存器; 控制单元译码出“这是加法”;寄存器组读出 R2 和 R3;ALU 把两个数相加;结果写回 R1;PC 再指向下一条指令。 这就是你写的高级代码最终会变成的底层节奏。

11. CPU:为通用程序而生

CPU 的任务很杂:运行操作系统、调度进程、处理文件、响应鼠标键盘、跑浏览器、编译代码、执行各种业务逻辑。 这些任务有大量分支和依赖,经常是“上一步结果决定下一步走哪条路”。

所以 CPU 的设计目标不是“把同一种小计算复制一万份”,而是把一条复杂指令流尽量快、尽量稳地跑完。 它会把很多晶体管花在这些地方:

这些结构不直接做加法乘法,但能让少数几个强核心在复杂任务上跑得很快。 所以 CPU 像一个很强的通用指挥中心:人不多,但每个人装备精良、能处理复杂局面。

CPU 要把一条复杂指令流尽量跑快 取指 下一条在哪 译码 这条要干嘛 调度 谁先执行 执行单元 ALU / FPU / load-store 分支预测 乱序执行 L1 / L2 / L3 缓存 寄存器 CPU 的大量面积不是直接“算”,而是在猜路、排队、搬数据、避免等待

CPU 的复杂来自通用性:程序下一步可能跳到任何地方,数据可能在内存深处,所以它需要很多控制和缓存电路来服务少数强核心。

12. GPU:为海量并行而生

GPU 最早服务于图形渲染。屏幕上有成千上万个像素,每个像素都要做相似的计算: 光照、颜色、纹理、深度。它们之间大多互不依赖,非常适合同时算。

于是 GPU 走了和 CPU 相反的路线:少做复杂控制,少放大缓存,把更多面积塞进大量简单计算单元。 单个 GPU 核心没有 CPU 核心聪明,但数量极多,总体吞吐非常高。

CPU 强核 强核 大缓存 复杂控制 擅长复杂分支、低延迟响应 GPU 大量简单计算单元 擅长同一操作铺到海量数据上

CPU 把晶体管花在“少数强核 + 缓存 + 控制”;GPU 把晶体管花在“大量计算单元”。这不是谁高级谁低级,而是服务的任务不同。

后来 CUDA 等通用计算平台出现,程序员不必再把数据伪装成图像,可以直接让 GPU 做通用并行计算。 这就是 GPU 从“显卡”变成“深度学习算力底座”的关键转折。

12.1 GPU 的诀窍:一条指令,很多数据一起走

GPU 为了省控制电路,不会给每个小核心都配一套完整“指挥系统”。它常把一组线程绑在一起, 让它们执行同一条指令,只是处理不同的数据。这个思想常叫 SIMD / SIMT。 好处是控制电路省下来了,可以塞更多计算单元;坏处是很怕分支:如果同一组线程里有人要走 if 的左边、有人要走右边, 它们往往只能分批走,效率会掉。

GPU 喜欢这样的任务:同一条指令,铺到很多数据上 同一条指令 x = x × 2 + 1 d₀d₁d₂d₃d₄d₅ 每个小格处理不同数据,但执行同一种操作 矩阵乘法 / 图像像素 / 向量加法 适合:大家路线一样 大量 if-else / 指针跳转 不适合:大家路线不同

GPU 的吞吐来自“齐步走”:同一批线程最好执行同一条指令,只处理不同数据。矩阵乘法正好符合这个形状。

13. 为什么 GPU 后来接住了神经网络

神经网络的核心计算,恰好是 GPU 最擅长的形状。比如第 3 章里的全连接层:

H = XW + b 一批输入 X 乘上一整块权重 W,得到一批输出 H

矩阵乘法里的很多位置可以并行计算:输出矩阵里的每个格子,基本都是“一行乘一列再加起来”。 这些乘加数量巨大、规则统一、分支很少,正好能喂给 GPU 的大量计算单元。

所以 CPU/GPU 的区别不只是“GPU 更快”这么简单。更准确地说: CPU 适合复杂、串行、分支多的通用程序;GPU 适合规则、批量、可并行的数值计算。 深度学习刚好属于后者,于是从 2012 年 AlexNet 开始,GPU 成了深度学习爆发的重要底座。

矩阵乘法为什么能喂饱 GPU 输入 X × 权重 W = 输出 H 一个输出格子 = X 的一行 · W 的一列 格子 1 格子 2 格子 3 格子 4 格子 5 ... 输出矩阵有很多格子,每个格子都能分配给不同线程/线程块并行算

神经网络层里的 XW 不是“一步神秘运算”,而是一堆互不太依赖的点积。GPU 正是靠并行计算这些格子获得高吞吐。

小结:从物质到计算

  • 沙子提供硅,高纯单晶硅晶圆提供芯片地基。
  • 硅是半导体,关键在于导电能力能被掺杂和电场控制。
  • 晶体管把“电压控制电流”变成稳定开关,再抽象成 0 和 1。
  • 逻辑门让开关能判断,加法器让判断能算数,寄存器和时钟让机器能记住并按步骤推进。
  • CPU 追求复杂通用任务的低延迟,GPU 追求海量相似任务的高吞吐。
  • 神经网络大量使用矩阵乘法,刚好踩在 GPU 的强项上。

动手与思考

问题 1:为什么芯片喜欢用硅,而不是随便找一种导体?

导体永远容易导电,不好做可控开关。硅是半导体,导电能力可以通过掺杂、电场和结构控制;再加上硅资源丰富、氧化层稳定、工艺成熟,才适合大规模制造晶体管。

问题 2:一个晶体管为什么能表示 0/1?

因为它可以被控制在导通或不导通两种状态。电路把低电压范围解释成 0,高电压范围解释成 1。真实电压是连续的,但数字电路把它切成两个稳定区间。

问题 3:CPU 和 GPU 最大区别是什么?

CPU 把大量晶体管花在复杂控制、大缓存、分支预测和少数强核心上,适合复杂串行任务;GPU 把更多晶体管花在大量简单计算单元上,适合把同一种计算铺到海量数据上。

问题 4:为什么神经网络特别适合 GPU?

因为神经网络的核心是矩阵乘法和向量运算,它们包含大量规则、相似、互相独立的乘加。GPU 不擅长复杂判断,但特别擅长把这种小计算并行做完。

番外收束 · 从算法回到机器

到这里,第七部分的四块拼图也补齐了:你先有了机器学习全景图,再看过无监督/自监督、经典树模型, 最后把所有算法落回真实硬件——硅、晶体管、门电路、CPU 和 GPU。 这本书真正想串起来的,就是从一个神经元到大模型、再从大模型落回机器本身的整条链路。

返回目录 / 重读某章