diff --git a/W10D1-WGJ.md b/W10D1-WGJ.md new file mode 100644 index 0000000..2c5473e --- /dev/null +++ b/W10D1-WGJ.md @@ -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的保序性,可以实现精确中断。 + diff --git a/W14D1-WGJ.md b/W14D1-WGJ.md new file mode 100644 index 0000000..7e13d02 --- /dev/null +++ b/W14D1-WGJ.md @@ -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}$ diff --git a/W6D1-WGJ.md b/W6D1-WGJ.md new file mode 100644 index 0000000..fd1d205 --- /dev/null +++ b/W6D1-WGJ.md @@ -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率减少作用都是有限的,并不是无限增加便是最好的。