深入浅出计算机组成原理
徐文浩
bothub创始人
立即订阅
13019 人已学习
课程目录
已完结 62 讲
0/4登录后,你可以任选4讲全文学习。
入门篇 (5讲)
开篇词 | 为什么你需要学习计算机组成原理?
免费
01 | 冯·诺依曼体系结构:计算机组成的金字塔
02 | 给你一张知识地图,计算机组成原理应该这么学
03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?
04 | 穿越功耗墙,我们该从哪些方面提升“性能”?
原理篇:指令和运算 (12讲)
05 | 计算机指令:让我们试试用纸带编程
06 | 指令跳转:原来if...else就是goto
07 | 函数调用:为什么会发生stack overflow?
08 | ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
09 | 程序装载:“640K内存”真的不够用么?
10 | 动态链接:程序内部的“共享单车”
11 | 二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?
12 | 理解电路:从电报机到门电路,我们如何做到“千里传信”?
13 | 加法器:如何像搭乐高一样搭电路(上)?
14 | 乘法器:如何像搭乐高一样搭电路(下)?
15 | 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?
16 | 浮点数和定点数(下):深入理解浮点数到底有什么用?
原理篇:处理器 (18讲)
17 | 建立数据通路(上):指令+运算=CPU
18 | 建立数据通路(中):指令+运算=CPU
19 | 建立数据通路(下):指令+运算=CPU
20 | 面向流水线的指令设计(上):一心多用的现代CPU
21 | 面向流水线的指令设计(下):奔腾4是怎么失败的?
22 | 冒险和预测(一):hazard是“危”也是“机”
23 | 冒险和预测(二):流水线里的接力赛
24 | 冒险和预测(三):CPU里的“线程池”
25 | 冒险和预测(四):今天下雨了,明天还会下雨么?
26 | Superscalar和VLIW:如何让CPU的吞吐率超过1?
27 | SIMD:如何加速矩阵乘法?
28 | 异常和中断:程序出错了怎么办?
29 | CISC和RISC:为什么手机芯片都是ARM?
30 | GPU(上):为什么玩游戏需要使用GPU?
31 | GPU(下):为什么深度学习需要使用GPU?
32 | FPGA和ASIC:计算机体系结构的黄金时代
33 | 解读TPU:设计和拆解一块ASIC芯片
34 | 理解虚拟机:你在云上拿到的计算机是什么样的?
原理篇:存储与I/O系统 (17讲)
35 | 存储器层次结构全景:数据存储的大金字塔长什么样?
36 | 局部性原理:数据库性能跟不上,加个缓存就好了?
37 | 高速缓存(上):“4毫秒”究竟值多少钱?
38 | 高速缓存(下):你确定你的数据更新了么?
39 | MESI协议:如何让多核CPU的高速缓存保持一致?
40 | 理解内存(上):虚拟内存和内存保护是什么?
41 | 理解内存(下):解析TLB和内存保护
42 | 总线:计算机内部的高速公路
43 | 输入输出设备:我们并不是只能用灯泡显示“0”和“1”
44 | 理解IO_WAIT:I/O性能到底是怎么回事儿?
45 | 机械硬盘:Google早期用过的“黑科技”
46 | SSD硬盘(上):如何完成性能优化的KPI?
47 | SSD硬盘(下):如何完成性能优化的KPI?
48 | DMA:为什么Kafka这么快?
49 | 数据完整性(上):硬件坏了怎么办?
50 | 数据完整性(下):如何还原犯罪现场?
51 | 分布式计算:如果所有人的大脑都联网会怎样?
应用篇 (5讲)
52 | 设计大型DMP系统(上):MongoDB并不是什么灵丹妙药
53 | 设计大型DMP系统(下):SSD拯救了所有的DBA
54 | 理解Disruptor(上):带你体会CPU高速缓存的风驰电掣
55 | 理解Disruptor(下):不需要换挡和踩刹车的CPU,有多快?
结束语 | 知也无涯,愿你也享受发现的乐趣
免费
答疑与加餐 (5讲)
特别加餐 | 我在2019年F8大会的两日见闻录
FAQ第一期 | 学与不学,知识就在那里,不如就先学好了
用户故事 | 赵文海:怕什么真理无穷,进一寸有一寸的欢喜
FAQ第二期 | 世界上第一个编程语言是怎么来的?
特别加餐 | 我的一天怎么过?
深入浅出计算机组成原理
登录|注册

20 | 面向流水线的指令设计(上):一心多用的现代CPU

徐文浩 2019-06-10
前面我们用了三讲,用一个个的电路组合,制作出了一个完整功能的 CPU。这里面一下子给你引入了三个“周期”的概念,分别是指令周期、机器周期(或者 CPU 周期)以及时钟周期。
你可能会有点摸不着头脑了,为什么小小一个 CPU,有那么多的周期(Cycle)呢?我们在专栏一开始,不是把 CPU 的性能定义得非常清楚了吗?我们说程序的性能,是由三个因素相乘来衡量的,我们还专门说过“指令数×CPI×时钟周期”这个公式。这里面和周期相关的只有一个时钟周期,也就是我们 CPU 的主频倒数。当时讲的时候我们说,一个 CPU 的时钟周期可以认为是可以完成一条最简单的计算机指令的时间。
那么,为什么我们在构造 CPU 的时候,一下子出来了那么多个周期呢?这一讲,我就来为你说道说道,带你更深入地看看现代 CPU 是怎么一回事儿。

