17 建立数据通路(上):指令加运算=CPU 17 建立数据通路(上):指令加运算=CPU前面几讲里,我从两个不同的部分为你讲解了 CPU 的功能。 在“ 指令”部分,我为你讲解了计算机的“指令”是怎么运行的,也就是我们撰写的代码,是怎么变成一条条的机器能够理解的指令的,以及是按照什么样的顺序运行的。 在“ 计算 ”部分,我为你讲解了计算机的“计算”部分是怎么执行的,数据的二进制表示是怎么样的,我们执行的加法和 2022-08-23 专栏 > 深入浅出计算机组成原理
19 建立数据通路(下):指令加运算=CPU 19 建立数据通路(下):指令加运算=CPU上一讲,我们讲解了时钟信号是怎么实现的,以及怎么利用这个时钟信号,来控制数据的读写,可以使得我们能把需要的数据“存储”下来。那么,这一讲,我们要让计算机“自动”跑起来。 通过一个时钟信号,我们可以实现计数器,这个会成为我们的 PC寄存器。然后,我们还需要一个能够帮我们在内存里面寻找指定数据地址的译码器,以及解析读取到的机器 2022-08-23 专栏 > 深入浅出计算机组成原理
18 建立数据通路(中):指令加运算=CPU 18 建立数据通路(中):指令加运算=CPU上一讲,我们看到,要能够实现一个完整的 CPU功能,除了加法器这样的电路之外,我们还需要实现其他功能的电路。其中有一些电路,和我们实现过的加法器一样,只需要给定输入,就能得到固定的输出。这样的电路,我们称之为组合逻辑电路 (Combinational Logic Circuit)。 但是,光有组合逻辑电路是不够的。你可以想 2022-08-23 专栏 > 深入浅出计算机组成原理
21 面向流水线的指令设计(下):奔腾4是怎么失败的? 21 面向流水线的指令设计(下):奔腾4是怎么失败的?上一讲,我给你初步介绍了 CPU 的流水线技术。乍看起来,流水线技术是一个提升性能的灵丹妙药。它通过把一条指令的操作切分成更细的多个步骤,可以避免CPU“浪费”。每一个细分的流水线步骤都很简单,所以我们的单个时钟周期的时间就可以设得更短。这也变相地让 CPU 的主频提升得很快。 这一系列的优点,也引出了现代桌面 CPU 的 2022-08-23 专栏 > 深入浅出计算机组成原理
20 面向流水线的指令设计(上):一心多用的现代CPU 20 面向流水线的指令设计(上):一心多用的现代CPU前面我们用了三讲,用一个个的电路组合,制作出了一个完整功能的 CPU。这里面一下子给你引入了三个“周期”的概念,分别是指令周期、机器周期(或者 CPU周期)以及时钟周期。 你可能会有点摸不着头脑了,为什么小小一个 CPU,有那么多的周期(Cycle)呢?我们在专栏一开始,不是把 CPU的性能定义得非常清楚了吗?我们说程序的 2022-08-23 专栏 > 深入浅出计算机组成原理
22 冒险和预测(一):hazard是“危”也是“机” 22 冒险和预测(一):hazard是“危”也是“机”过去两讲,我为你讲解了流水线设计 CPU 所需要的基本概念。接下来,我们一起来看看,要想通过流水线设计来提升 CPU 的吞吐率,我们需要冒哪些风险。 任何一本讲解 CPU 的流水线设计的教科书,都会提到流水线设计需要解决的三大冒险,分别是 结构冒险 (Structural Hazard)、数据冒险 (Data Hazard 2022-08-23 专栏 > 深入浅出计算机组成原理
23 冒险和预测(二):流水线里的接力赛 23 冒险和预测(二):流水线里的接力赛上一讲,我为你讲解了结构冒险和数据冒险,以及应对这两种冒险的两个解决方案。一种方案是增加资源,通过添加指令缓存和数据缓存,让我们对于指令和数据的访问可以同时进行。这个办法帮助CPU 解决了取指令和访问数据之间的资源冲突。另一种方案是直接进行等待。通过插入 NOP这样的无效指令,等待之前的指令完成。这样我们就能解决不同指令之间的数据依赖问 2022-08-23 专栏 > 深入浅出计算机组成原理
24 冒险和预测(三):CPU里的“线程池” 24 冒险和预测(三):CPU里的“线程池”过去两讲,我为你讲解了通过增加资源、停顿等待以及主动转发数据的方式,来解决结构冒险和数据冒险问题。对于结构冒险,由于限制来自于同一时钟周期不同的指令,要访问相同的硬件资源,解决方案是增加资源。对于数据冒险,由于限制来自于数据之间的各种依赖,我们可以提前把数据转发到下一个指令。 但是即便综合运用这三种技术,我们仍然会遇到不得不停下整个 2022-08-23 专栏 > 深入浅出计算机组成原理
26 Superscalar和VLIW:如何让CPU的吞吐率超过1? 26 Superscalar和VLIW:如何让CPU的吞吐率超过1?到今天为止,专栏已经过半了。过去的 20 多讲里,我给你讲的内容,很多都是围绕着怎么提升 CPU 的性能这个问题展开的。 我们先回顾一下第 4 讲,不知道你是否还记得这个公式: 程序的 CPU 执行时间 = 指令数 × CPI × Clock Cycle Time 这个公式里,有一个叫 CPI 的指 2022-08-23 专栏 > 深入浅出计算机组成原理
25 冒险和预测(四):今天下雨了,明天还会下雨么? 25 冒险和预测(四):今天下雨了,明天还会下雨么?过去三讲,我主要为你介绍了结构冒险和数据冒险,以及增加资源、流水线停顿、操作数前推、乱序执行,这些解决各种“冒险”的技术方案。 在结构冒险和数据冒险中,你会发现,所有的流水线停顿操作都要从 指令执行阶段开始。流水线的前两个阶段,也就是取指令(IF)和指令译码(ID)的阶段,是不需要停顿的。CPU 会在流水线里面直接去取下一条 2022-08-23 专栏 > 深入浅出计算机组成原理