IT铁人
上一次我们提到Pipeline可以提升速度,不过捷径一定比较难走,小时候完马力欧赛车也是捷径比较难进去或是很难通过。
Pipeline也是一样,会遇到一些为了加速而遇到的阻碍。
Pipeline主要遇到Hazard为下列三者︰
类型 | 原因 |
---|---|
Structural Hazard(结构危障) | 硬体资源不够多,导致在同一时间内要执行的多个指令无法执行。 |
Data Hazard(资料危障) | Pipeline中某一指令需要用到前面指令尚未产生的结果,也就是执行的指令所需的资料还无法获得。 |
Control Hazard(控制危障) | Branch的结果尚未产生时,後续的指令就已经进入Pipeline,如果决定要branch到别的位置便会发生错误。所以又称为Branch Hazard。 |
资源太少
如果我们只有一个单一记忆体,而不是两个分离的记忆体。那麽Instruction Memory跟Data Memory要同时被存取时,就会发生Structural Hazard。如下︰
这时候就会让记忆体被两个指令存取,会导致无法执行产生Hazard。
不过基本上都会把两个分开来执行啦,所以不用担心这个。
资料旧了
Data Hazard发生的情况是,前後的指令都有用到同一个Register,不过前面修改的值还没放回Register中,後面就直接对他取值,将导致资料是错误的状况,比如说以下状况:
这五个指令都有用到r1 Register,不过第一行的add结果要在最後的WB才会写回去Register中,导致後面的sub跟and都会拿到尚未修改的值,不符合原先的期望。
除了最後的xor因为在下一个Cycle才取值,一定没问题外,前面的or指令不会发生的原因为:WB在Cycle前半完成,而ID是在Cycle後半才开始,所以不会发生Data Hazard。
做白工
Control Hazard特别的事情在於不是每次Branch指令都会发生,而是万一Branch的结果为真(需要跳到别的位置执行),才会发生Control Hazard。以下图为例:
假设beq指令成立,要跳到64位址执行slt,那麽中间的and, or, sub等等的指令都需要作废,这时候就称为Control Hazard。
这次跟大家谈到了hazard的类型,下次会跟大家说明怎麽解决hazard。不知道聪明如你有没有想到什麽简单的解决方式呢?
上一篇 | 下一篇 |
---|---|
Pipeline | 在Hazard寻求解法是否搞错了什麽 |
跟大家补充一个小故事,BIOHAZARD这个字,其实就是我们熟悉的恶灵古堡系列,不过因为美国纽约有一个乐团已经把这个字注册为乐团名字,所以欧美版本就使用了现在大部份人熟悉的Resident Evil。
台湾使用了就是欧美版,听说中国大陆跟香港则继续使用BIOHAZARD。
BIOHAZARD | RESIDENT EVIL |
---|---|
<<: [第五只羊] 迷雾森林建筑工事 IV 专案环境设定 READY GO
>>: 【Day9】[资料结构]-杂凑表Hash Table
一、前言 认真使用 Obsidian 也已经 1 年了,这一路上学习到相当多的内容,才慢慢打造出今天...
本篇重点 api.activate_ca 启动下单电子凭证 Stock股票Order建立 api.a...
执行环境(Execution context) 函式执行环境 昨天有提到函式的作用域是限制在 fun...
上一篇谈到在 Angular 中使用 属性系结(Property binding) 的方法,也延伸了...
最近看了很多好书,看完的共通感想是,为什麽以前没人推荐我看这些?如果早点看,不知道可以少走多少弯路。...