计算机基础(一):CPU 与计算核心

理解数据单位(位与字节)、CPU 架构、五级流水线、缓存层级、分支预测、乱序执行、多核与 SMT、Intel vs AMD 差异,以及如何选购合适的处理器。

为什么 100 Mbps 宽带下载速度只有大约 12 MB/s?为什么标称“1 TB”的硬盘在 Windows 里只显示 931 GB?为什么 32 位系统最多只能用到约 3.2 GB 内存?当 CPU 执行你的代码时,每个时钟周期里究竟发生了什么?

计算机基础(一):CPU 与计算核心 — 章节概览图

这是 计算机基础系列 的第一篇。我们将从 bit 和 byte 出发,深入 CPU 内部:流水线、缓存、分支预测、乱序执行、多核与 SMT(同步多线程)。读完本文后,你应该能看懂 CPU 规格表——甚至性能分析报告(perf profile)——并清楚每个数字背后的实际意义。


系列导航#

计算机基础(共 6 篇):

  1. CPU 与计算核心 —— 你正在阅读
  2. 内存与缓存层级
  3. 存储系统(HDD、SSD、NVMe、RAID)
  4. 主板、显卡与扩展总线
  5. 网络、电源与散热
  6. 综合实战:把所有部件串起来

三个真实世界的疑问#

疑问 1 —— 带宽谜题: 运营商给你“100 Mbps”宽带,但 Chrome 下载管理器峰值只有约 12 MB/s。是不是被坑了?

疑问 2 —— 消失的 69 GB。 你买了一块 1 TB 硬盘,Windows 却只认出 931 GB。硬盘有问题?

疑问 3 —— 帧率反常: 朋友的 14 核 i5-13600K 跑 CS2 能到 ~450 FPS,而你那颗更“豪华”的 16 核 R9 7950X 却只有 ~420 FPS。核心更多,帧率反而更低——为什么?

这三个问题的答案,都在这篇文章里。

第一部分 —— 数据单位:计算机世界的度量衡#

位与字节#

位(bit) 是最基本的二进制单位,非 0 即 1,就像一个开关:关或开。8 个这样的开关组合在一起,可以表示 $2^8 = 256$ 种不同状态,恰好够编码最初的 ASCII 字符集(字母、数字、标点)。因此,字节(byte) 被定义为 8 位。

“Mbps vs MB/s”的陷阱在于:运营商按 每秒多少比特(Mbps) 卖带宽,而浏览器显示的是 每秒多少字节(MB/s)。换算很简单:除以 8。

你看到的实际含义
100 Mbps每秒 1 亿个 比特
12.5 MB/s(理论最大值)每秒 1250 万个 字节
10–11 MB/s(典型实际值)扣除 TCP 开销和网络拥塞后的结果

所以,“100M”宽带确实只能跑出约 12 MB/s——没人骗你,只是单位不同。

与 1000 的差异从何而来?#

计算机天生以 2 的幂计数,而最接近 1000 的 2 的幂是 $2^{10} = 1024$ 。因此,操作系统内部认为 1 KB = 1024 B,1 MB = 1024 KB,依此类推。但硬盘厂商采用国际单位制(SI),其中 1 KB = 1000 B。正是这一差异,导致“1 TB”硬盘在系统中只显示为 931 GB。

单位(二进制,操作系统)字节数单位(十进制,厂商)字节数
1 KiB1,0241 KB1,000
1 MiB1,048,5761 MB1,000,000
1 GiB1,073,741,8241 GB1,000,000,000
1 TiB1,099,511,627,7761 TB1,000,000,000,000

快速估算:实际容量 ≈ 标称容量 × 0.931

标称容量实际可用表观损失
256 GB238 GiB7.0%
1 TB931 GiB6.9%
2 TB1,863 GiB6.9%
4 TB3,726 GiB6.9%

