目录

  1. 概述
  2. 计算机层次结构
  3. 冯·诺依曼体系结构
  4. CPU 与指令流水线
  5. 存储层次结构
  6. 输入输出系统
  7. 从源码到执行
  8. 为什么做 AI 要懂体系结构
  9. 参考文献

1 概述 {#1}

计算机组成原理(Computer Organization)研究计算机各硬件部件如何组织与协同工作,是操作系统、编译器、体系结构乃至高性能计算的地基。对 AI 工程师而言,理解计算机组成是理解 GPU、CUDA、显存带宽、训练/推理性能优化的前提。

本章的叙事线索:

层次结构 → 冯·诺依曼 → CPU → 存储 → I/O → 从源码到执行

2 计算机层次结构 {#2}

2.1 五层结构

经典的计算机系统层次结构从硬件到应用依次为:

层次 内容 举例
应用层 面向用户的程序 PyTorch、浏览器
高级语言层 抽象编程语言 Python、C++
汇编/机器语言层 指令集 x86、ARM
操作系统层 资源管理 Linux、Windows
硬件层 物理部件 CPU、GPU、内存

2.2 抽象与封装

每一层都向上层隐藏实现细节:

  • 高级语言隐藏寄存器与寻址;
  • 操作系统隐藏硬件中断与内存管理;
  • 编译器和解释器是层与层之间的”翻译器”。

理解层次结构的意义:性能问题的根源往往跨越多层——例如训练慢可能同时涉及算法层、框架层、CUDA 层和硬件层。


3 冯·诺依曼体系结构 {#3}

冯·诺依曼(Von Neumann)体系结构是现代计算机的基础,核心思想是存储程序:程序和数据都以二进制形式存放在同一存储器中。

五大部件:

┌──────────┐   ┌──────────┐
│  控制器    │◄─►│  运算器    │
└────┬─────┘   └────┬─────┘
     │              │
┌────▼──────────────▼─────┐
│        存储器           │
└────▲──────────────▲─────┘
     │              │
┌────┴─────┐   ┌────┴─────┐
│  输入设备  │   │  输出设备  │
└──────────┘   └──────────┘
  • 控制器:取指令、译码、控制各部件;
  • 运算器(ALU):算术与逻辑运算;
  • 存储器:存放指令与数据;
  • 输入/输出设备:与人或外部世界交互。

Von Neumann 瓶颈:指令与数据共享同一总线,顺序取指/取数,成为性能瓶颈。现代 CPU 通过缓存、流水线、指令级并行缓解,GPU 则通过大规模并行绕开部分瓶颈。


4 CPU 与指令流水线 {#4}

4.1 CPU 组成

部件 作用
控制单元 (CU) 取指、译码、生成控制信号
算术逻辑单元 (ALU) 加减乘除、逻辑运算
寄存器堆 高速小容量存储,暂存操作数
程序计数器 (PC) 指向下一条指令地址
缓存 (Cache) 缓解 CPU-内存速度差距

4.2 指令周期

一条指令的执行周期(Instruction Cycle):

取指 (Fetch) → 译码 (Decode) → 执行 (Execute) → 写回 (Write-back)

4.3 指令流水线(Pipelining)

将指令周期各阶段重叠执行:

        时钟 1  时钟 2  时钟 3  时钟 4  时钟 5
指令1   取指    译码    执行    写回
指令2          取指    译码    执行    写回
指令3                 取指    译码    执行

理想情况下,流水线使吞吐率提升 $k$ 倍($k$ 为流水线级数),但存在:

  • 结构冒险:硬件资源冲突;
  • 数据冒险:指令间数据依赖;
  • 控制冒险:分支跳转打断流水线。

现代 CPU 通过乱序执行(Out-of-Order)、分支预测(Branch Prediction)、超标量(Superscalar)等提升指令级并行。


5 存储层次结构 {#5}

5.1 层次与速度

存储器按速度-容量-成本构成金字塔:

        ┌──────────────┐   最快/最小/最贵
        │   寄存器      │
        ├──────────────┤
        │  L1/L2 Cache │
        ├──────────────┤
        │  L3 Cache    │
        ├──────────────┤
        │    主存 RAM   │
        ├──────────────┤
        │   SSD/磁盘    │
        └──────────────┘   最慢/最大/最便宜

5.2 局部性原理

存储层次的设计依赖局部性原理

  • 时间局部性:刚访问的数据很可能再次访问;
  • 空间局部性:刚访问数据附近的地址很可能被访问。

缓存(Cache)利用局部性,把频繁访问的数据放在高速层。对 AI 而言,这个思想直接映射到 GPU 的共享内存(SRAM)与显存(HBM)分层。

5.3 性能计算

平均访问时间:

\[t_{\text{avg}} = t_{\text{hit}} + \text{Miss Rate} \times t_{\text{miss penalty}}\]

提高命中率(Hit Rate)是缓存优化的核心。


6 输入输出系统 {#6}

6.1 I/O 方式

方式 特点
程序查询 CPU 轮询设备状态,效率低
中断 设备就绪后通知 CPU,CPU 响应
DMA 直接内存访问,数据不经 CPU 搬运

6.2 总线与设备

  • 系统总线:连接 CPU、内存、I/O;
  • PCIe:高速外设互连(GPU、NVMe SSD 通常走 PCIe);
  • NVMe:基于 PCIe 的 SSD 高速接口,AI 数据读取的关键。

DMA 思想在 GPU 中尤为重要:数据通过 PCIe/DMA 在主机内存与显存间搬运,训练/推理的数据吞吐很大程度上取决于这条通路。


7 从源码到执行 {#7}

一个 C/C++ 程序从源码到运行的过程:

源码 → 预处理 → 编译(到汇编)→ 汇编(到目标文件)→ 链接 → 可执行文件 → 加载运行
hello.c ──► hello.s ──► hello.o ──► a.out ──► 运行
        gcc -S      as       ld

对 Python/深度学习而言,框架(如 PyTorch)通过:

  1. Python 解释执行高层逻辑;
  2. C++ 内核(如 ATen)执行底层计算;
  3. CUDA kernel 在 GPU 上并行执行。

理解这条链路,有助于定位”到底慢在哪一层”。


8 为什么做 AI 要懂体系结构 {#8}

  • 性能优化:矩阵乘、注意力、显存搬运都是硬件层面的问题(见 inference-implementation.md);
  • 算力评估:理解 FLOPS、HBM 带宽、算术强度(Arithmetic Intensity)才能估算训练/推理成本;
  • 并行编程:CUDA、多 GPU 并行都建立在理解存储层次与数据搬运之上;
  • 容错与可靠性:硬件故障(GPU Xid、内存错误)的排查需要体系结构知识(见 reliability.md)。

9 参考文献 {#9}

[1] D. A. Patterson, J. L. Hennessy, Computer Organization and Design: The Hardware/Software Interface, Morgan Kaufmann.

[2] A. S. Tanenbaum, Structured Computer Organization, Pearson.

[3] J. L. Hennessy, D. A. Patterson, Computer Architecture: A Quantitative Approach, Morgan Kaufmann.

[4] von Neumann, J., First Draft of a Report on the EDVAC, 1945.

[5] W. Stallings, Computer Organization and Architecture, Pearson.

留下评论