第一章 计算机抽象及相关技术
1.1 引言
1.1.1 传统计算机应用分类及其特点
通用,各种软件;权衡成本和性能
基于网络;高容量、性能和可靠性;从小型服务器到建筑规模的范围;计算机用于为多个用户并行运行大型程序
高端科学与工程计算;最高能力代表了整个计算机市场的一小部分
嵌入式计算机(Embedded Computer) 隐藏为系统组件;严格的功率、性能和成本约束
1.1.2 欢迎来到后 PC 时代
电池驱动;连接到互联网;数百美元的;智能手机,平板电脑,电子眼镜
仓库规模计算机(WSC);软件即服务(SaaS);部分软件运行在PMD部分运行在云上;Amazon和谷歌
1.1.3 下面将介绍
- 如何将程序翻译成机器语言? (以及如何执行硬件)
- 硬件/软件接口
- 程序性能的决定是什么? (以及如何改进)
- 如何提高硬件设计师的性能?
- 并行处理是什么?
1.2 在计算机系统结构中 8 个伟大思想
1.3 在程序表象下
1.4 箱盖后面的硬件
典型的计算机包括 五个部分
1.4.1 显示器
1.4.2 触摸屏
:大多数平板电脑,智能手机使用电容式;电容式允许同时多次触摸 (取代键盘和鼠标)
1.4.3 打开机箱
数据通路(Datapath):操作数据 控制(Control):序列数据路径,内存,…缓存内存(Cache Memory) 小快速SRAM(静态随机访问存储器 Static Random Access Memory)内存用于立即访问数据
1.4.4 数据安全
:断电时丢失指令和数据。:磁盘、闪存、光盘(CDROM,DVD)
1.4.5 与其他计算机通信
1.5 存储制造技术
晶片价格用以下三个公式计算 每 晶 片 的 价 格 = 每 晶 圆 的 价 格 每 晶 圆 的 晶 片 数 × 良 率 每晶片的价格=\dfrac{每晶圆的价格}{每晶圆的晶片数\times 良率} 每晶片的价格=每晶圆的晶片数×良率每晶圆的价格 每 晶 圆 的 晶 片 数 ≈ 晶 圆 面 积 晶 片 面 积 每个晶片的晶片数\approx \dfrac{晶圆面积}{晶片面积} 每晶圆的晶片数≈晶片面积晶圆面积 工 艺 良 率 = 1 ( 1 + 单 位 面 积 的 缺 陷 数 × 芯 片 面 积 2 ) 2 工艺良率=\dfrac{1}{(1+\dfrac{单位面积的缺陷数\times 芯片面积}{2})^2} 工艺良率=(1+2单位面积的缺陷数×芯片面积)21
1.6 性能
1.6.1 性能的定义
我们强调 性 能 X = 1 执 行 时 间 X 性 能 Y = 1 执 行 时 间 Y 性能_X=\dfrac{1}{执行时间_X}\qquad性能_Y=\dfrac{1}{执行时间_Y} 性能X=执行时间X1性能Y=执行时间Y1 若 有 性 能 X 性 能 Y = 执 行 时 间 Y 执 行 时 间 X = n 称 X 的 执 行 速 度 是 Y 的 n 倍 若有\quad \dfrac{性能_X}{性能_Y}=\dfrac{执行时间_Y}{执行时间_X}=n \quad 称 X 的执行速度是 Y 的 n 倍 若有性能Y性能X=执行时间X执行时间Y=n称X的执行速度是Y的n倍
1.6.2 性能的度量
:总响应时间,包括所有方面。处理,I/O,操作系统开销,空闲时间。决定系统性能。
:不同程序影响不同的CPU和系统性能
1.6.3 CPU 性能及其度量因素
程 序 的 C P U 执 行 时 间 = 程 序 的 C P U 时 钟 周 期 数 时 钟 频 率 = 程 序 的 C P U 时 钟 周 期 数 × 时 钟 周 期 时 间 程序的\mathrm{CPU} 执行时间=\dfrac{程序的\mathrm{CPU}时钟周期数}{时钟频率}=程序的\mathrm{CPU}时钟周期数\times 时钟周期时间 程序的CPU执行时间=时钟频率程序的CPU时钟周期数=程序的CPU时钟周期数×时钟周期时间
1.6.4 指令性能
C P U 时 钟 周 期 数 = 指 令 数 × C P I \mathrm{CPU}时钟周期数=指令数\times \mathrm{CPI} CPU时钟周期数=指令数×CPI
1.6.5 经典的 CPU 性能公式
C P U 时 钟 周 期 数 = ∑ i = 1 n ( C P I i × 指 令 数 i ) 平 均 C P I = ∑ i = 1 n ( C P I i × 指 令 数 i 总 指 令 数 ) \mathrm{CPU}时钟周期数=\sum_{i=1}^n (\mathrm{CPI}_i\times 指令数_i) \\平均\mathrm{CPI}=\sum_{i=1}^n(\mathrm{CPI}_i\times\dfrac{指令数_i}{总指令数}) CPU时钟周期数=i=1∑n(CPIi×指令数i)平均CPI=i=1∑n(CPIi×总指令数指令数i)
1.7 功耗墙
功 耗 ∝ 1 2 × 负 载 电 容 × 电 压 2 × 开 关 频 率 功耗\propto \dfrac{1}{2}\times 负载电容 \times 电压^2 \times 开关频率 功耗∝21×负载电容×电压2×开关频率
1.8 沧海巨变:从单处理器向多处理器转变
1.9 评测性能
1.10 谬误与陷阱
改 进 后 的 执 行 时 间 = 受 改 进 影 响 的 执 行 时 间 改 进 量 + 不 受 影 响 的 执 行 时 间 改进后的执行时间=\dfrac{受改进影响的执行时间}{改进量}+不受影响的执行时间 改进后的执行时间=改进量受改进影响的执行时间+不受影响的执行时间 :CPU 每秒执行几百万条指令
第二章 指令:计算机的语言
2.1 引言
使用大端法存储数据,不要求字地址对齐
寄存器类型。64位-双字;32位-字
- x0:定值为0
- x1:返回地址
- x2:栈指针
- x3:全局指针
- x4:线程指针
- x5-x7,x28-x31:临时值
- x8:帧指针
- x9,x18-x27:过程调用保存
- x10-x11:函数参数与返回值
- x12-x17:函数参数
2.2 计算机硬件的操作
2.3 计算机硬件的操作数
:x0-31(00000-11111)
:imm(x?)
:addi x22,x22,4
2.4 无符号数和有符号数
2.5 计算机的指令表示
R-型指令包含:所有的不含立即数的算术逻辑运算指令
I-型指令包含:所有的含立即数的算术逻辑运算指令,所有的 load 指令,jalr指令
S-型指令包含:所有的 store 指令
2.6 逻辑操作
所有含有立即数的移位操作只需要少量的立即数位数,它们也是I-型指令
2.7 用于决策的指令
SB-型指令包含:所有的条件分支指令
注意:SB-型指令没有第 0 位立即数,这意味着第 0 位缺省为 0 。只能跳转到偶数的位置。
条件分支指令采用 PC 相对寻址,跳转到 P C + i m m × 2 \mathrm{PC}+\mathrm{imm}\times 2 PC+imm×2
可以实现 循环 switch/case语句
2.8 计算机对于过程的支持
UJ-型指令包含:jal 指令
例 jal x1,L1
采用 PC 相对寻址,并且将返回地址 PC+4 赋值给 x1
另例 jalr x0,0(x1)
跳转到 0+x1 的位置,此处 x0 = 0 ,效果是丢弃返回地址
2.8.1 使用更多寄存器
2.8.2 嵌套过程
2.8.3 在栈中为新数据分配空间
2.8.4 在堆中为新数据分配空间
2.9 人机交互
我们分析一个例子
void strcpy (char x[], char y[])
{
size_t i;
i = 0;
while ((x[i] = y[i]) != '/0') /* copy & test byte*/
i += 1
}
strcpy:
addi sp,sp,-8 // adjust stack for 1 doubleword
sd x19,0(sp) // push x19
add x19,x0,x0 // i=0
L1: add x5,x19,x11 // x5 = addr of y[i]
lbu x6,0(x5) // x6 = y[i]
add x7,x19,x10 // x7 = addr of x[i]
sb x6,0(x7) // x[i] = y[i]
beq x6,x0,L2 // if y[i] == 0 then exit
addi x19,x19, 1 // i = i + 1
jal x0,L1 // next iteration of loop
L2: ld x19,0(sp) // restore saved x19
addi sp,sp,8 // pop 1 doubleword from stack
jalr x0,0(x1) // and return
2.10 对大立即数的 Risc-v 编址和寻址
2.10.1 大立即数
U-型指令包括 lui 指令 auipc 指令
U 型指令用来设置寄存器高位
2.11 指令与并行性:同步
在并行中避免:两个处理器共享的内存。P1写,然后P2读取。数据竞争如果P1和P2不同步
需要使用原子操作,如下
保留加载:lr.d rd,(rs1) 从地址 rs1 加载,(rs1) -> rd
条件存储:sc.d rd,rs2,(rs1) rs2->(rs1) 存储,成功则设置 rd=0,失败则 rd=1。成功条件:内存值在上一次 lr.d 之后未更改。
addi x12,x0,1 // copy locked value
again: lr.d x10,(x20) // read lock
bne x10,x0,again // check if it is 0 yet
sc.d x11,x12,(x20) // attempt to store
bne x11,x0,again // branch if fails
Unlock:
sd x0,0(x20) // free lock
2.12 翻译并启动程序
第三章 计算机的算术运算
3.1 引言
本章包含,加减法,乘法,浮点运算,运算器
3.2 加法和减法
3.3 乘法
3.3.1 串行版的乘法运算及其硬件实现
3.3.2 带符号的乘法
3.3.3 快速乘法
3.4 除法
3.5 浮点运算
3.5.1 浮点表示
IEEE 浮点标准用 V = ( − 1 ) s × M × 2 E V=(-1)^s\times M\times 2^E V=(−1)s×M×2E 的形式来表示一个数(s 符号,M 尾数,E 阶码)
有三种对应情况
-
最普遍的情况,当 exp 位既不全为 0,也不全为 1 时。这种情况下:
阶码的值 E = e − B i a s E=e-Bias E=e−Bias 其中 B i a s = 2 k − 1 − 1 Bias = 2^{k-1}-1 Bias=2k−1−1,在单精度中对应为 127,双精度对应为 1023。最终阶码的取值范围为 − 126 ∼ + 127 -126\sim+127 −126∼+127(单精度), − 1022 ∼ + 1023 -1022\sim+1023 −1022∼+1023
尾数值为 M = 1 + f M=1+f M=1+f 其中 f = 0. f n − 1 … f 1 f 0 f=0.f_{n-1}\dots f_1f_0 f=0.fn−1…f1f0