深入浅出计算机组成原理
徐文浩
bothub 创始人
70432 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
深入浅出计算机组成原理
15
15
1.0x
00:00/00:00
登录|注册

23 | 冒险和预测(二):流水线里的接力赛

课后思考
推荐阅读
总结延伸
操作数前推技术
解决方案
流水线冒险问题
计算机组成原理

该思维导图由 AI 生成,仅供参考

上一讲,我为你讲解了结构冒险和数据冒险,以及应对这两种冒险的两个解决方案。一种方案是增加资源,通过添加指令缓存和数据缓存,让我们对于指令和数据的访问可以同时进行。这个办法帮助 CPU 解决了取指令和访问数据之间的资源冲突。另一种方案是直接进行等待。通过插入 NOP 这样的无效指令,等待之前的指令完成。这样我们就能解决不同指令之间的数据依赖问题。
着急的人,看完上一讲的这两种方案,可能已经要跳起来问了:“这也能算解决方案么?”的确,这两种方案都有点儿笨。
第一种解决方案,好比是在软件开发的过程中,发现效率不够,于是研发负责人说:“我们需要双倍的人手和研发资源。”而第二种解决方案,好比你在提需求的时候,研发负责人告诉你说:“来不及做,你只能等我们需求排期。” 你应该很清楚地知道,“堆资源”和“等排期”这样的解决方案,并不会真的提高我们的效率,只是避免冲突的无奈之举。
那针对流水线冒险的问题,我们有没有更高级或者更高效的解决方案呢?既不用简单花钱加硬件电路这样“堆资源”,也不是纯粹等待之前的任务完成这样“等排期”。
答案当然是有的。这一讲,我们就来看看计算机组成原理中,一个更加精巧的解决方案,操作数前推

NOP 操作和指令对齐

确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

操作数前推技术是解决计算机流水线冒险问题的高效方案。通过在硬件层面制造一条旁路,使得一条指令的计算结果可以直接传输给下一条指令,避免了多余的NOP操作,从而提高了CPU的效率。本文以MIPS指令为例,详细解释了操作数前推技术的原理和实现方式。此外,操作数前推技术还可以与流水线停顿结合使用,进一步提高CPU的性能。总的来说,操作数前推技术是一种精巧的解决方案,能够有效解决流水线冒险问题,提高CPU的运行效率。如果读者想深入了解操作数前推相关内容,可以阅读《计算机组成与设计:硬件/软件接口》的相关章节。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出计算机组成原理》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(26)

  • 最新
  • 精选
  • 曾经瘦过
    感觉老师的讲课顺序特别好 方案都是一点点演变来的 那些看起来高大上的解决方案 都是从最笨的方法开始慢慢优化演变而来的 不是直接一步到位的讲解 能够更好的理解

    作者回复: 谢谢,这个也是我期望这个专栏达到的效果。

    2019-09-27
    6
    55
  • J.D.Chi
    1. 我可以这么理解吗?就是把一个方法: int main(int a , int b){ int c = a + b; return c; } 变成 int main(int a , int b){ return a + b; } 2. 看了之后有一个想法会不会那个时候的程序员的编程代码里是会考虑到汇编指令这一块,后来随着机器性能的发展,现在的程序员在日常写代码对这块就不太重视了,于是一些《代码简洁之道》一类的书就应运而生了。一方面包括了从视觉上对代码的规范,另一方面也回归到对指令考虑这一块。

    作者回复: J.D.同学 你好,第一个不能这么理解,只有没有前后依赖的指令才会在流水线里可以同时执行。实际上,你给的代码其实编译器通常会自动优化到后面那个状态。 早年的程序员的确会考虑得很底层,因为内存空间很小。

    2019-09-28
    2
    1
  • 刘桢
    今天考研冲北邮!
    2019-06-18
    7
    39
  • Geek
    后面这些就有点难了,对于非计算机专业的我来说,不过就当看小说了,会一直看下去。。。
    2019-06-17
    2
    17
  • 拯救地球好累
    ---总结--- 为了避免流水线停顿中插入过多的NOP指令,我们引入了操作数前推技术。 具有依赖关系的两条指令,后一条指令的输入往往来自于前一条指令执行之后写入的寄存器,而操作数前推则通过在硬件上制造一条旁路让前一条指令的执行结果直接作为后一条指令的输入,而无需等待前一条指令写回寄存器。 这就像工厂流水线中,上一道工序做好的半成品一般会先递送到某个储物柜上以供下个工序的工人使用,增加旁路后好比前一位工人直接将半成品递交给下一位工人,而减少了“放物品-取物品”这样的动作。
    2019-10-27
    15
  • 许先森
    cmp:取指令、译码、执行、访存、写回; jmp:取指令、译码
    2020-01-10
    12
  • 曾经瘦过
    cmp 指令是比较大小的指令 执行步骤感觉是 取指令 译码 取数据(访问内存 或者寄存器) 比较大小(执行) 出结果(写回) 应该是全的 jump指令是跳转的指令 执行步骤应该是 取指令 译码 跳转(执行) 没有访问内存和写回 的过程
    2019-09-27
    1
    8
  • Magic
    CMP需要使用ALU进行比较,比较结果需要写入状态寄存器,因此没有访存阶段。 JMP在控制器中直接修改PC寄存器,因此没有ALU执行和访存阶段
    2020-09-28
    7
  • haer
    我觉得:cmp没有“访存”,jmp没有“执行”和“访存”
    2019-06-17
    4
    7
  • 南山
    从指令作用理解,cmp是全的,jmp不需要回写~
    2019-06-17
    2
收起评论
显示
设置
留言
26
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部