> For the complete documentation index, see [llms.txt](https://fengmuzi2003.gitbook.io/csapp3e/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://fengmuzi2003.gitbook.io/csapp3e/di-4-zhang-chu-li-qi-ti-xi-jie-gou.md).

# 第04章：处理器体系结构

万丈高楼平地起

## [视频解说](https://www.bilibili.com/video/BV1RK4y1R7Kf?p=4)

## 导读

第04章开篇第一句话就是：**现代微处理器可以称得上是人类创造出的最复杂的系统之一**。

的确如此，仅看现代处理器的制造过程就极其复杂，感兴趣的可以观看影片：[中芯国际：从沙子到芯片](https://www.bilibili.com/video/BV1bE411C76e?from=search\&seid=16203637374927442542)

![From P\&H Book：半导体IC的制造过程](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWMNLDxqDDgqBoQyXXS%2F-MWMNvtgpf8MUKwltJL_%2F%E6%8D%95%E8%8E%B7.PNG?alt=media\&token=784d7de0-13c5-459c-9674-a2e08beb511b)

要讨论现代处理器，如此单薄的一章肯定是远远不够的，要再开设一门课程才行，实际上本章的内容隶属于计算机组成原理（计算机体系结构）的范畴，这里仅介绍一些大家必须知道的东西，或者是值得借鉴和思考的东西。

**RISC** （精简指令集） vs **CISC**（复杂指令集），如今很多RISC风格的处理器为了加入很多新的特性，正在变得越来越像CISC，而反过来CISC风格的处理器(比如x86)在具体实现的时候又转换成了类似RISC的微指令，因此两者的界限越来越模糊了，本质上都是“取其精华，去其糟粕”，或者说是某种程度的折中。

![From：MIT 6.823 Computer System Architecture](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-M_EQhKHHoe3OrGpwBVL%2F-M_ET_KCy1fgJCM-NB5q%2Fimage.png?alt=media\&token=dd74e90a-740e-4acb-a26c-6a2cb423fdf8)

另外，这不仅仅是技术上孰优孰劣的问题，还有市场因素，**Technical elegance ≠ market success**，例如今天我们很不幸地看到MIPS已经开始日落西山，回顾历史，MIPS（特别优雅）在90年代曾经一度辉煌过，很多半导体公司都采用MIPS的设计来制造芯片，其生产的芯片也被Sony和Nintendo的游戏机，以及被超级计算机所使用，但是它错失了智能手机时代，由于MIPS的产品从设计之初就以Intel的x86为对标产品，主打高性能，反观ARM，从诞生开始就瞄准嵌入式低功耗领域，在智能手机市场大爆发的年代，ARM一下子走上舞台中央，而MIPS由于聚焦在中高端并没有功耗的优势，限制了其在智能手机上大展拳脚，另一方面MIPS的迟缓也导致它失去了最关键的十年， 如今MIPS已是几经转手，命途多舛，反观 Intel（特别不优雅），它的指令集架构并不优雅和完美，但是它的兼容性做的很好，在个人电脑和服务器领域还是占据了重大的份额，我们不得不感慨科技产业的快速变迁，正所谓 “适者生存”，类似的，Linux并不完美，但是它同样很务实，也取得了巨大的成功。

从1970年代开始... 摩尔定律持续了几十年... 但是可以看出单核处理器在2005年前后遇到了很多瓶颈（功耗墙，指令并行墙，内存墙等），[Intel技术总监很早就谈及了这个话题](https://www.bilibili.com/video/BV1554y1s7LS?p=7)，如今你的电脑和手机也早就已经是（异构）多核的了，比如 [ARM big.LITTLE](https://www.bilibili.com/video/BV1xv41117tN/)...

![](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWi8U435jknD7aZ4lMi%2F-MWiA7bYYoVgCXRzKtiL%2F%E6%8D%95%E8%8E%B7.PNG?alt=media\&token=562c0fc6-9b5a-4d25-94d6-5263e9220cb1)

近年来，基于领域的设计也开始再次兴起，传统的商业产品（比如x86-64）已经达不到某些公司对性能的极致需求，或者对需求的响应过于缓慢，因此很多大公司都在自行设计能够满足自身特定性能需求的软硬件，比如Google的TPU，Apple的M1芯片等，Patterson和Hennessy称之为计算机体系结构的新黄金时代。

参考：Patterson演讲：[计算机体系结构的新黄金时代](https://www.bilibili.com/video/BV1fr4y1N7hx/)，Hennessy演讲：[计算机体系结构的新黄金时代](https://www.bilibili.com/video/BV1TV411y7Jo/)

![图片：Apple于2020年发布的M1 SoC芯片](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWMJMUcw_x72-qFiouG%2F-MWMMi1QBw7UmdzCoZbD%2FM1-product-card.jpg?alt=media\&token=b07b91af-2216-49d9-87be-716b59c88f2e)

## **学习方式**

CMU的教授没有给出对应的视频，我也不推荐大家阅读原书第4章，原因：Y86-64 不是一个商业可用的指令集架构，意味着你学了之后基本上没有实用价值，另外，Y86-64 的设计并不优雅，不是特别值得学习。

**推荐教材**：计算机组成与设计: 硬件/软件接口：MIPS版本 或者 RISC-V版本，以下简称P\&H Book。

**下载链接**：如果你没有以上推荐教材的纸质书籍的话，可以跳到附录部分直接下载电子版教材。

![](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MVxd_3St8g3q74VU_Oo%2F-MVxeHvgViKUI1UeGr_4%2F%E6%8D%95%E8%8E%B7_%E5%89%AF%E6%9C%AC.png?alt=media\&token=0b2648ed-7406-4b56-8c5f-53a355798c82)

备注：Patterson和Hennessy由于RISC方面的贡献而获得2017年图灵奖（相当于计算机界的诺贝尔奖）

![](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWg_mPYeDMa1oE3Xi4J%2F-MWgaOzAmyDUG1eNl3GG%2F%E6%8D%95%E8%8E%B7.PNG?alt=media\&token=06414167-3fed-4bcb-9059-29641aefaa08)

**补充说明1**：MIPS的芯片比较难买到，如果感兴趣的话你可以通过模拟器来学习。

**补充说明2**：推荐学习RISC-V指令集，因为它是开放的指令集架构，发展迅猛，未来可期，如果你已经有了良好的基础（比如学习过MIPS），那么你学习RISC-V指令集仅仅需要如下两页纸（a.k.a. Green Card）：

{% file src="/files/-MWgrdw4gpih31bhj-y9" %}
RISC-V Green Card (from P\&H Book)
{% endfile %}

![](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-M_E_NTSJaS7W30SSm_c%2F-M_EaOVNkuikR6ziVeyh%2Fimage.png?alt=media\&token=52781688-9c24-4a60-ba4c-d2951b4a347a)

温馨提示：阿里巴巴、华为、晶心科技（台湾）、西部数据、NVIDIA、SiFive、高通等各大公司都在争相布局，我国大力支持看好RISC-V，你如果感兴趣可以参考：[RISC-V基金会官网](https://riscv.org/)，[中国科学院大学的“一生一芯”成果展示](https://www.bilibili.com/video/BV1dv41117Cm/)，[倪光南院士也介绍了我国的RISC-V发展情况](https://www.bilibili.com/video/BV1oV41127Hy/)。

## 重点解读&#x20;

{% hint style="info" %}
**提示：处理器的设计步骤**

1. 分析指令，推导出数据通路需求
2. 为所需的数据通路选择合适的组件
3. 连接各个组件建立数据通路
4. 分析指令的实现，以确定控制信号
5. 集成控制信号，形成完整的控制逻辑
   {% endhint %}

**单周期处理器设计**：数据通路 + 实现控制逻辑  (本质 = 组合逻辑电路 + 时序逻辑电路)

**引申**：控制与数据分离的设计思想也广泛应用在其他领域，比如网络通信领域中引入了SDN

备注：数字电路不是本课程的重点，如果不熟悉的朋友请参考 P\&H Book. 附录. The Basics of Logic Design

![From P\&H Book：组合逻辑单元，时序逻辑单元](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWMs8IxsCUb__33ckvJ%2F-MWMvCwgLtkq3pcEDZCk%2F%E6%8D%95%E8%8E%B71_%E5%89%AF%E6%9C%AC.png?alt=media\&token=af82d924-5e46-4624-ab53-0d85c88b1546)

&#x20; 示例：以下是简单的RISC-V单周期处理器的设计（MIPS也类似），来自P\&H Book

![From P\&H Book：single-cycle datapath](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWhvO60T-XsUDqVzdNc%2F-MWi0YUepMtcNLqIQDmk%2F%E6%8D%95%E8%8E%B7333333333333333333333333333333333.PNG?alt=media\&token=0105f066-9d38-4930-96f0-13fe5131483f)

{% hint style="info" %}
流水线技术：现代处理器借鉴了汽车生产的流水线技术，使得指令能够并行执行（ILP）
{% endhint %}

示例：以下是简单的RISC-V流水线处理器的设计（MIPS也类似），来自P\&H Book

![From P\&H Book：pipelined version of the datapath](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWi17ldlPRjWZPHgug9%2F-MWi1V6hzkDp--vbbMeK%2F%E5%9B%BE%E7%89%871.png?alt=media\&token=f3bc9ed2-d40f-44bf-ae77-1f279659668f)

提示：流水线并不会缩短单条指令的执行时间（甚至会增加时间）， 但是提高了指令的吞吐率。流水线深度也不是越深越好，一方面由于流水线寄存器本身会带来额外的开销，另外一方面流水线越深，由分支预测失败带来的性能损失会更大，下图是各种处理器的流水线深度和功耗对比，因此实际需要考虑折中。

![From P\&H Book：流水线级数 & 功耗](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWhKhRARXBcSkT5RQ3l%2F-MWhLECYHIvwH6OT9jYe%2F%E6%8D%95%E8%8E%B7.PNG?alt=media\&token=1a3aaa33-855f-4dc9-9ab1-7dc56e13aff1)

{% hint style="info" %}
流水线冒险：英文称为Harzard，指的是阻止下一条指令在下一个时钟周期开始执行的情况
{% endhint %}

**结构冒险**：所需的硬件资源正在被之前的指令工作，解决方案：等待Stall，或者增加硬件资源，比如增加寄存器的端口数量，或者指令和数据Cache分开存储，请参考下图的场景a和场景b对照理解。

![场景a：增加寄存器端口，场景b：指令/数据分开存储](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWhI1gzu6edmR9Qa38J%2F-MWhKTISdjrx6w8DowZd%2F%E6%8D%95%E8%8E%B7_%E5%89%AF%E6%9C%AC.png?alt=media\&token=49d20ae5-de22-4da8-a768-3a6b37b3c7b4)

**数据冒险**：需要等待之前的指令完成写操作，解决方案：等待Stall，或者提前转发Forwarding，但是无法解决所有的数据依赖问题（例如需要访存的情况），请参考下图的场景a和场景b对照理解。

![场景a：数据转发可行，场景b：数据转发不可行](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWhCWEIxXX-3xtGpTaE%2F-MWhG55nIeB8HwkNyUDc%2F%E6%8D%95%E8%8E%B7_%E5%89%AF%E6%9C%AC.png?alt=media\&token=73b9affb-bde3-46ad-8b3c-a51b63f40bfe)

编译器也可以进行指令调度，在一定程度上避免等待Stall，请参考下图的场景进行理解：

![编译器指令调度避免Stall](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWhGh3MkcEDNhCVAjxp%2F-MWhHVXigjv_kf4DP0Dt%2F%E6%8D%95%E8%8E%B7.PNG?alt=media\&token=da7996c0-5e61-4b33-ac34-667309f8099c)

**控制冒险**： 需要根据之前指令的结果决定下一步的行为，解决方案：等待Stall，分支预测（硬件实现的动态预测，比如branch target buffer，branch history table等机制），编译器实现的分支合并等。

{% hint style="info" %}
提升性能：现代处理器为了进一步提升 ILP，采用了一些较为 “激进” 的设计，譬如乱序执行等
{% endhint %}

Out-of-Order Execution： 乱序执行（动态调度）：大致上包含的组件有 Register renaming，Reservation stations等。注意：虽然表面上看起来是乱序执行，但是最终还是要确保按序递交结果（从程序员的角度看顺序是一致的）

![](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWhQJZ1kdLn8DW8teTq%2F-MWhRmiHHuM3J0cFan_o%2F%E6%8D%95%E8%8E%B7.PNG?alt=media\&token=13e7e108-0a30-4d3b-a52f-480d3a5a3e80)

**历史**：世界上第一台乱序执行和执行超标量的计算机是CDC 6600，超级计算机之父 Semour Cray 带领的团队在这台堪称是天神下凡一般的机器上实现了体系结构设计的两项重大突破，值得永载史册，出于对 CDC 6600 的敬意，乱序执行中用来描述指令发射的术语（issue）沿用了 CDC 6600 设计文档中的原始称呼并一直保留至今。

![](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWNuf0PqJkOVnv9T33J%2F-MWNviad7vOF3BZCXlXs%2F%E6%8D%95%E8%8E%B74.PNG?alt=media\&token=792e0e27-fb6c-46f7-927b-cd45a23f41cf)

**现代处理器实例-1**：Intel Core-i7使用的Nehalem架构，如果看不太清楚的话可以通过下方链接下载文档

{% file src="/files/-MWhr\_D\_FS\_cHV7zMqfR" %}
Intel Nehalem microarchitecture
{% endfile %}

![source from：Mohammad Radpour & Amirali Sharifian](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWhiF4oJC77aj6A5dhb%2F-MWhqBhhTLobh3VDfmCx%2F%E6%8D%95%E8%8E%B7.PNG?alt=media\&token=5a7f4733-303f-4dc1-a6db-272e4ad7a135)

**现代处理器实例-2**：ARM Cortex-A57的架构图，如果看不太清楚的话可以通过下方链接下载图片

{% file src="/files/-MWhdERLPNUjg\_rvjY9E" %}
ARM Cortex-A57 Block Diagram
{% endfile %}

![source from： Hiroshige Goto ](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-MWhriHuL9YWtyuF2fat%2F-MWhuwtwvwT-X-jMo98w%2F%E6%8D%95%E8%8E%B74444444444444444444444.PNG?alt=media\&token=1405fa53-6148-4810-bc2b-68e8a2c78791)

**现代处理器设计：数据并行 DLP**&#x20;

![From：https://compas.cs.stonybrook.edu/\~nhonarmand/courses/fa15/cse610/](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-M_Ec5Qfac-dRBBFickw%2F-M_EhgqPJaOiICnuRfNg%2Fimage.png?alt=media\&token=78671a26-2936-4d6b-b6eb-d5907c6018c9)

![](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-M_FE7hw1K4YK8_w7Tus%2F-M_FENN2cPW6I11LXgFd%2Fimage.png?alt=media\&token=f2986be9-ed98-4a10-9c44-6a14c8d3d5f3)

![](https://1380295634-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MV9vJFv4kmvRLgEog6g%2F-M_FE7hw1K4YK8_w7Tus%2F-M_FFZ9yZpTMWYmuMlPV%2Fimage.png?alt=media\&token=00b6ccd4-52a5-4613-9633-ade4f392c57d)

{% hint style="info" %}
**CUDA编程方面的内容请参考Nvida的官方文档**
{% endhint %}

{% embed url="<https://docs.nvidia.com/cuda/cuda-c-programming-guide>" %}

## 延伸阅读

* 关于现代处理器，强烈推荐阅读这份很好的在线文档：[Modern Microprocessors A 90-Minute Guide!](http://www.lighterra.com/papers/modernmicroprocessors/)
* 毕尔肯大学 CS224：[计算机组成原理](https://www.bilibili.com/video/BV1Q5411E7e4/) - 这个教授讲的不错，推荐它的另一个原因是视频与教材同步
* 英语不太好的同学，请参考台湾的两个课程：[深入浅出计算机组成原理](https://www.bilibili.com/video/BV1554y1s7LS/) 或 [计算机结构](https://www.bilibili.com/video/BV1r4411s7Hj?spm_id_from=333.788.b_636f6d6d656e74.6) (黄婷婷教授)
* 加州大学伯克利分校 CS61C：[计算机架构的伟大思想](https://www.bilibili.com/video/BV1g5411K7Z7/) - 授课教授Krste，目前担任RISC-V基金会主席
* 卡内基梅隆大学 18-447：[计算机体系结构](https://www.bilibili.com/video/BV1PT4y1M7gM/) - 授课教授Onur Mutlu，目前在苏黎世联邦理工学院任教
* 伊利诺伊大学：[异构并行编程](https://www.bilibili.com/video/BV1z541137iG/) - 胡文美教授 - 重点讲解CUDA编程，目前是Nvidia高级杰出研究科学家
* 如果你想玩一下RISC-V芯片，请参考本人拙作：[RISC-V快速上手指南 (基于兆易创新GD32V MCU)](https://www.bilibili.com/video/BV1nv411z7gW/)
