计算机体系结构
Chapter 1
一些公式


芯片进化
- 
Moore's Law 
- 
Dennard Scaling(微缩) 
- 
Post-Moore's Era - 
继续微缩 
- 
封装技术 
- 
高性能计算(如量子计算) 
 
- 
- 
Multi-Core parallelism - 
Amdahl's Law: \(S = \frac{1}{(1-P)+\frac{P}{N}}\) 
- 
Data-level parallelism 
- 
Task-level parallelism 
- 
Instruction-level parallelism 
- 
Thread-level parallelism 
 
- 
种类
- 
PMD(便携式移动设备) 
- 
Desktop 
- 
Server 
- 
Cluster / WSC(warehouse-scale computer) 
- 
Embedded 
Power & Energy
Power(功率) 代表单位时间的能量消耗,单位是瓦特
Energy(能量) 代表总的能量消耗,是功率对时间的累积
因此,功率低不代表最终的能量消耗低
Energy-Save Strategy
- 
Do nothing well 关闭不必要的任务 
- 
DVFS(Dynamic Voltage and Frequency Scaling) 动态调整电压和频率 
- 
Design for typical case 为典型情况设计 
- 
Overclocking - Turbo mode 超频,缩短任务时间来降低总消耗 
Reliability
一些概念
- MTTF(Mean Time To Failure)
- MTTR(Mean Time To Repair)
- MTBF(Mean Time Between Failure) = MTTF + MTTR
- Availability = MTTF / MTBF
- 
FIT(Failures per billion hours) = \(\frac{1}{MTTF}\)  
Fault (潜在BUG)-> Error(触发了潜在BUG) -> Failure(造成明显后果)
- 
Dependability V/S Redundancy - 
Time Redundancy 多次重复执行同一个任务,来避免错误 
- 
Resource Redundancy 多个资源,如多个disk, 来降低系统崩溃的概率 
 
- 
RAID
Performance
- CPU time
- Elapsed time(Wall-clock time / Response time)
- 
Benchmark Benchmark是一种用来评估计算机性能的方法,通常是一段程序或者一组程序,用来测试计算机的性能 - SPEC(Systerm Performance Evaluation Corporation)
 
Quantitative Principle
- 
Parallelism - Amdahl's Law
 
- 
Locality - 
Temporal Locality(时间局部性) 
- 
Spatial Locality(空间局部性) 
 
- 
- 
CPU Performance - 
\(CPU_{time} = IC \times CPI \times T\) - 
\(CPI = \frac{Cycles}{Instruction}\) 
- 
\(T = \frac{Seconds}{Cycle}\) 
- 
\(IC = Instruction Count\) 
 
- 
- 
\(IPC = \frac{1}{CPI}\)(CPU throughput) 
 
- 
Chapter 2
一些概念
- Latency- Access Time: 从CPU发出请求到数据返回的时间
- Cycle Time: 两次连续的访问之间的时间
 
- Bandwidth- Throughput: 每秒传输的数据量
 
Miss
| 种类 | 解释 | 
|---|---|
| compulsory miss | 冷启动失配,刚上电cache是空的,所以不论什么访问都要miss一次。cache越大compulsory miss越多。 | 
| capacity miss | cache的容量大小不满足程序局部性时发生的失配,称为容量失配。cache的总大小增大,容量失配率减小,与关联度无关。 | 
| conflict miss | 在采用组关联和直接映像方式的cache中,主存的很多块都映射到cache的同一块,如果某块本来在cache中,刚被替换出去,又被访问到。有点像 OS 里页替换时讲到的“抖动”。关联度越大,Conflict失配越小。 | 
优化DRAM
- Timing Signal: 连续访问不用再次激活
- Spatial Locality: 一次读取多个数据
- Wider DRAM: 提高贷款
- DDR: Double Data Rate
- Multiple Banks: 并行访问
- Dynamic Energy Saving: 动态调整电压和频率
优化Cache
Average Memory Access Time (AMAT) = Hit Time + Miss Rate x Miss Penalty
- 
Larger Block Size - 
降低compulsory miss rate 
- 
降低static power 
- 
增加miss penalty(larger blocks) 
- 
增加capacity/confilct miss rate (fewer blocks) 
  
- 
- 
Larger Cache Size - 
降低miss rate(capacity miss) 
- 
增加hit time 
- 
增加cost, power 
 