内存(RAM)不会“缩水”,因为内存模块从设计之初就按二进制单位制造:一根 8 GB 内存条就是 $8 \times 2^{30}$ 字节,与系统计算方式完全一致。

第二部分 —— 深入 CPU 核心#

CPU 到底在干什么#

CPU 的任务说起来简单,做起来极难:不断取指、解码、执行、写回结果,每秒数十亿次。流水线、缓存、分支预测等一切复杂机制,都只为让这个循环跑得更快,同时不改变程序语义。

现代 CPU 核心包含四类硬件:

  • 前端(控制):取指、解码、分支预测。
  • 计算单元:整数 ALU、浮点/SIMD 单元、Load/Store 单元。
  • 寄存器文件:极小但极快的暂存区(x86-64 有 16 个通用寄存器,外加 AVX-512 向量寄存器)。
  • 缓存:L1 指令 + L1 数据(每核独享)、L2(每核独享)、L3(多核共享)。

前端“准备”工作,计算单元“干活”,寄存器文件存放操作数,缓存则确保数据能及时喂饱整个流水线。

图 1. CPU 核心结构:前端、计算单元、寄存器、缓存层级

五级流水线#

经典教学模型将流水线分为五阶段:

  1. IF —— 取指令(从 L1I 读取)
  2. ID —— 解码(识别指令,读取寄存器操作数)
  3. EX —— 执行(ALU 运算)
  4. MEM —— 内存访问(加载/存储)
  5. WB —— 写回(结果写入寄存器)

若无重叠,5 条指令需 25 周期;启用流水线后,经过 4 周期“预热”,每周期完成一条指令——理想 IPC(每周期指令数)为 1.0

图 2. 五条指令在 9 个周期内通过流水线并行完成,而非串行执行的 25 个周期

现代 x86 核心(如 Intel Golden Cove 或 AMD Zen 4)远比这复杂:每周期可解码 6–8 条指令,流水线深度超 10 级。但核心思想不变:让每一级在每个周期都忙碌。任何造成“气泡”(空闲阶段)的行为都会损失吞吐量。接下来四节,讲的都是如何避免或隐藏这些气泡。

内存层级结构#

如果主存和寄存器一样快,缓存就没必要存在。但现实是,寄存器访问与机械硬盘寻道之间相差八个数量级

图 3. 内存层级:访问延迟(纳秒,对数坐标)

层级延迟容量范围技术实现
寄存器~0.3 ns几十个字节核心中的触发器
L1 缓存~1 ns32–64 KBSRAM,每比特 6 个晶体管
L2 缓存~4 ns256 KB–1 MBSRAM(密度更高,稍慢)
L3 缓存~15 ns8–64 MBSRAM(多核共享)
DRAM(DDR4/5)~90 ns8–128 GB每比特 1 晶体管 + 1 电容
SSD(NVMe)~100 µs0.5–8 TBNAND 闪存
HDD~10 ms1–20 TB旋转磁盘

一个直观类比:假设 1 ns = 1 秒人类思考时间:

  • L1 命中:瞬间想起。
  • L3 命中:花 15 秒走到邻桌。
  • DRAM:90 秒走到隔壁房间。
  • SSD:一天半。
  • HDD:四个月。

正因如此,一次 L3 未命中会让 CPU 白白浪费几十个周期;而一段缓存友好的内层循环,即使算术相同,也可能比缓存不友好的版本快 10 倍。

缓存未命中的三种类型#

缓存会以三种方式失效。知道是哪一种,才能对症下药。

图 4. 缓存未命中的 3C 分类:强制性、容量性、冲突性

  • 强制性未命中(冷启动):首次访问某数据块时必然发生。无法避免,但可通过预取隐藏延迟。
  • 容量未命中:工作集大于缓存容量。即使完美管理的缓存也会失效。解决方法:缩小工作集(如分块/平铺),或使用更大缓存。
  • 冲突未命中:低相联度缓存中,多个热点块争抢同一组位置。例如,两个地址相差恰好一个缓存组大小的数组会互相驱逐。解决方法:调整数据布局、填充数组,或依赖高相联度缓存。

