Day-8 Hazard

Hazard

tags: IT铁人

Pipeline隐忧

上一次我们提到Pipeline可以提升速度,不过捷径一定比较难走,小时候完马力欧赛车也是捷径比较难进去或是很难通过。

Pipeline也是一样,会遇到一些为了加速而遇到的阻碍。

Hazard

Pipeline主要遇到Hazard为下列三者︰

类型 原因
Structural Hazard(结构危障) 硬体资源不够多,导致在同一时间内要执行的多个指令无法执行。
Data Hazard(资料危障) Pipeline中某一指令需要用到前面指令尚未产生的结果,也就是执行的指令所需的资料还无法获得。
Control Hazard(控制危障) Branch的结果尚未产生时,後续的指令就已经进入Pipeline,如果决定要branch到别的位置便会发生错误。所以又称为Branch Hazard。

Structural Hazard

资源太少

如果我们只有一个单一记忆体,而不是两个分离的记忆体。那麽Instruction Memory跟Data Memory要同时被存取时,就会发生Structural Hazard。如下︰

这时候就会让记忆体被两个指令存取,会导致无法执行产生Hazard。

不过基本上都会把两个分开来执行啦,所以不用担心这个。

Data Hazard

资料旧了

Data Hazard发生的情况是,前後的指令都有用到同一个Register,不过前面修改的值还没放回Register中,後面就直接对他取值,将导致资料是错误的状况,比如说以下状况:

这五个指令都有用到r1 Register,不过第一行的add结果要在最後的WB才会写回去Register中,导致後面的sub跟and都会拿到尚未修改的值,不符合原先的期望。

除了最後的xor因为在下一个Cycle才取值,一定没问题外,前面的or指令不会发生的原因为:WB在Cycle前半完成,而ID是在Cycle後半才开始,所以不会发生Data Hazard。

Control Hazard

做白工

Control Hazard特别的事情在於不是每次Branch指令都会发生,而是万一Branch的结果为真(需要跳到别的位置执行),才会发生Control Hazard。以下图为例:

假设beq指令成立,要跳到64位址执行slt,那麽中间的and, or, sub等等的指令都需要作废,这时候就称为Control Hazard。

下回预告

这次跟大家谈到了hazard的类型,下次会跟大家说明怎麽解决hazard。不知道聪明如你有没有想到什麽简单的解决方式呢?

上一篇 下一篇
Pipeline 在Hazard寻求解法是否搞错了什麽

BIOHAZARD

跟大家补充一个小故事,BIOHAZARD这个字,其实就是我们熟悉的恶灵古堡系列,不过因为美国纽约有一个乐团已经把这个字注册为乐团名字,所以欧美版本就使用了现在大部份人熟悉的Resident Evil。

台湾使用了就是欧美版,听说中国大陆跟香港则继续使用BIOHAZARD。

BIOHAZARD RESIDENT EVIL

<<:  [第五只羊] 迷雾森林建筑工事 IV 专案环境设定 READY GO

>>:  【Day9】[资料结构]-杂凑表Hash Table

Day 30: 总结篇 — 30 天的 Obsidian 学习之旅

一、前言 认真使用 Obsidian 也已经 1 年了,这一路上学习到相当多的内容,才慢慢打造出今天...

Day 12 - 下单电子凭证及Stock股票Order建立

本篇重点 api.activate_ca 启动下单电子凭证 Stock股票Order建立 api.a...

【Day04】执行环境与执行堆叠

执行环境(Execution context) 函式执行环境 昨天有提到函式的作用域是限制在 fun...

Day 23:开始来学资料系结:属性系结(二)

上一篇谈到在 Angular 中使用 属性系结(Property binding) 的方法,也延伸了...

离职倒数24天:说出内心烦恼、学到新知识、得到新的角度,三个愿望一次满足

最近看了很多好书,看完的共通感想是,为什麽以前没人推荐我看这些?如果早点看,不知道可以少走多少弯路。...