计算机组成
因此我只记录了一下自己遇到的重难点,以及自己的一些其他思考
Chapter 1
Eight Great Ideas in Computer Architecture
- 
Design for Moore's Law Moore's Law: The number of transistors on a chip will double about every 18 - 24 months. - 为了追求更高的性能,我们可以通过增加晶体管的数量来提高计算机的性能。但是,随着晶体管数量的增加,计算机的功耗和散热问题也会变得越来越严重,遇到功耗墙等问题。
 
- 
Use Abstraction to Simplify Design - 计算机的多层次抽象结构:数字逻辑、指令集架构、操作系统、编程语言、应用程序等。
 
- 
Make the Common Case Fast - 通过优化运行最多的操作来提高计算机的性能。
 
- 
Performance via Parallelism - 并行加速
 
- 
Performance via Pipelining - 流水线加速
 
- 
Performance via Prediction - 通过预测操作提高性能,如分支预测,缓存预读等
 
- 
Hierarchy of Memories - 
计算机的存储器层次结构,如下:   
 
- 
- 
Dependability via Redundancy - 利用冗余提高系统可靠性,即多保险,如备份等
 
Performance
主要要知道专有名词的定义,计算方法相对还是简单的
- 
Performance = 1 / Execution Time 
- 
Execution Time = Clock Cycles * Clock Cycle Time 
- 
CPI (Cycles Per Instruction) = Clock Cycles / Instructions 
- 
MIPS (Million Instructions Per Second) = Frequency / CPI / \(10^6\) 
Chapter 2
Risc-V 的指令集架构
- 
以字节(1 byte = 8 bit)为最小寻址单位 
- 
Little-Endian 小端存储 
- 
words align 对齐不需要(虽然会影响效率) 
- 
指令(程序)被当作数据存储在内存中 
- 
寻址方式  
指令汇总
- 
指令格式  
- 
指令集  
- 
寄存器使用 Fast locations for Data  
一些应用
- 
RISC-V 的跳转指令 - 
offset 是基于当前指令的地址的偏移,这不同于其他一些汇编是基于下一条指令的偏移的。即如果是跳转语句 PC 就不 +4 了,而是直接 +offset 
- 
branch/jal指令的跳转为自动加上 imm * 2,因此手写参数时可以视为以4为基数 
 
- 
- 
switch case - 通过记录一个跳转表实现多个分支的跳转
 
- 
basic block - 没有分支结构的代码块,可以通过一些优化手段提高性能
 
- 
procedure call - 
caller: jal ra, procedure (PC + 4 -> ra, PC -> procedure) 
- 
callee: jalr x0, 0(ra) (ra -> PC) 
- 
使用 sp 栈指针开辟栈空间,将参数保存在栈中并在调用结束后释放栈空间,恢复相应的寄存器。 - 
ra 保存返回地址 
- 
通过 sp + offset / fp(进入程序时的栈顶) + offset 的方式访问栈中的数据 
- 
a0 - a7 用于传递参数,返回值通过 a0 传递 
- 
t0 - t6 为临时变量,可以不用管 
- 
s0 - s11 必须保存 
 
- 
- 
leaf procedure(没有递归调用): exhaustively use temporary registers then must-saved registers 
- 
atomic operation - 
锁存指令对,如 在读取数据的同时,将数据锁定 在写入数据的时候,检查数据是否被修改(rd1 = 0),如果没有则写入 最终结果为(rd2 = 0)则写入成功(rd1 = rs, rs1 = rs2),否则写入失败 atomic swapagain: lr.d x10, (x20) // load-reserve Mem[x20] to x10(x10 = 0 now) sc.d x11, (x20), x23// store-conditional x23 to Mem[x20] bne x11, x0, again // if x11 != 0, failed add x23, x0, x10 // swap x23 and Mem[x20]程序编译
 
- 
 
- 

- 
Compiler -> Assembly Language 
- 
Assembler -> Object Module   
- 
Linker -> Executable Program - 
Static Linking - 将所有的库文件都链接到一个可执行文件中
 