现代 L1 缓存通常为 8 路相联,L2/L3 更高,因此纯冲突未命中已较少见——但在以 2 的幂为步长遍历数组的紧致循环中仍可能出现。

分支预测#

条件分支是流水线的噩梦:当 if (x > 0) 在 EX 阶段真正得出结果时,后续三四条指令早已按某条路径取入。若预测错误,所有在飞指令都被丢弃重取——现代核心中,一次误预测代价高达 15–20 周期

经典方案是双比特饱和计数器,每个分支对应一个状态机:

图 5. 双比特预测器状态机及不同代次预测器的准确率

其巧妙之处在于:单次异常不会立即翻转预测,需连续两次错误才改变方向。仅此一项,在典型负载下就能达到 ~93% 准确率。现代预测器(如 TAGE、感知机)通过记录近期分支历史,进一步将准确率推至 98% 以上——例如捕捉“外层循环走真,内层通常也走真”这类相关性。

如果你在 C++20 中见过 [[likely]] / [[unlikely]],或在 GCC 中用过 __builtin_expect,那就是你在帮编译器优化分支预测。

乱序执行#

即便分支预测完美,流水线仍会因数据依赖而停顿:一次 DRAM 加载需 ~90 ns(3 GHz 下约 300 周期),任何依赖该值的指令都必须等待。顺序执行核心只能干等,后续指令全被堵住。

乱序执行(OoO) 核心则更聪明:它将数十甚至上百条解码指令暂存于重排序缓冲区(ROB),只要操作数就绪,就立即调度执行,无视程序顺序。只要最终可见结果(寄存器状态、内存)与顺序执行一致,硬件可自由重排。

图 6. 同一段五条指令的执行序列:顺序 vs 乱序

图中 I3 和 I4 不依赖那次加载。顺序核心会让它们在 I2 后等待;OoO 核心则趁加载飞行时提前执行它们。结果:6 周期而非 8 周期——这还只是小例子。在真实负载中,配合大 ROB(如 Apple M3 据传达 ~600 micro-op),性能提升显著且全自动,无需程序员干预。

这也解释了为何微基准测试常具误导性:若循环体含独立指令,CPU 会并行执行,你测到的是瓶颈单元的吞吐量,而非单操作延迟

多核与 SMT(超线程)#

有两种方式增加并行性而不提升单核性能:

  1. 多核:复制前端、ALU、寄存器、L1、L2;仅共享 L3 和内存控制器。
  2. SMT(Intel 称 Hyperthreading):单物理核内维护两套架构寄存器,让两个软件线程共享同一组执行单元。

图 7. 多核架构(左)以及 SMT 如何利用空闲执行单元(右)

SMT 的关键直觉:当一线程因缓存未命中或分支误预测而停顿时,其执行单元闲置。SMT 让另一线程立即使用这些资源。在混合负载下,典型收益为 +20–30% 吞吐量——并非 2×,因为两线程共享 ALU、L1 缓存和执行端口。对于已饱和执行单元的纯计算负载(如紧致矩阵乘法),SMT 反而可能因增加缓存压力而拖慢性能,这也是 HPC 负载常禁用它的原因。

这终于解答了疑问 3。CS2 在 450 FPS 时,瓶颈不在核心数——引擎主线程才是关键。i5-13600K 的单线程性能优于 R9 7950X(更新的 P-core、更高睿频、更大 L2/core),而 7950X 的额外核心大多闲置。更多核心仅在工作可并行化时才有用,而游戏通常不可并行。

第三部分 —— 如何选择 CPU#

当下的 Intel 与 AMD 对比#

当前代际的主要权衡:

维度Intel(13/14 代酷睿)AMD(Ryzen 7000 / 9000)
单线程峰值极高(P-core 睿频 ~6 GHz)极高(Zen 4/5 IPC 优秀)
多线程吞吐E-core 扩展宽度高核心数,对称设计
制程Intel 7 / Intel 4TSMC 5 nm / 4 nm
平台寿命LGA 1700(支持 12/13/14 代)AM5(承诺支持至 2027+)
能效高端型号较弱整体更优
最佳场景游戏、混合负载内容创作、编译

按负载选型:

  • 游戏:单线程最重要。中端 Intel i5/i7 或高睿频 Ryzen 7 是甜点。
  • 视频剪辑、3D 渲染、大型编译:核心越多越好。选 Ryzen 9 或 Threadripper。
  • 办公、网页、轻量开发:现代 4–6 核 CPU 性能绰绰有余。
  • 服务器:AMD EPYC(96+ 核、12 通道 DDR5、更多 PCIe 通道)在密度和性价比领先;Intel Xeon 在特定加速负载(AMX、QAT)仍有优势。

位与 64 位:4 GB 墙从何而来?#

32 位地址总线可寻址 $2^{32} = 4\ \text{GiB}$ 。但 32 位 OS 必须将 RAM 和内存映射 I/O(显存、BIOS、PCIe 寄存器等)塞进同一空间。顶部 ~0.5–1 GiB 被 MMIO 占用,仅剩 ~3.0–3.5 GiB 给 RAM。这就是“装了 4 GB,Windows 显示 3.25 GB”的根源——唯一解法是迁移到 64 位 OS,其 $2^{64} \approx 16\ \text{EiB}$ 地址空间彻底终结此问题。

ECC、多路与服务器主频为何更低#

服务器 CPU 因负载不同而做出不同权衡:

  • ECC 内存可检测并纠正单比特错误。在数千 DIMM 7×24 运行的服务器环境中,比特翻转频发;金融、科研、安全关键领域不可或缺。
  • 多路架构允许多颗 CPU 共享一致内存视图,适用于超大数据库和虚拟化主机。
  • 更多 PCIe 通道(64–128 vs 桌面 ~20)可驱动多 GPU、NVMe 盘和 100 GbE 网卡。
  • 更低主频(全核 ~3 GHz vs 单核 5.8 GHz)以峰值频率换取持续负载下的能效与可靠性。桌面 CPU 是短跑选手,服务器 CPU 是马拉松跑者。

快速参考清单#

  • 带宽用 bit,文件大小用 byte —— 别忘除以 8。
  • 硬盘用 1000 进制,OS 用 1024 进制 —— 标称 TB × 0.931 ≈ 实际 GiB。
  • CPU 流水线理想是 1 IPC;缓存、分支预测、OoO 都为捍卫此目标。
  • 内存延迟跨 八个数量级;缓存局部性通常是最大性能杠杆。
  • 分支误预测耗 ~15–20 周期,DRAM 未命中耗 ~300;预测器与缓存旨在隐藏它们。
  • SMT 通常带来 +20–30%,非 2×。
  • 更多核心仅助益可并行工作;游戏通常不可并行。

推荐阅读#

  • Hennessy & Patterson,《计算机体系结构:量化研究方法》—— 领域圣经。
  • Bryant & O’Hallaron,《计算机系统:程序员视角》(CSAPP)—— 本科经典。
  • Agner Fog 优化手册 —— 实战 x86 微架构细节。
  • Intel® 64 和 IA-32 架构软件开发者手册。
  • AMD64 架构程序员手册。
  • WikiChip —— 现代微架构芯片图精准简洁。

下一步#

第二篇 —— 内存与缓存层级 —— 将探讨:

  • DDR2 到 DDR5:哪些参数真正变快?
  • 双通道 vs 四通道:实测数据。
  • 缓存相联度、替换策略,及如何用 perf 测缓存未命中。
  • 内存排错:黑屏、蓝屏、MemTest86。