- 
- 
Higher Associativity - 
降低conflict miss rate 
- 
增加hit time 
- 
增加power 
 
- 
- 
Multilevel Caches - 
减少 miss penalty 
- 
减少power 
- 
Multilevel inclusion L1 cache的所有块都在L2 cache中,L2 cache的所有块都在L3 cache中,以此类推 
- 
Multilevel exclusion L1 cache的所有块都不在L2 cache中,L2 cache的所有块都不在L3 cache中,以此类推 
 Tip AMAT = Hit time\(_{L1}\) + Miss rate\(_{L1}\) x(Hit time\(_{L2}\) + Miss rate\(_{L2}\) x Miss penalty\(_{L2}\)) 
- 
- 
Prioritize Read Misses Over Writes - 减少miss penalty
 
- 
Avoiding Address Translation - 
减少hit time 
- 
手段 - 
Virtual Address -> Physical Address 
- 
TLB(Translation Lookaside Buffer) 
 
- 
 Virtual Memory 本质上,初始的想法就是每次读取数据读两次,一次是到页表获取物理地址,一次是从物理地址读取数据 为了减少开销,使用TLB这个高速cache(不在内存中,速度比内存快)来存储最近访问的数据的物理页地址,从而减少访问页表的次数  page size- Small: 减少内存碎片带来的浪费
- Large: 减少TLB entries 和 TLB miss rate
- Multiple
 
- 
超级优化

- 
Small and Simple L1-Cache - Small size- 增加时钟主频
- 减少功耗
 
- Lower associativity- 减少hit time
- 减少功耗
 
 
- Small size
- 
Way Prediction - 降低conflict miss 和 hit time
- 添加block predictor bit,每次先通过预测的方式找到对应的block,同时并行进行正常的比较选择
 
- 
Pipelined Access - 通过pipeline的方式来访问cache
- 增加带宽
- 会导致更高的延迟和预测penalty
 
- 
Multibanked Caches - 通过多个bank并行访问,增大带宽,减少访问时间
- 一般需要把地址“打散”到不同的bank中,从而可以并行访问
 
- 
Non-blocking Caches - 当出现miss时,不会阻塞后续的访问,从而提高效率- hit under miss
- miss under miss
- hit under multiple misses
 
 
- 当出现miss时,不会阻塞后续的访问,从而提高效率
- 
Critical Word First - 每次miss时总是从内存中读取一片数据,但CPU需要的只需要其中一部分。因此可以先返回cache line中需求的关键数据,然后再返回其他数据
- 降低miss penalty
 
- 
Early Restart - 读到CPU需要的数据后,CPU可以先开始执行,而不用等到整个cache line都读取完毕(往往就是配合上面的Critical Word First)
 
- 
Merging Write Buffer - 把多个写请求打包成一个写请求,减少写请求的次数
- 降低miss penalty
 
- 
Compiler Optimization - 通过编译器优化,增加局部性,从而减少miss rate
- 
Loop interchange 通过调整循环次序,使得内存访问更加连续 Example 
- 
Blocking 通过分块,使得内存访问更加连续,如矩阵乘法 Example 
 
- 
Hardware Prefetching - 通过预测CPU的访问模式,提前把数据读入cache
- 降低miss rate和miss penalty(但是也可能造成额外的miss)- Instruction prefetch
- Data prefetch
 
 
- 
Compiler Prefetching - 通过编译器预测CPU的访问模式,加入prefetch,提前把数据读入cache- Register prefetch
- Cache prefetch
 
- 降低miss rate和miss penalty
 
- 通过编译器预测CPU的访问模式,加入prefetch,提前把数据读入cache
- 
HBM - 先进封装技术,使用high-bandwidth memory作为L4 cache(对于一般的DRAM,需要多次访问才能读取完整的cache line,一次访问tag, 一次访问data)- 把 tag 和 data 放在同一行中
- alloy cache, 把tag和data混合在一起
 
 
- 先进封装技术,使用high-bandwidth memory作为L4 cache(对于一般的DRAM,需要多次访问才能读取完整的cache line,一次访问tag, 一次访问data)
Protection
Virtual Memory
4 Tasks
- User Mode / Kernel Mode
- Accessible Processor state
- Mode Switch
- Limit Memory Access
Virtual Machine
VM: a protection mode with a much smaller code base than the full OS
VMM: software that supports VMs
Host: underlying OS
- 
优势 - 同一个物理机上可以运行多个虚拟机
- 多个虚拟机可以共享硬件资源
- 隔离性、安全性、隐私性高
 