- 
Dynamic Linking - 在运行时再链接使用到的库文件函数
 
  
- 
- 
Loader  
Chapter 3
数的表示
- 在各种课程内已经出现过好多次了,没什么特别好说的
运算
- 
关于 overflow (同号相加出异号)的处理 (最后一位 Cin xor Cout = 1) - 
ALU detection - Exception
 
- 
Overflow log - Store instruction address in a special register EPC
 
- 
Jump to exception handler - 
Correct & Return 
- 
Return with error code 
- 
Abort program 
 
- 
 
- 
- 
Addition - 
Carry Ripple Adder (数逻讲过,略) 
- 
Carry Lookahead Adder (CLA) - 
Generate: Gi = Ai & Bi 
- 
Propagate: Pi = Ai | Bi 
- 
Carry: Ci = Gi | (Pi & Ci-1) 将递推式不断展开,可以得到每一个Ci的表达式,这样就可以并行进行每一位的计算,大大提高了速度 不过随着位数的不断增加,硬件复杂度也会不断增加,因此实际上将会每4位或者8位作为一个单元,然后再进行并行计算  如上图,根据输入,通过每个小单元里的CLA 可以算出每个小 pi, gi 同时,可以计算得出每个大的 Pi, Gi, 然后通过大的 CLA 可以得出每个大的 Ci 这个Ci再传入每个小的 CLA, 就可以并行算出最终的结果了 
 
- 
- 
Carry Select Adder (CSA) - 
利用 预测 & 冗余的方法 
- 
相当于对上述CLA的一个改进,预先将 Cin = 0 / 1 的可能值都算出来,然后根据输入的 Cin 选择其中一个 
 
- 
- 
slt (set less than) - a < b --> a - b < 0
 
 
- 
- 
Multiplier && Division 
佬的笔记很详细了
核心就是充分利用结果寄存器,将 乘数 / 被除数 放到寄存器的右半冗余部分进行运算,并且变乘除法为加减法
Booth 算法,减少“1” 的个数,提高效率,每一串”1“只需要运算两次
- 
Float 各种课讲过很多次了,略 特殊标记:  - 
Accurate Arithmetic - 
guard bit - 精确位数右边的一位
 
- 
round bit - 精确位数右边的第二位
 
- 
sticky bit - 精确位数右边的第三位及以后的位数,只要有一个为1,就置为1
 
- 
method  
 
- 
 
- 
Chapter 4
关于 单周期和流水线 佬的笔记已经很详细了,这里记录一下后面的ILP和Int相关的内容
ILP(Instruction Level Parallelism)
为了提升指令级并行程度,一般有以下两种方法:
- 
Deeper Pipeline 增加流水线级数,从而可以同时执行更多指令,同时时钟周期变短 
- 
Multiple Issue 一次发射多条指令,或者说同时运行多条流水线 主要处理两个问题: - 
指令打包(packaging)并放入发射槽(issue slot) 
- 
数据和控制冒险 
 
- 
Tip

Static Multiple Issue


Packet:VLIW(Very Long Instruction Word),一般要求对齐(可以加nop)
常用的双发射

- 
Ex harzard: 只能分开到不同的Packet中,不能同时使用 
- 
Load-Use Hazard: 要把并行的流水线全部停掉,等待Load完成 
- 
Unrolling Loop: 通过展开循环,可以提高性能 Register Renaming 循环展开后,为每一层循环引入新的寄存器,消除一些数据冒险 即消除反相关(anti-dependence)(name dependence) 
Dynamic Multiple Issue

由动态多发射处理器(Superscalar processors)动态调度来提高性能,抛弃编译器的一些静态调度,形成动态调度流水线