愿得一心人,白首不相离:单指令周期处理器

学过前面三讲,你现在应该知道,一条 CPU 指令的执行,是由“取得指令(Fetch)- 指令译码(Decode)- 执行指令(Execute) ”这样三个步骤组成的。这个执行过程,至少需要花费一个时钟周期。因为在取指令的时候,我们需要通过时钟周期的信号,来决定计数器的自增。
那么,很自然地,我们希望能确保让这样一整条指令的执行,在一个时钟周期内完成。这样,我们一个时钟周期可以执行一条指令,CPI 也就是 1,看起来就比执行一条指令需要多个时钟周期性能要好。采用这种设计思路的处理器,就叫作单指令周期处理器(Single Cycle Processor),也就是在一个时钟周期内,处理器正好能处理一条指令。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入浅出计算机组成原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(22)

  • 易儿易
    一个 CPU 的时钟周期,可以认为是完成一条简单指令的时间。
    两个错误:
    1简单:不是简单是复杂(耗时最长)
    2指令:不是指令时间,而是指令拆分后线级执行时间
    简单线级需要等待以补齐时间然后与上下流水线一起牵手步入下一线级
    线级分的多的话,这个时钟周期应该就可以固定是IF取指令的时间了
    如果把IF取指令看做是最简单的指令的话,这句话就没毛病了
    但一般说指令应该是指令集的一个命令吧?
    但是指令集是提供给开发者视角的,在CPU内部IF取指令才是一个原子化操作,从CPU视角来看又觉得这句话是靠谱的……

    作者回复: 易儿易同学,

    你说得很好啊!👍

    2019-06-10
    9
  • cc
    随着流水线设计的引入,一个指令被拆分为14个子流程。一个CPU的时钟时间,应该是14个子流程中最长的那条的耗时时间

    作者回复: 回答正确!👍

    2019-06-10
    6
  • DreamItPossible
    如果从单条指令的执行来看,这句话显然是错的,因为即使最简单的无条件跳转指令都至少需要3个时钟周期;
    在了解CPU的流水线设计之后,这句话从吞吐率的角度来讲,是正确的:以5级流水线为例,当过了5个时钟周期后,可以保证每个时钟周期都有一条指令执行完成,即实现了一个CPU的时钟周期;由于取指阶段肯定是所有5个阶段里耗时最长的,即一个CPU的时钟周期可以设置为取指阶段的花费时间;

    注意,这里的5个时钟周期后,才有这种现象,意味着即使引入了流水线操作,这5个时钟周期的开销也是不可避免的,突然想到了之前讲到的Amdahl定律

    作者回复: 👍能够前后联系起来,很好啊

    2019-08-21
    1
    4
  •        鸟人
    这个不知道跟多线程 多进程是否有关系?

    作者回复: 这个和多线程多进程没有太大关系,那个更多是操作系统调度的问题,这个是CPU在硬件层面的实现。

    2019-06-11
    4
  • 瀚海星尘
    各种工程都充满了权衡~
    2019-07-24
    2
  • 斐波那契
    这句话不正确
    哪怕再简单的指令都要经过划分好的阶段。首先我们要明确那几个周期的概念 所谓时钟周期(或叫做震荡周期)是指cpu一次晶体震动的时间 是计算机最小的时间单位 就拿我们补码来说 取反加1 这实际上就至少需要2个脉冲也就是两个时钟周期了 对于一条指令来说我们把执行过程划分成好几个阶段(具体几个由厂商工艺设计决定) 每个阶段的时间就是一个机器周期 所以一般情况下执行一条指令的时间是由多个机器周期决定的而一个机器周期又由多个时钟周期决定的 这样一条流水线就是由最多时钟周期的机器周期时间决定的 显然一个时钟周期执行不完一条指令

    作者回复: Single-Cycle Processor就可以在一个时钟周期完成一条指令呀。虽然Single-Cycle Processor已经并不在现代CPU设计中使用了,但是并不代表这个是不可行的啊。

    2019-06-11
    2
  • 喜欢吃鱼
    每个流水线级的执行时间应该不一定相同吧,所以一个CPU执行周期是不是执行时间最久的流水线级所需要的时间?

    作者回复: 喜欢吃鱼同学,你好

    准确地说,每一个流水线级的时间都是一个时钟周期,但是其中实际操作的时间,可能短于一个时钟周期。比如我们译码器其实就是一个组合逻辑电路,门延迟很低,就不需要一个完整的时钟周期就能完成自己的任务。那么在这个之后,它其实是在“等待”。

    2019-06-10
    2
  • Only now
    一个 CPU 的时钟周期,可以认为是完成一条简单指令的时间。 这个应该是依据于吞吐量来理解的吧。
    实际指令不能在一个时钟周期完成, 但是流水线的引入使吞吐量更高。

    作者回复: 没错,这是一个很好的角度,从吞吐率的角度来讲,如果没有superscalar这样的指令集并行,那么流水线没有遇到任何冒险问题的情况下。按吞吐率算下来相当于一个时钟周期完成了一条指令。

    2019-06-10
    2
  • 随心而至
    1.高度的专业化分工,可以极大的提高生产效率。
    《国富论》中亚当斯密提到一个扣针工场的例子:一个工人无论如何努力,一天也生产不了20枚扣针,但有了分工之后,经过前后十几道工序,每人每天平均可以生产48000枚扣针。
    这可以从经济学上,解释为什么会有流水线
    2.边际效益递减
    新增一个单位的商品或服务,它对商品或服务的收益增加的效用,经济学通常认为,随着商品或服务的量增加,边际效用将会逐步减少。
    这可以从经济学上,解释为什么流水线级数不可以无限增加,而有个界限。
    2019-10-15
    1
  • -W.LI-
    老师好!我又两个问题。
    指令分级以后同样会存在一个问题啊,每一级执行时间不一样。这样一个指令周期需要时最长的那个级的时间么?还有就是每条指令的级数一样么?如果一个时钟周期就是一级的时间,那么执行时间长的指令的级数就多了吧。再就是指令分级这个需要考虑原子性这种么?还是随便分分?
    2019-06-22
    1
  • softpower2018
    引入了流水线技术,一个时钟周期执行一条简单指令应该完全没问题吧!期待多指令并行执行带来的问题及其解决!

    作者回复: softpower2018同学,你好,

    其实现代流水线下的CPU,一个时钟周期已经不能执行完一条指令了。因为一般来说,取指令就要一个时钟钟周期……

    2019-06-11
    1
  • 陈华应
    无条件跳转这样的简单指令三个流水级应该可以在一个时钟周期完成,换句话说就是一个指令在一个时钟周期完成。但是稍微复杂的指令往往是超过一个时钟周期的。
        这里有一点疑惑:在流水线设计的CPU中,一个时钟周期只会执行一个流水级吗?对于很简单的流水级,可能执行时间只占时钟周期的一半,那另一半就是什么也不干吗?

    作者回复: 一个流水线级就需要一个时钟周期,所以即使是无条件跳转这样的简单指令,也需要三个时钟周期。

    是的,可能特定的流水线级的操作需要的时间很少,那么其他时间本质上是在“等待”。

    2019-06-10
    1
  • 拯救地球好累

    ---总结---
    由于需要保证同一时刻同一硬件设备仅被一个指令所使用,我们要保证一个指令周期能完成一个最复杂的指令,导致平均执行时间下降。
    而通过引入流水线,我们从吞吐率这个性能指标上做提升,保证CPU中各硬件部分的充分利用。
    作为性能调优的思路,首先我们需要确定是否有部分模块做了无用功,此外,再看是否每时每刻已经充分利用了资源。
    ---问题---
    老师您好,请问下流水线寄存器是会用来存放所有中间结果的吗?比如说取指这个阶段,指令除了会被放到指令寄存器,还会被放到流水线寄存器?
    2019-10-27
    1
  • westfall
    之前不是说时钟周期是CPU频率的倒数吗?那时钟周期应该是固定的呀!
    2019-10-20
  • w 🍍
    内存访问这一步是在做什么呢, alu计算后就可以直接回写到寄存器吧....
    2019-10-10
  • DriveMan_邱佳源
    虽说流水线有提升cpu吞吐率,但是把流水线分成了n级,那么肯定有一级是读取内存的,这步是最耗时,整个流水线会因为这一步而拖迟了时间,也会因为这一步而致使一部分级别处于等待状态,所以重点是如何解决最原始最拖迟的读内存操作。
    2019-10-08
  • 活的潇洒
    老师的比喻使我们理解起来非常容易、给老师点赞
    day20 笔记:https://www.cnblogs.com/luoahong/p/11434290.html

    作者回复: 谢谢支持👍

    2019-09-01
  • 栋能
    有个问题:“五级的流水线,就表示我们在同一个时钟周期里面,同时运行五条指的不同阶段。这个时候,虽然执行一条指令的时钟周期变成了 5,但是我们可以把 CPU 的主频提得更高了”。这句话理解起来好有问题。一条指令分为五级流水操作,都在同一个时钟周期,为什么会在同一个时钟周期?而后面是种周期变为5。这两个时钟周期是指同一个东西?
    2019-07-03
    1
  • 张益达
    老师你好,有点疑问。取得指令(Fetch)- 指令译码(Decode)- 执行指令(Execute) 这三个步骤是同时进行的?如果是,是怎么样在还没取得指令完成的情况下同时进行下两个步骤的?
    2019-06-28
    1
  • Geek_54edc1
    一个时钟周期可以完成多条指令的不同阶段,即一个时钟周期,多个独立的组合逻辑电路组件可以同时运行,因此一个时钟周期完成一条简单指令的说法就不准确了
    2019-06-25
收起评论
22
返回
顶部