- 
劣势 - 微小的性能下降
 
ISA

Chapter 3
ILP (Instruction Level Parallelism)
RiscV




Pipelining
通过流水线并行提高总体的运行效率(latency hidding)
注意load balance,或者增加流水线层级来降低某一环节的延迟,因为流水线的频率取决于最慢的环节
- 
Floating-Point Operation 一般来说,浮点数运算的延迟比整数运算要长 - 
降低时钟频率:导致整个流水线其他指令的速度也会下降 
- 
多个功能单元:增加硬件成本,从而加速浮点数运算 
 
- 
- 
Structure Hazard - 
Hardware Bandwidth - 通过增加硬件资源,增加带宽,从而提高效率
 
- 
Interlock Detection - ID、MEM冲突,进行重新排序
 
 
- 
- 
Data Hazard - 
WAW(Write After Write) - 两个指令同时写入,后者会覆盖前者的结果,可能会由于指令运行速度不同而导致错误(比如前面的指令运行较慢,后面的指令先写入,导致最终留下了前面指令的写入结果)
 
- 
RAW(Read After Write) - 一个指令读取了另一个指令的写入结果,但是另一个指令还没有写入,导致读取错误的结果,因此需要等待另一个指令写入完成再读取
 
- 
WAR(Write After Read) - 一个指令写入了一个寄存器,另一个指令读取了这个寄存器,但是读取的指令先执行,导致读取错误的结果,因此需要等待写入完成再读取
 
 
- 
- 
Exploitation - 
Compiler-based static parallelism - 
Loop unrolling - 通过展开循环,增加指令级并行性
 
- 
Software pipelining - 通过重组指令,增加指令级并行性
 
 
- 
- 
Hardware-based dynamic parallelism 
 
- 
- 
Data Dependence(真依赖) 只有RAW 
- 
Name Dependence(假依赖) Question (假设指令i先于指令j执行 & i,j指令靠得很近) - Anti Dependence(WAR):i读取Rx, j写入Rx,本质上没有依赖,但是i,j的执行顺序不能颠倒
- Output Dependence(WAW):i写入Rx, j写入Rx,本质上没有依赖,但是i,j的执行顺序不能颠倒
 Register Renaming: 通过重命名寄存器,使得不同指令可以使用相同的寄存器,从而避免数据冲突 
- 
Control Dependence - 
Branch Hazard - Stall: 等待分支结果
- 
Predict: 预测分支结果 - 
Static Prediction 固定预测策略 
- 
Dynamic Prediction 越复杂,消耗越大,利用的历史信息越多 - 1-bit predictor(last time BHT):根据上一次的结果来预测
     
- 2-bit predictor(BHT):根据多次的结果来预测
      
- Branch-target buffer(BTB):存储分支目标地址,减少分支延迟
     
 others- Local predictor:根据当前指令的历史来预测
- Correlating predictor:根据多个不同指令的历史来预测
- Two-level predictor:根据两个预测器的结果来预测,获得更多global信息
- Hybrid / Alloyed predictor:多种预测器混合使用
 
- 1-bit predictor(last time BHT):根据上一次的结果来预测
    
 
- 
- 
Delayed Branch: 延迟分支,即先执行后面一些无关指令,等待分支结果(尽早解决,减少延迟) 
 
- 
Loop Unrolling - 减少循环branch跳转
- 但是要考虑Instruction Cache容量问题,不一定展开越多越好
 
- 
Dynamic Scheduling - Out-of-order
 
 
- 
Scoreboard
使用数据流的形式,通过硬件来解决数据冲突
本质上利用乱序执行来提高效率
- 
Four Steps - Issue: 选择可以执行的指令(如果指令对应的功能部件空闲,且指令要写的目标寄存器没有别的指令将要写< WAW 冒险>)
- Read Operands: 读取操作数(RAW 冒险)
- Execution
- Write Back: 结果写回(WAR 冒险)
 
- 
Functional Unit Status - Busy : 该功能单元是否被占用
- Op : 该功能单元执行的指令
- Fi : 目标寄存器
- Fj, Fk : 源寄存器
- Qj, Qk : 指向源寄存器的计算单元的指针
- Rj, Rk : 源寄存器是否就绪,读完之后状态会改写成No
 