- 
发射时会将指令存到保留站(reservation station)中,等待相关数据准备好,相当于完成寄存器重命名 
- 
中间执行单元(execution unit)会根据数据的准备情况,随时准备执行 
- 
一般取值和译码按序进行,内部的执行单元乱序执行,最后提交阶段一般也常用按序提交 
Speculation
不管是静态还是动态,都会使用一些预测技术来提高性能,如编译阶段、硬件执行阶段预测分支、预测载入等
当预测错误时,需要一定手段进行回滚:

当预测时出现异常,一般会推迟异常:

Interruption & Exception
广义上,可以粗略分成下面两种:
- 
Exception: Undefined Instruction & Arithmetic Overflow 
- 
Interrupt: System Call & I/O Interrupt 
架构支持
- 
Risc-V mode   
- 
Control and Status Registers (CSR) 分为两类: - 
普通程序控制 
- 
为一些高级权限的指令提供支持 
 Quote    
- 
中断实现(M-mode为例)
相关寄存器

流水线CPU结构

- 
MEPC - 
WARL (Write Any Read Legal): 任何模式都可以写不会出异常,但是只有Machine模式可以读 
- 
发生异常等 ecall / ebreak,MEPC <= PC
- 
发生中断, MEPC <= PC + 4
- 
从中断返回 MRET,PC <= MEPC
 
- 
- 
MSTATUS 确定当前的权限模式和中断使能 
- 
MIE(Enable)/MIP(Pending) - 
中断使能 
- 
当前被挂起的中断 
 
- 
- 
MTVEC(Machine Trap Vector Base Address)  - 
中断处理程序的基地址 
- 
当前的mode 
- 
查表方式:   
 
- 
- 
MCAUSE  - 
WLRL(Write Legal Read Legal):非法读写都会触发异常 
- 
Exception Code与mtvec的向量模式相对应,在异步中断时,不同的模式会跳转到不同的入口 
 
- 
具体步骤

*多个中断发生时:
- 
暴力选择处理最早的 
- 
精确定位 
- 
复杂多发射乱序执行:GG,太复杂 
中断级别


Chapter 6
考试应该涉及的不多,这里简单的记录一下一些零碎的公式和概念
Amdahl's Law
说明了串行部分对并行化效率的影响
- 
\(Speedup = \frac{1}{(1 - f) + \frac{f}{s}}\) 
- 
f: 被并行化的部分的比例 
- 
s: 并行化部分的加速比 
Disk Storage and Dependability
- 
Disk - 
特征  
- 
结构 - 
Platter (盘片),一般为堆叠的多个盘片 
- 
Track (磁道),盘片上的一圈 
- 
Sector (扇区),磁道上的一个片段 
  
- 
- 
操作 \[ latency = seek + rotation + transfer + controller \]- 
Seek Time (寻道时间) minimum、average(一般给出这个常数)、maximum 
- 
Rotational Latency (旋转延迟) \[ 平均延迟_{旋转} = \frac{0.5 圈}{转速} \]
- 
Transfer Time (传输时间) \[ 传输时间 = \frac{数据大小}{传输速度} \]
- 
Disk Controller(控制器耗时) 一般为给定常数 
 
- 
 
- 
Flash
Nonvolatile semiconductor storage(非易失性半导体存储器)
相比磁盘,更小更快更好用,不过有擦写上限

- 
性能优化: - 
人为调整访存顺序以减小seek time 
- 
更好的控制器 
- 
加缓存 
 
- 
- 
有效性:  - 
Fault Avoidance:生产结构上尽量避免 
- 
Fault Tolerance:通过冗余设计,在出现故障时可以恢复正常运行 
- 
Fault Forecasting:尝试预测故障发生 
 