思考题:若 CPU 已有 L1/L2/L3 缓存,为何还需 DRAM?(提示:单位成本容量,SRAM 制造成本。)

附录 A —— 现代流水线的真实面貌#

教科书中的五级 RISC 流水线(取指→译码→执行→访存→写回)是 1990 年代产物。2025 年的 Zen 5 或 Lion Cove 核心更宽、更深、更复杂:

  • 译码宽度 4–8:每周期最多译码 8 条 x86 指令。瓶颈常在前端取指,而非后端。
  • 微操作缓存(μop cache):热循环可绕过译码器。若循环适配 μop 缓存,IPC 可达 ~6;溢出则跌至 ~2。
  • ~600 条在飞指令:ROB 极大(Zen 5 约 448 项,Lion Cove 约 576)。CPU 持续投机执行未来 ~150 ns 的代码。
  • 双整数重命名队列 × 4–6 ALU:“一个核心”内部实为小型分布式调度器。
  • 200+ Load / 100+ Store 缓冲区:Store 写入 L1 需待退役,但 Load 可通过 store-to-load forwarding 提前获取。

教科书流水线仍能解释为何分支误预测代价高,但它没告诉你:现代核心上真实代价 ~16–20 周期,是因为 rename、调度器、ROB 等结构需全部清空重填。五级图让它看起来便宜;现实并非如此。

附录 B —— 在你的机器上试试这些命令#

每位工程师应掌握的三条命令。请在真实负载上运行,而非合成基准。

Linux —— perf stat

1
2
perf stat -e cycles,instructions,branches,branch-misses,\
cache-references,cache-misses ./your_program

关键指标:

  • IPCinstructions / cycles):低于 1.0 表示 CPU 饥饿;高于 2.0 表示前后端健康。
  • 分支错误率 > 2%:热点分支难预测。
  • 缓存未命中率 > 5%:工作集可能超 L2。

macOS —— Instruments → Time Profiler / Counters 模板。Counters 模板暴露 Apple Silicon 计数器:INST_ALLCYCLESL1D_CACHE_MISS_LDBRANCH_MISPRED_NONSPEC。指标同源,名称不同。

通用 —— taskset + time。将单线程基准绑定至单核,消除调度噪声:

1
taskset -c 3 perf stat -r 5 ./bench

-r 5 运行五次,输出均值 ± 标准差。若标准差 > 5%,说明有其他进程干扰。

附录 C —— GPU 的独特之处#

GPU SM(流式多处理器)不是缩小版 CPU 核心,而是完全不同架构:

  • 无分支预测:GPU 通过遮罩执行分支——两边都跑,错误结果丢弃。Warp 内发散分支直接减半吞吐。CPU 预测器在此无用,因 GPU 在此粒度无 per-thread PC。
  • 无乱序执行:延迟靠切换 warp 隐藏,而非重排当前流。故 SM 可驻留 32–64 个 warp;CPU 仅处理一个线程流。
  • 合并访存:32 线程 warp 发 32 次 load,仅当地址连续对齐时,硬件才合并为单次 128 字节事务。CPU 因缓存可容忍散乱访问;GPU 上同样模式可能浪费 32 倍带宽。
  • 寄存器文件巨大:H100 SM 有 256 KB 寄存器——大于其 L1。CPU 寄存器仅几 KB。优化策略迥异。

实用结论:CPU 上表现好的代码,在 GPU 上可能因完全不同原因表现差。切勿照搬调优经验。

本系列

计算机底层原理 6 篇

  1. 01 计算机基础(一):CPU 与计算核心 当前
  2. 02 计算机基础(二):内存与高速缓存系统
  3. 03 计算机基础(三):存储系统(HDD 与 SSD)
  4. 04 计算机基础(四):主板、显卡与扩展
  5. 05 计算机基础(五):网络、电源与故障排查
  6. 06 计算机基础(六):深度解析与系统协作

读有所得?

GitHub 关注我 → 新文周更

GitHub