Tomasulo Algorithm
消除WAW, WAR依赖
通过添加RS(Reservation stations)存储操作数
- 
Register Renaming - WAR: rename latter/destination
- WAW: rename former
 
- 
Seven fields: - Op : 操作类型
- Qj, Qk : 源操作数
- Vj, Vk : 源操作数的值
- A : load/store地址
- Busy : 是否被占用
 
- 
Three Steps - Issue: 选择可以执行的指令(唯一标准是指令对应通路的保留站是否有空余位置)
- Execution: 从保留站中读取操作数,执行指令
- Write Back: 结果写回
 

Danger
Scoreboard由于是从寄存器堆读取数据,因此会有一个RO阶段,并且应该是等WB阶段完成后下一个阶段才能读
Tomasulo由于保留站会听取CDB的广播,因此可以在WB阶段之后立即开始执行,不用再读(有些load指令这种等一个周期是为了计算地址)
ROB
通过Reorder Buffer来解决数据冲突
3 fields: instruction type, destination address, value
本质上相当于给寄存器堆建立了一个缓冲区,用来存储指令的结果,给指令执行增加一个commit阶段,从而实现乱序执行、顺序commit
在Tomosulo算法的基础上,把Qj,Qk改为指向ROB的指针,并增加一个指向ROB的指针,用来指向下一个commit的指令

Multi-Issue Processor


- 
SuperScalar 通过多个流水线来提高效率,每次流出多个指令 
- 
VLIM(Very long instruction word) 将一个很长的指令拆分成多个 
- 
Super Pipeline 阶段数超级多的流水线,每个阶段进一步细分 
chapter 4

DLP
SIMD
- 
Vector Processor D = A * (B + C) - 
Horizontal: 一行行做  
- 
Vertical: 一列列做  
- 
Horizontal + Vertical: 行分组,一列列算  
  Improvemnt - Parallelism: 通过多个不同功能单元并行
- link:类似forwarding, 把结果直接传递,而不用重复存储
- Segments: 把数据分成多个片段,分别计算
- Multi-Processor: 多个处理器并行计算- Multiple-Lane: 多个lane并行计算
- Gather-Scatter: 通过gather和scatter,即引用index来提高效率
 
 
- 
- 
Array Processor - 通过多个处理器并行计算,每个处理器计算一个元素
- 关键点是如何连接通信网络,实现数据的传递
 
- 
GPU: Multi-Thread SIMD 
- 
LLP: Loop-Level Parallelism - 关节点在判断/解决循环能否并行化,“跨循环迭代”
 Example 
TLP
MIMD
分类
- 
Multiple-Processor: Based on shared memory  
- 
Multiple-Computer: Based on message passing   
- 
Architecture  SMP & DSP - 
UMA: Uniform Memory Access(SMP)  每个处理器地位均等,访问内存的时间相同 每个处理器也可以有自己的cache、private memory等 
- 
NUMA: Non-Uniform Memory Access(DSP)  访问本地内存的时间短,访问远程内存的时间长 如果有Cache,就会有Cache Coherence问题,本质就是让所有处理器使用时好像在共用同一个Cache 
- 
COMA: Cache-Only Memory Access  没有内存,只有cache,通过cache来访问数据, 本质上是NUMA的一种变种 
- 
*MPP: Massive Parallel Processing  
- 
*COW: 在MPP基础上,实现异构体系结构  
 
- 
Memory Consistence & Cache Conherence

- 
Memory Consistence: 多线程访问同一位置时,先写后读,保证读到的是最新的数据 
- 
Cache Conherence: 保证所有处理器使用的是同一个cache 
Cache Coherence
UMA: Snoopy Protocol
NUMA: Directory Protocol
Snoopy Protocol
- 
Write through  
- 
Write back - 
CPU 层面  
- 
Bus 层面  
 
- 
- 
MSEI   Example  
Directory Protocol
本质上是对BUS的一种优化,通过Directory优化数据通信与传递
其中Shares就用来记录每个物理块在哪些处理器上有副本,从而方便查找
- 
CPU 层面  
- 
Directory 层面  
*Memory Consistence
- 
Relax allow reads and writes to complete out of order, but to use synchronization operations to enforce ordering  Example- 
TSO  
- 
PSO  
 
- 

