Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions W10D1-WGJ.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# W10D1笔记 —— Tomasulo Organization

## 问题引入

五级流水中,指令严格按照顺序发射、执行。因此,当流水线中相邻很近的两条指令存在相关性,就会产生data hazard,导致bubble停顿,降低效率。因此需要乱序执行,这会导致data hazard: **WAR, WAW, RAW**。

## 解决方法 —— Renaming

### 硬件上重命名

把指令翻译成微指令时,进行重命名,arch reg -> micro reg。

### 软件上重命名

编译器进行重命名。

### 记分牌算法

用指令的目标寄存器编号,作为后续指令需要获取的寄存器的标签。这样,**对于RAW问题,可以实现乱序执行**,因为如果R在W之前发射,那么R会依赖于W的目标寄存器,根据W的寄存器编号,会一直等待直至W正常完成。

但是,记分牌算法的缺点是显然的——它无法解决WAW和WAR这种pseudo问题。这是因为,对于同一寄存器,会进行多次修改,因此只用寄存器编号无法解决这种问题。

### Tomasulo算法

在记分牌算法的基础上,用指令的编号,作为后续指令需要获取的寄存器的标签。这样,将每次修改落在指令上,便**可以解决WAW和WAR问题**。

![](https://notes.sjtu.edu.cn/uploads/upload_970f3a8f27df9bbb60e0ad65f4dfcc3c.png)

一些部件:

* ROB:保证指令在提交是保序的
* RS:用于保留指令,等待寄存器数据准备完毕后执行ALU运算
* LSB:用于保证内存访问(确切地说,是写操作)顺序

#### Tomasulo算法的执行过程

* 1.Issue。fetch相应指令,并将其分发发射到各个部件中。
* 2.Execute。RS,ALU等进行相应的计算。
* 3.Commit。修改RF中的寄存器值,进行相应的MEM写,进行CDB广播。

#### 精确中断

利用ROB的保序性,可以实现精确中断。

35 changes: 35 additions & 0 deletions W14D1-WGJ.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# W14D1笔记 —— Review

## Pipeline

### Hazard
* Structure hazard (cache)
* Data hazard
—— ture: RAW (forwarding, compiler)
—— pseudo: WAW, WAR (renaming)
* Control hazard (predict, stall)

### 乱序

* 问题: 精准中断,跳转
* 解决: ROB保证提交顺序
* Tomasulo: Issue -> execute -> commit

### 解决control hazard
* 分支预测
* delay slot: 将后续一定会执行的指令放进delay slot来填充br产生的stall
* super block: 将分支合并,增大块,便于delay slot填充
```
A ___________
| | | | | |
B C -> ABD ABF ACG ACH
| | | |
D F G H
```
* 循环展开: 减少跳转

### Cache & Memory

$AMAT_{cache} = T_{hit} +\eta_{miss-rate}*T_{penalty}$

$AMAT_{mem} = T_{addr} +T_{access}+T_{trans}$
53 changes: 53 additions & 0 deletions W6D1-WGJ.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# W6D1笔记 ——Caches

## 为何要引入缓存cache?

* CPU的性能增长速度大于Memory,CPU($\mu Proc$)的处理速度远大于Memory($DRAM$);
* 引入cache可以让memory访问数据的速度适应CPU的处理速度,提高整体性能;
* 数据访问具有很强的空间本地性与时间本地性(locality),使用cache可以降低对内存的重复访问,提升性能。

## 什么是cache?

* 用于降低平均内存访问时间的结构,通常用SRAM技术实现,相对较小且处理快速;
* cache的有效性是基于数据访问的空间本地性与时间本地性(locality)的;
* 更广义来看,在体系结构的多层结构中,上一级都可以看作下一级的cache。如可以视寄存器是变量的cache,内存是外存的cache,等。

## 插入——关于Harvard结构
Harvard结构: 指令存储和数据存储分离
Von Neumann结构: 指令存储和数据存储共用
![](https://notes.sjtu.edu.cn/uploads/upload_7a69c94b0e84d738bb58c24f60acd3e3.png)


由于每条指令所需的平均时间
$$CPU_{time}=InstrCycle\times(\frac{ALU_{ops}}{Instr}\cdot CPI+\frac{Mem_{ops}}{Instr}\cdot ASMT)\times CycleTime$$

而若用Von Neumann结构设置cache,那么由于每条指令都需要访问cache,故若指令还需要访问数据,就会造成structure hazard;但是若用Harvard结构设置cache,那么虽然cache容量减少(分成instr-cache和data-cache),miss率增大,但是不会有structure hazard,所以很多时候用Harvard结构设置cache,综合效果比Von Neumann结构好。


## 如何提升cache的性能?

由于平均内存访问时间
$$AMAT_$=T_{hit}+\eta_{miss-rate}\times T_{penalty}$$
故提升cache性能,主要有三个方向:
* 降低命中时间$T_{hit}$
* 降低未命中率$\eta_{miss-rate}$
* 降低未命中处理时间$T_{penalty}$

本节课主要讨论如何降低未命中率$\eta_{miss-rate}$。

## cache未命中的原因

cache未命中的原因主要有:
* **强制性失效(compulsory)**:首次访问时,cache中没有对应的内容,亦称冷启动失效/首次访问失效;
* **容量失效(capacity)**:cache的容量有限,如果程序执行时所需的内容不能全部存入 Cache 中,则当某些块被替换后,若又重新被访问,就会发生失效;
* **冲突失效(conflict miss)**:若太多的块映像到cache的同一位置中,则会出现该位置上内容被别的块替换、然后又被重新访问的情况;
* **相干性失效(coherence)**:多核CPU中,如果一个核改变了内存的内容,为保证数据正确性,其他核的cache的相应内容会失效,防止不一致数据的出现。

一些解决方案:
* 预热,减少compulsory miss
* **一定程度上**,增大cache容量,减少capacity miss
* **一定程度上**,增加cache的关联路数,减少conflict miss

![](https://notes.sjtu.edu.cn/uploads/upload_f5810f4f49e580777ae452206223e332.png)

从图中可以看出,不论是增大容量还是增大关联路数,其对cache的miss率减少作用都是有限的,并不是无限增加便是最好的。