第一次在《三体》里看到人列计算机的段落我整个人是坐直了的。秦始皇朝堂之外千万士兵按方阵站好黑白两色旗子此起彼伏冯·诺依曼用最朴素的语言讲解与门或门非门最后告诉那位帝王这是一台计算机。那场面就像把数字电路教科书里的门级网表用千万个活生生的士兵重新画了一遍。我做了十几年数字芯片相关的工作每天在仿真器里看波形、在版图里看标准单元乍看这个情节只觉得浪漫细想却觉得它极硬核人列计算机本质上就是用人的举旗/不举旗来模拟高电平/低电平用士兵的排布来实现逻辑门用统一口令来充当时钟信号。这个概念和今天每一颗手机SoC里的CMOS电路是同一套思维只是材料完全不同。这篇文章我会先拆解三体里的人列计算机怎么运转再把它和CMOS电路一层层对照起来。你看完就会发现所谓最宏大的未来计算想象其实可以浓缩成一句很朴素的话把足够多能执行布尔逻辑的开关组织起来计算就发生了。1. 三体人的千万CFU人列计算机到底是怎么转起来的1.1 书里那段名场面千万士兵当门电路在小说里冯·诺依曼向那位帝王提出的方案很直接每一位士兵都变成一个逻辑门。黑旗代表1白旗代表0。士兵不是随便站着的每个人都领到一条具体规则。比如某一排士兵接到命令只有当你看到左边和右边的旗子都是黑色时你才举起黑旗否则举白旗。这就是一个标准的与门。如果把命令改成只要看到至少一面黑旗你就举黑旗那就是或门。再改成看到黑旗你就举白旗看到白旗你就举黑旗那就是非门。这个设计最精妙的地方在于它没有引入任何超出布尔逻辑之外的东西。士兵不需要思考不需要判断对错只要机械地执行看旗、举旗这个动作。前一层士兵的输出旗语是后一层士兵的输入信号一层层排下去就能构成一个可计算的数据通路。三体里的冯·诺依曼甚至规划了完整的方案让百万千万级别的士兵组成阵列用统一的口令来同步每一步操作。立在阵列之外的人看到的是旗帜如海浪般翻滚实际上看到的是一台由生物零件组成的计算机在执行程序。很多读者看到这段都会把它当成纯粹的文学想象但从数字电路的角度看这个过程几乎可以直接映射到门级仿真里。唯一不同的只是仿真器里每个标准单元的延迟是纳秒级换成士兵后延迟是以人的反应时间为单位。它不是能不能工作的问题而是能工作得多慢的问题。1.2 把士兵抽象成逻辑门只需要三块积木为什么冯·诺依曼敢说士兵可以组成计算机因为数字世界有个很底层的事实任何一个你能想到的计算功能大到视频编解码、神经网络推理小到计算11都可以通过与、或、非这三种基本逻辑门组合出来。这是个经过理论验证的结论也是逻辑综合工具存在的基础。与门、或门、非门就像三块积木组合方式无限多能拼出的功能也就无限多。输入A输入BA与BA或B非A00001010111001011110这张表值得多看几秒。它看着简单却是所有CPU、GPU、存储芯片共同依赖的地基。三体里的人列计算机想算三体问题的近似解说到底也只是把这个求解过程化简成成千上万个逻辑门再让士兵们一层层把这些门跑完。小说里没有写复杂的机器指令也没写操作系统但冯·诺依曼提出的用门组成阵列这个方案在原则上和现代芯片没有任何区别。我经常觉得普通人看芯片总觉得它神秘是因为晶体管怎么工作这层物理细节挡住了视线。但如果把芯片抽象成一组堆积如山的与门、或门、非门一切瞬间变简单了。三体人列计算机恰好帮我们完成了这层抽象它把门电路画在了地面上让没有微电子背景的人也能直观理解逻辑到底是怎么一层层长成计算的。1.3 一套操作手册从方阵到指令流人列计算机要跑起来光有逻辑门还不够还需要一套组织规则。旗子举起来之后什么时候算数据稳定队伍里谁先动谁后动这需要一个统一的时间基准。三体里用的是传令兵和号角一轮口令传下去所有人听到指令后同时执行一次举旗或放旗的动作。这个同时在计算机里就是时钟周期。换句话说小说里的口令就是今天芯片里的时钟信号。一个时钟周期里组合逻辑完成一次运算结果被锁存到下一级的寄存器里下一个时钟周期运算继续往下推进。人列计算机虽然慢但它同样需要这个节拍器。如果没有统一口令前排士兵已经举了旗后排士兵还没看到数据就会错乱。这个问题在芯片里有一个专业名称叫时钟偏斜放在三体的场景里就是口令传到阵列边缘时比传到阵列中心晚了几秒钟。所以人列计算机不是把人堆在一起就能算它同样需要一整套指令同步、数据传递、结果汇聚的方案。小说里冯·诺依曼说三千万人组成一台计算机时那位帝王的第一反应是这有什么用。后面故事证明它确实能算只是慢。理解了这点我们再去看CMOS电路就会觉得纸面上那些密密麻麻的晶体管其实是三体方阵在硅片上的极速投影。2. 从喊口号到电平跳变CMOS在物理上怎么完成同一件事2.1 两个扮演士兵的角色NMOS与PMOS如果说人列计算机的士兵靠眼睛看旗子来决定动作那么CMOS电路里的士兵就是晶体管。CMOS的全称是互补金属氧化物半导体核心是两种互补的MOS管NMOS和PMOS。它们都像电压控制的开关但指令风格完全相反。NMOS的规则是栅极电压为高电平时导通为低电平时关断。你可以把它想成只听举旗命令的士兵听到高电平就接通听到低电平就一动不动。PMOS则完全相反栅极电压为低电平时导通为高电平时关断。两人刚好一对一个在高电平下工作一个在低电平下工作合在一起就是互补二字的由来。这种用电压控制通断的机制本质上和士兵听口令举旗没有区别。唯一不同的是尺度一个MOS管从导通切换到关断只需要几十皮秒而一个士兵从看到旗子到举起旗子至少需要半秒钟。差了多少个数量级大约十亿倍。这个差距决定了两者究竟是文学作品里的奇观还是人类信息社会的物理底座。2.2 反相器CMOS世界的最小编制CMOS电路里最基本的逻辑门是反相器也就是非门。它就两个管子一个PMOS放在上面一个NMOS放在下面。PMOS的源极接电源VDDNMOS的源极接地GND两个管子的栅极连在一起作为输入两个管子的漏极连在一起作为输出。当输入为高电平时NMOS导通输出被拉到地变成低电平同时PMOS截止切断了从VDD到输出的通路。当输入为低电平时角色互换PMOS导通把输出拉到高电平NMOS截止。整个过程中稳定状态下总有一只管子是关闭的所以VDD和GND之间没有直流通路静态电流趋近于零。这就是CMOS低功耗的根源也是它在过去几十年取代早期逻辑工艺的关键原因。我当年第一次在实验室里搭反相器的时候觉得这东西简单得不像话。但恰恰是这么简单的结构只要重复几十亿次就能构成一颗现代CPU。它就像人列计算机里的一个传令兵命令来了做出反应传出结果。单个个体毫无智能但无数个体按规则连接起来整体就涌现出复杂的计算能力。2.3 组合逻辑网用晶体管搭出与或非有了非门做底子CMOS里实现更复杂的门通常不是直接照抄与门逻辑而是先做与非门、或非门。原因在于CMOS的天然结构更适合让管子串联、并联然后通过底部下拉网络和顶部上拉网络的组合来完成逻辑。看一个2输入与非门下面两个NMOS串联接地上面两个PMOS并联接VDD。只有当两个输入都是高电平时两个NMOS才同时导通把输出拉低其他任何一种输入组合至少有一个PMOS导通输出保持高电平。这一串行为正好就是与非门的真值表。想要与门就在与非门后面再接一个反相器。或非门也同理只是把串并联关系反过来。这种上拉网络负责输出1下拉网络负责输出0的思路听着和秦军方阵的旗语组合非常像一队士兵负责在特定条件下举黑旗另一队负责在相反条件下举白旗两拨人永远不会同时举。放到芯片里就是PMOS网络和NMOS网络永远不会同时导通导致电源到地短路。所以每次看完三体那段再回来看CMOS标准单元库我都会有很强的既视感小说里是一个人根据多个旗号做判断芯片里是一组晶体管根据多个电压做判断它们背后是同一张真值表。3. 人列算加法 vs 芯片算加法一条加法的完整逻辑链路3.1 人列半加器举旗子、喊口令、进位光有逻辑门还不够得让它们干点看得见的事。最经典的是半加器它负责把两个二进制位加起来输出一个和以及一个进位。规则很简单0000111011110所以本位和为0、进位为1。输入A输入B和SUM进位CARRY0000011010101101用逻辑门的语言来说SUM等于A异或BCARRY等于A与B。在三体场景里实现它至少要安排两组士兵一组组成异或门负责算本位的和一组组成与门负责算进位。假设A和B两名士兵分别举着黑旗或白旗站在阵列前方后面的异或兵观察到黑黑就举白旗观察到一黑一白就举黑旗与兵只认一种情况只有看到两面黑旗才举黑旗。两个人合作就把一位二进制加法的结果算出来了。这个画面看起来有点滑稽但实际上所有CPU的ALU里每一位加法器干的都是同样的事情只是不再用人而用晶体管。小说里那个宏大的秦军处理器拆到最小单元居然就是这组举旗规则这让我每次重读都忍不住会心一笑。3.2 CMOS半加器从布尔式到晶体管级到了CMOS这边半加器用晶体管搭出来也相当直观。SUM的逻辑式是A·BA·B这是一个异或门CARRY的逻辑式是A·B这是一个与门。用标准CMOS工艺实现一个异或门需要大约10到12个晶体管再加一个与门和必要的缓冲半加器总共二十几个晶体管就能搞定。芯片版图里它占的面积可能比头发丝的截面还小得多。有趣的是现代处理器里很少只有半加器因为实际做加法还要考虑来自低位的进位所以用的是全加器。一个全加器有3个输入、2个输出逻辑复杂度比半加器高不少。但无论多复杂设计思路都是先写布尔表达式再用门电路实现最后落到晶体管布局。这个过程和人列计算里先把算法分解成逻辑门再分派给士兵是完全一致的。我见过一些没学过硬件的人想当然地以为计算芯片里有什么神秘力量其实没有。芯片就是无数个二十几个晶体管组成的基本单元再由这些单元组成加法器、乘法器、寄存器堆最后组成一个能跑程序的CPU。硅片上的所谓智能和秦军方阵里的智能一样都是靠海量简单规则叠加出来的。一个人不聪明但一千个人按规则传递旗语就能算出一个人算不出的东西。晶体管单个也不聪明几十亿个晶体管同步协作就足以支撑起你在手机上刷视频、玩游戏。3.3 链路背后的同一张真值表把两个场景放在一起看差别只在物理介质计算逻辑完全相同。对比项人列计算机CMOS电路0和1的表示白旗和黑旗低电平和高电平逻辑门士兵按规则举旗晶体管按电压导通/关断时钟同步统一口令/号角时钟信号加法器异或兵与兵二十几个晶体管单门延迟约0.5秒到1秒约几十皮秒数据传递人眼观察下一排导线上的电平传播这张表里的每一行都值得琢磨。三体人列计算机之所以震撼是因为它把计算这件我们习以为常的事重新去神秘化了原来所谓计算不过是一张又一张真值表按顺序被执行。CMOS电路之所以重要是因为它把真值表执行得足够快、足够便宜、足够省电才让数字文明成为现实。理解了这一点再去读三体那一段你会看到作者藏在想象力底下的逻辑功底。4. 为什么人列计算机走不远速度、错误率和能耗的三重围剿4.1 信号传播的时延账本如果只看原理人列计算机和CMOS电路都能算。但工程上有个朴素的问题算一次要多久一个受过训练的士兵看到旗语到完成举旗反应时间至少要0.2到0.5秒。如果一个逻辑门由多个士兵协同完成一次门延迟轻松到1秒。三千万人组成的阵列纵深可能有几公里旗语从阵列一端传到另一端即使不考虑人眼观察的遮挡和延迟光靠接力传递也需要很长时间。乐观估计人列计算机的时钟频率很难超过1赫兹也就是每秒只能执行一两轮逻辑运算。CMOS这边在成熟工艺下一个反相器的传播延迟大约在10到100皮秒这个量级先进工艺还能更快。换算下来现代CPU能够以3到5GHz的时钟频率运行每秒钟执行几十亿次指令。人列计算机和CMOS之间差了将近10个数量级。打个比方如果人列计算机是一台算一次加法需要好几分钟的机械计算器CMOS芯片就是一台每秒能算万亿次加法、还能装进口袋的超级机器。原理相同速度不同应用场景自然就天差地别。4.2 人不是可靠器件错误率的数量级差异除了慢人列计算机还有个更致命的问题人不可靠。再训练有素的士兵也有看错旗色、听错指令、举错旗子的时候。疲劳、情绪、环境干扰都会让错误率上升。假设每个士兵执行一次动作的错误率只有万分之一听起来不高但三千万人同步执行一次运算一次就有大约三千个错误发生。这样的系统基本不可能稳定运行。CMOS晶体管也有噪声和错误但电子器件的确定性远高于生物个体。一个工艺良好的芯片逻辑翻转的错误率可以做到极低极低以至于常规计算不需要反复校验只有在存储、通信、航天等特殊场景才会大范围引入ECC纠错和冗余设计。更关键的是芯片可以在出厂前通过测试筛选出不合格个体而三体没办法给士兵做芯片测试更没法保证每名士兵的阈值电压完全一致。从器件一致性的角度看碳基生物的可靠性远不如硅基器件。这一点其实特别值得科幻爱好者注意。很多作品里设想的人列机器、生物计算问题通常不在原理而在工程可靠性。单个逻辑门再完美也没用要组建千万级门电路必须保证每个门都在各种环境下稳定工作。CMOS工艺花了几十年解决的是这个工程问题而小说只是轻轻带过。4.3 能耗与散热三千万人怎么降温还有一个躲不开的问题是能量。一个人哪怕只是站着基础代谢功率也在80到100瓦左右。三千万人光是活着、站着、举旗帜总耗能就达到3吉瓦量级这相当于一座大型核电站的发电功率。小说里把它放在古代王朝的场景里光是喂饱这支部队就是灾难级的后勤难题。芯片也会发热但一颗典型CPU的功耗是几十瓦到一百多瓦性能却能轻松完成天量运算。高功耗芯片靠散热器、风扇、液冷甚至浸没式冷却就能压住温度但你要给三千万人设计一套散热系统恐怕只能让他们拉开距离结果信号传递又变慢了。更残酷的是人体为了维持生命绝大多数能量都消耗在基础代谢上真正用于思考和举旗的部分占比小得可怜。三千万人的食物热量绝大部分变成了散发到空气中的体热只有极小一部分转化成了有用的逻辑操作。4.4 并行度悖论人列舰队的真实算力也许有人会反驳三千万人不是可以并行计算吗确实如果每个士兵都能独立完成一个逻辑门三千万个逻辑门同时动作那也是一支庞大的并行部队。但芯片设计告诉我们一个残酷事实计算任务里有大量串行依赖。前一个门的结果没出来后一个门就不能动。无论你有多少并行资源一条关键路径上的延迟决定了单次任务的下界。抛开任务并行度不谈人列计算机要真正像CPU那样工作还得处理寄存器、指令译码、访存这些环节每一步都要等待上一级的输出。三千万人听上去很多真正分配到一条数据通路上每一级的可用兵力其实有限。这就像你雇了一万人搬砖但只有一个工位大部分人只能在旁边等着。现代芯片解决这个问题的办法是流水线、超标量、乱序执行以及把不同任务分配到不同核心上。但这一切都建立在极快、极可靠的时钟同步上而人列计算机连同时听到口令都做不到更别说复杂的指令调度了。5. 工程师视角的三体后遗症从人列到CMOS的五个共通设计原则5.1 逻辑层级只有反复嵌套才会强大门电路只是第一层抽象。人列计算里单个士兵只能做一个动作谈不上任何智能。冯·诺依曼之所以能把它变成计算机靠的是把士兵组织成门再把门组织成功能模块再把功能模块组织成完整的数据通路。芯片设计同样如此从晶体管到标准单元从标准单元到IP核从IP核到SoC一层层嵌套上去才有了今天复杂的计算系统。层次化设计是所有大规模数字系统的基本功也是三体那段故事情节在方法论层面最真实的地方。我平时看芯片设计工具跑综合经常要面对几百万个标准单元的网表。刚开始会觉得脑子要炸但一旦养成把电路看成黑盒层级的习惯再庞大的设计也能理出条理。三体人列计算机虽然原始但它示范的正是这种从门到系统的构建思路。5.2 扇出与驱动一个输出能带几个兵芯片里一个逻辑门的输出往往要连接到好几个逻辑门的输入这叫扇出。扇出太大输出的驱动能力不够信号上升下降变慢时序就会出问题。解决方法是插入缓冲器也就是一个驱动能力更强的门把信号放大后再分发给后面的负载。这个工程细节在三体人列场景里同样存在。一个士兵举着旗子后面能有多少人同时看清并作出反应如果他的旗子要传给一百个人站在远处的人八成看不清楚。解决办法只能是多加几排传令兵把旗语一级级放大传递。这不就是芯片里的buffer tree吗每次看到有人觉得科幻和工程没有关系我都会拿这个例子反驳。好的科幻设定往往在无意中踩中了真实的工程难题。5.3 时钟与同步口令就是时钟信号现代同步数字电路里所有寄存器靠同一个时钟信号或者经过合理设计的时钟树来同步。为了让芯片跑到更高频率后端工程师要像对待精密仪器一样调整时钟树平衡各处的时钟延迟让信号同时到达避免建立时间或保持时间违例。回到人列计算机统一口令就是时钟。但真实世界中人不可能真正同时听到口令传令兵到阵列中心的距离和到边缘的距离不一样听到口令的时间也不一样。如果某个士兵慢了一拍他的输出就会和旁边的数据错位整条流水线立刻崩溃。这个难题放在芯片里叫时钟偏斜放在小说里就是号角声传遍全军需要时间。三体里没有细写这个问题但任何一个硬件工程师看到千万士兵听口令这个设定都会下意识替作者捏把汗。5.4 冗余与纠错三体人没有ECC芯片有人列计算机的错误率这么高如果非要让它可靠运行就必须引入纠错机制。可以安排多个士兵同时算同一个逻辑门少数服从多数这就是三模冗余的思路可以定期检查旗语结果是否与预期一致这就是奇偶校验和CRC的前身还可以在关键路径上安排替补传令兵准备随时纠正错误。现代芯片把这些思想变成了实实在在的硬件。存储芯片里有ECC内存高速接口里有检错重传宇宙探测器的FPGA里经常用三模冗余对抗单粒子翻转。所有这些东西核心思想都是同一个用多余的信息或器件换来整体系统的可靠性。三体人列计算机如果真有工程实现那它一定也是一个堆满冗余校验的庞然大物。5.5 工艺演进从人列到晶体管列再到什么聊到最后我想说点更远的。CMOS工艺在摩尔定律的驱动下狂奔了几十年如今已经逼近物理极限。3纳米、2纳米、1纳米每一个数字背后都是极其艰难的制造挑战。很多人开始把目光投向量子计算、光计算、忆阻器、DNA计算。有意思的是这些计算范式里很多依然保留着逻辑门和状态的概念只是把承载0和1的物理实体换成了量子比特、光子、分子。也就是说从三体的人列计算机到今天的CMOS电路到未来的新型计算底层逻辑依然是一套被反复验证的布尔代数。材料会变速度会变可靠性和能耗会变但用海量开关做逻辑运算这层设计哲学基本不会变。如果你理解了这点再回看三体那段宏大场景它就不再只是一个脑洞而是一份难得的思想实验把人换成任何能执行逻辑操作的物理载体计算就会存在。我自己在实际工作中经常用三体这段来给新人讲什么是逻辑门。每次讲完看到对方眼睛一亮我就知道这个来自科幻小说的类比比任何教科书里的抽象定义都更能帮助人建立直觉。有一天如果你在芯片社区里看到有人拿秦军比CMOS别觉得夸张这可能就是最形象的入门课。
