22 | 冒险和预测(一):hazard是“危”也是“机”
徐文浩
该思维导图由 AI 生成,仅供参考
过去两讲,我为你讲解了流水线设计 CPU 所需要的基本概念。接下来,我们一起来看看,要想通过流水线设计来提升 CPU 的吞吐率,我们需要冒哪些风险。
任何一本讲解 CPU 的流水线设计的教科书,都会提到流水线设计需要解决的三大冒险,分别是结构冒险(Structural Hazard)、数据冒险(Data Hazard)以及控制冒险(Control Hazard)。
这三大冒险的名字很有意思,它们都叫作 hazard(冒险)。喜欢玩游戏的话,你应该知道一个著名的游戏,生化危机,英文名就叫 Biohazard。的确,hazard 还有一个意思就是“危机”。那为什么在流水线设计里,hazard 没有翻译成“危机”,而是要叫“冒险”呢?
在 CPU 的流水线设计里,固然我们会遇到各种“危险”情况,使得流水线里的下一条指令不能正常运行。但是,我们其实还是通过“抢跑”的方式,“冒险”拿到了一个提升指令吞吐率的机会。流水线架构的 CPU,是我们主动进行的冒险选择。我们期望能够通过冒险带来更高的回报,所以,这不是无奈之下的应对之举,自然也算不上什么危机了。
事实上,对于各种冒险可能造成的问题,我们其实都准备好了应对的方案。这一讲里,我们先从结构冒险和数据冒险说起,一起来看看这些冒险及其对应的应对方案。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
CPU流水线设计中的冒险问题包括结构冒险和数据冒险。结构冒险是硬件资源竞争问题,可通过增加资源或内存拆分解决。数据冒险涉及程序逻辑层面的数据依赖,如先写后读、先读后写和写后再写。这些依赖关系需要保证正确的执行顺序,否则程序会出错。文章通过实例和比喻生动地解释了这些技术概念,让读者快速了解CPU流水线设计中的挑战和解决方案。文章还介绍了解决数据冒险的流水线停顿方法,但这会牺牲CPU性能。下一步将探讨更高级的解决方案,如操作数前推、乱序执行和分支预测技术。整体而言,本文深入浅出地介绍了CPU流水线设计中的挑战和解决方案,适合对计算机体系结构感兴趣的读者深入学习。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出计算机组成原理》,新⼈⾸单¥68
《深入浅出计算机组成原理》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(48)
- 最新
- 精选
- 记忆犹存计算机硬件和软件最常用的思想:增加一个中间层。
作者回复: 没错,不过这个思路其实也是软件架构慢慢容易“腐化”的原因。随着中间层变多,系统的复杂度和熵在增加,如果没有精心维护,容易最后变成一个难以维护的代码库。
2019-09-10322 - 三件事请问下老师,MIPS 的 delay slot 和流水线冒泡是一样的吗?老师可以讲解下 delay slot 吗?
作者回复: 三件事同学, 你好,delay slot可以认为是就是一个流水线冒泡啦。可以理解为,流水线冒泡是一个抽象概念,delay slot是MIPS对这个的具体实现和解决方案。
2020-02-1626 - Geek_32100dhazard这个词很有意思,我自己生物专业,第一次接触hazard这个词是生物专业文献里的harzardous和biohazard,感觉“危害”这个义项用的更加频繁一点,“危机”这个义项少一点,“机会”“机遇”“冒险”这个义项更加少见;查了一下它的词源,原来开始是赌博相关的,进而引申出机会机遇的意思,再引申出危机危害的意思,词汇义项演变挺有意思。先面试查到的词源,供大家参考理解: hazard (n.) c. 1300, name of a game at dice, from Old French hasard, hasart "game of chance played with dice," also "a throw of six in dice" (12c.), of uncertain origin. Possibly from Spanish azar "an unfortunate card or throw at dice," which is said to be from Arabic az-zahr (for al-zahr) "the die." But this is doubtful because of the absence of zahr in classical Arabic dictionaries. Klein suggests Arabic yasara "he played at dice;" Arabic -s- regularly becomes Spanish -z-. The -d was added in French through confusion with the native suffix -ard. Sense evolved in French to "chances in gambling," then "chances in life." In English, sense of "chance of loss or harm, risk" first recorded 1540s.
作者回复: 👍 这个追根朔源好
2023-05-02归属地:广东21 - 程序水果宝为啥把内存拆成程序内存和数据内存这两部分以后就不能根据实际情况动态分配内存了?
作者回复: 程序水果宝同学, 你好。这样分配的情况下,我们的程序指令就不能放到数据内存里面去了呀。
2020-02-101 - 易儿易一路纵队,前边有人停下系鞋带,后边所有人都得原地踏步踏,不然就得踩着脑袋过去了……2019-06-157158
- 瀚海星尘因为如果前一个指令插入nop后一个指令不插,那么当前指令被延迟执行的阶段就会和下一个指令的统一阶段在同一个周期内一起执行,而这是电路结构不允许的,统一阶段同一周期只能有单一输入。2019-07-2633
- -W.LI-先写后读:数据依赖,读依赖于之前的写正常的依赖关系所以叫数据依赖。 先读后写:反依赖,要保证读到写之前的数据,与正常的相反叫反依赖。 写完再写:输出依赖。两次写操作顺序反了的话输出就错了。所以叫输出依赖。 记不住不晓得这么理解可以么2019-06-2318
- coder用了这么久的HHKB都不知道普通键盘还有锁键的问题🌚🌚🌚2019-06-1436
- 黄序如果拆分为数据内存和程序内存,那么我们的程序指令就不能放到数据内存里面去了,那么程序内存中就需要增加指向数据内存的指针,用来程序运行时从数据内存中获取数据;这样一来,一是增加了内存的占用,二是增加了程序运行的复杂度,如果我们在一个程序中用到了几千个数据,我们就要取几千次数据,这种延时对于内存和CPU而言,是无法忍受的。同时,如果多核CPU之间需要访问相同的内存地址,就可能出现竞争的问题;但是如果在中间增加一层缓存,那么就可以提升访问的速度,达到CPU的容忍程度,并且多核CPU之间也不需要因为要访问相同的内存地址而出现竞争的问题。但是缓存的存在就导致了数据原子性和一致性的问题,所以才需要进行加锁或者volatile等关键字(java)2021-09-064
- Jason为了解决内存的结构冒险,将高速缓存分为数据缓存和指令缓存,但是在访问内存时问题仍然是存在的,能不能在内存中添加两个地址译码器?2020-03-044
收起评论