- 
- 
可靠性: 粗略估计 如果使用 n 个独立的小磁盘来充当一个大磁盘,那么大磁盘的可靠性认为是小磁盘可靠性的\(\frac{1}{n}\) - 
RAID(Redundant Array of Inexpensive Disks)  - 
RAID 0:No Redundancy 无冗余,提高性能 
- 
RAID 1:Disk Mirroring/Shadowing 直接镜像复制一份,最高代价,最高可靠性 
- 
RAID 0+1(Strip + Mirror) 先条带化分块,交错存储,然后再镜像复制(因此至少需要4块磁盘)  
- 
RAID 2 通过 Hamming Code 进行纠错 具有检错和纠错能力,检测能力越强,相应的数据冗余也越大 Hamming Code通过添加冗余位,对其中部分位(子集)进行奇偶校验,从而根据多个校验位的结果来判断出错的位置 本质上是一种数学组合方法 但是纠错能力有限,只能适用于错误率较低的场景 
- 
RAID 3:Bit-Interleaved Parity Disk 为每一位数据添加一个奇偶校验位,用于检测错误和恢复数据 这样可以恢复一个磁盘的数据,但是无法恢复多个磁盘的数据  
- 
RAID 4:Block-Interleaved Parity Disk 类似于 RAID 3,但是是以块(stride)为单位进行奇偶校验(一列为一个磁盘) little read只要读取一个磁盘就可以了,而不需要读取所有的磁盘 little write需要根据数据变化重新计算奇偶校验位(两次异或),然后写入 large write会写入一整行,可以直接重新计算整个校验块  
- 
RAID 5:Block-Interleaved Distributed Parity 由于每次写入操作都会修改校验块,但是 RAID 4 的校验块是在一个磁盘上,因此会造成阻塞瓶颈 因此 RAID 5 将校验块分布到所有的磁盘上,这样每次写入操作都会修改不同的校验块,提高了性能  
- 
RAID 6:P+Q Redundancy 容易发现,前面的方法都只能恢复一个磁盘的数据,因此 RAID 6 引入了两个校验块,可以恢复至多两个磁盘的数据 
 
- 
 
- 
Buses and Other Connections
- 
类型  
- 
内存  history  
- 
Synchronous vs. Asynchronous - 
同步:时钟信号同步 
- 
异步:无需时钟信号同步  - 
I/O发出读请求,内存读到信号,从数据总线读取地址,并发出Ack信号确认 
- 
I/O 读取到Ack信号,停止发出请求,等待数据 
- 
内存发现请求信号消失,完成一次握手,停止Ack信号 
- 
内存读取对应数据,写入数据总线,并发出Data Ready信号 
- 
I/O 读取到Data Ready信号,从数据总线读取数据,并发出Ack信号确认读取完毕 
- 
内存读到Ack信号,停止发出数据,并不再发出Data Ready信号 
- 
I/O 发现Ack信号消失,完成一次握手,停止Ack信号,整个数据读取过程结束 
 
- 
 Example异步带宽没有同步高,但是可以同时进行多个操作,因此在一些场景下异步更加适用    
- 
- 
Bus Arbitration 为处理多任务,Bus可能会有多个请求,因此需要一个仲裁器来决定哪个请求优先  
- 
Increase Bandwidth  transfer time(同步) - 
传输地址时间 
- 
读数据时间 
- 
传输数据时间(这里一般与数据总线的宽度有关) 
- 
传输间隔时间等特殊时间 
 
- 
- 
Interfacing I/O 交互的特征  
- 
交互方式  - 
Interrupt-Driven I/O mode - 
通过中断请求信号,CPU可以暂停当前操作,处理中断请求 
- 
可以处理高并发性 
 计算:相当于在polling的基础上乘以操作比例 
- 
- 
Direct Memory Access (DMA)  不需要 CPU 参与,直接通过 DMA 控制器进行数据传输,不会占用 CPU 的功效 计算:关注数据传输时间 
- 
Polling - 
CPU 不断查询 I/O 状态,直到 I/O 完成 
- 
会浪费 CPU 的功效 
 计算:频率 * polling 时间 
- 
 
- 
- 
bottleneck计算 - 
min(Maximum I/O rate of CPU, Maximum I/O rate of bus)  
- 
Time per I/O  从而可以获得所需disk的吞吐量,从而计算得最少disk个数 
- 
Bus  
 
-