课程笔记计算机体系结构复习笔记
Posted lokol.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了课程笔记计算机体系结构复习笔记相关的知识,希望对你有一定的参考价值。
文章目录
第一章 基本原理
计算机系统层次与体系结构
计算机系统层次:应用语言机、高级语言机、汇编语言机、操作系统机、传统机、微程序机
相同指令集体系结构可以有不同的组织(不同的内存系统、总线、CPU等),相同的指令集体系结构何组织在硬件实现上可以不同。
体系结构属性:指令集、I/O机制、寻址技术、数据类型的位数
体系结构在组织方面对程序员是不可见的(transparent)。
体系结构的设计考虑速度、成本、物理器件大小和功耗(power),如乘法单元(成本高、物理器件较大,但速度快)和加法单元迭代使用(相对速度低,但廉价)用以实现乘法。
摩尔定律:晶体管密度及性能每18-24个月翻一番。(已不再适用)
测量及分析性能
性能(performance)的影响因素:响应时间(response time, elapsed time)(反应快慢)、执行时间(运行快慢,评价性能的主要因素)、吞吐量(throughput)(一次性处理数据多少)
执行时间是性能的倒数。
反应时间的定义:硬盘访问、内存访问、I/O操作、系统开销(operating system overhead)所造成的延迟。
执行时间的定义:
- CPU时间:CPU执行计算所用时间,不包括I/O等待及运行其他程序所用时间。
- CPU时间又可分为:
- 用户CPU时间:程序所占用的CPU时间。
- 系统CPU时间:操作系统响应程序请求所占用的CPU时间(与响应时间不同)。
使用程序评估性能的方法:
- 真实应用进行评估(最精确)
- 核心应用(Kernels)进行评估:使用真实程序中的关键片段进行性能评估。
- 玩具测试基准(Toy benchmarks):小型程序进行评估,结果已知。
- 合成测试基准(Synthetic benchmarks):整合多种应用的benchmark,包括核心程序和真实程序。
比较性能方法:
-
总体执行时间:各测试程序总的执行时间,该方法在计算机执行程序次数相同时可用。
-
平均执行时间: 1 n ∑ i = 1 n T i m e i \\frac1n\\sum^n_i=1Time_i n1∑i=1nTimei
-
加权执行时间:程序执行频率不同时可用。
- 指明程序出现的相对频率或权值设定与执行时间成比例: ∑ i = 1 n W e i g h t i × T i m e i \\sum_i=1^nWeight_i\\times Time_i ∑i=1nWeighti×Timei
-
归一化执行时间:选定参考机,进行归一化,再利用归一化后的数值进行平均,求平均数可使用算数平均数或几何平均数( ∏ i = 1 n E x e c u t i o n t i m e r a t i o n \\sqrt[n]\\prod_i=1^nExecution\\ time\\ ratio n∏i=1nExecution time ratio),最终:
实 际 性 能 = 归 一 化 数 × 参 考 机 性 能 实际性能=归一化数\\times 参考机性能 实际性能=归一化数×参考机性能
计算机设计量化原理
阿姆达尔定律(Amdahl’s Law):由某些部分加速所得到的性能提高受加速部分的百分率所限。
- 加速比(Speedup):
加 速 比 = 增 强 后 的 性 能 增 强 前 的 性 能 加速比=\\frac增强后的性能增强前的性能 加速比=增强前的性能增强后的性能
- 新的执行时间:
执 行 时 间 n e w = 执 行 时 间 o l d × ( ( 1 − 未 增 强 部 分 占 比 ) + 增 强 部 分 占 比 加 速 部 分 加 速 比 ) 执行时间_new=执行时间_old\\times((1-未增强部分占比)+\\frac增强部分占比加速部分加速比) 执行时间new=执行时间old×((1−未增强部分占比)+加速部分加速比增强部分占比)
- 总加速比:
总 加 速 比 = 执 行 时 间 o l d 执 行 时 间 n e w = 1 ( 1 − 未 增 强 部 分 占 比 ) + 增 强 部 分 占 比 加 速 部 分 加 速 比 总加速比=\\frac执行时间_old执行时间_new=\\frac1(1-未增强部分占比)+\\frac增强部分占比加速部分加速比 总加速比=执行时间new执行时间old=(1−未增强部分占比)+加速部分加速比增强部分占比1
回报递归法则(the law of diminishing returns):对于一部分性能的提高,总体加速比的提高呈递减状态,即贡献越来越少、有上界。
CPU性能方程:
C
P
U
时
间
=
时
钟
周
期
数
(
C
P
U
c
l
o
c
k
c
y
c
l
e
s
)
×
时
钟
周
期
时
间
(
C
l
o
c
k
c
y
c
l
e
t
i
m
e
)
CPU时间=时钟周期数(CPU\\ clock\\ cycles)\\times时钟周期时间(Clock\\ cycle\\ time)
CPU时间=时钟周期数(CPU clock cycles)×时钟周期时间(Clock cycle time)
C P U 时 间 = C P U 时 钟 周 期 数 时 钟 频 率 ( C l o c k r a t e ) CPU时间=\\fracCPU时钟周期数时钟频率(Clock\\ rate) CPU时间=时钟频率(Clock rate)CPU时钟周期数
CPI:
C
P
I
=
程
序
所
需
总
C
P
U
时
钟
周
期
数
指
令
数
(
I
n
s
t
r
u
c
t
i
o
n
c
o
u
n
t
,
I
C
)
CPI=\\frac程序所需总CPU时钟周期数指令数(Instruction\\ count, IC)
CPI=指令数(Instruction count,IC)程序所需总CPU时钟周期数
从而可推出:
C
P
U
时
间
=
指
令
数
×
C
P
I
×
时
钟
周
期
时
间
CPU时间=指令数\\times CPI\\times 时钟周期时间
CPU时间=指令数×CPI×时钟周期时间
由于改变时钟周期时间、CPI、指令数其一时,很难不改变其他部分,故有以下计算CPI方法:
C
P
U
周
期
数
=
∑
i
=
1
n
I
C
i
×
C
P
I
i
CPU周期数=\\sum_i=1^nIC_i\\times CPI_i
CPU周期数=i=1∑nICi×CPIi
测量CPU性能的各组成部分:
- 时钟周期:
- 已完成设计:利用时延评估器(timing estimators)或时延验证器(timing verifiers)
- 未完成设计:考察关键路径(critical paths)
- 指令数测量:利用编译器及测试指令集行为的工具
- 指令集模拟器(instruction set simulator):慢,但精确测量指令集行为的几乎所有方面。
- 基于执行的监控(execution-based monitoring):快,通过修改程序(插桩代码)。
- CPI测量困难:现代处理器存在流水线和存储层次,需要考虑流水线和cache结构。
C
P
I
i
=
P
i
p
i
l
i
n
e
C
P
I
i
+
M
e
m
o
r
y
s
y
s
t
e
m
C
P
I
i
CPI_i=Pipiline\\ CPI_i+Memory\\ system\\ CPI_i
CPIi=Pipiline CPIi+Memory system CPI算法设计与分析课程复习笔记
一、计算模型
1.1 定义:
我们在思考和处理算法的时候是机器无关、实现语言无关的。所有的算法运行在一种“抽象的机器”之上,这就是计算模型。
1.2 种类
图灵机是最有名的计算模型,本课使用更简单更合适的RAM计算模型。
1.3 RAM(Random Access Machine)模型
RAM模型的基本构成如下:
RAM计算模型有如下特点:
- 一个简单操作花费一步:键值比较、加减、内存访问
- 没有操作可以被分解:循环、子程序
- 内存:访存是一个简单操作、无限制的内存
二、算法设计
2.1 算法问题规约
将算法问题严格的定义为精确限定输入\\输出的“规约”形式:
- 输入:明确定义了算法接受的所有合法输入
- 输出:明确定义了对于每一个合法的输入值,相应的输出值应该是什么
例子1:
Euclid算法,辗转相除法的算法实现,计算m、n的最大公约数
输入:非负整数m,n
输出:gcd(m,n)
int Euclid(int m, int n) { if (m <= n) swap(m,n); while (m%n != 0) { n = m%n; m = n; } return n; } //这是测试用例 int main() { cout << Euclid(15,12) << endl; system("pause"); return 0; }
例子2:
顺序搜索,在一个数组中搜寻一个具体的数
输入:关键字K,数组E[1...n]
输出:如果K在E中,返回K在E中的位置,如果不在则返回-1
int SequentialSearch(vector<int> e, int k) { for (int i = 0; i < e.size(); ++i) if (k == e[i]) return i; return -1; } //这是测试用例 int main() { vector<int> e = {1,2,3,4,5,6}; cout << SequentialSearch(e,8) << endl; system("pause"); return 0; }
2.2 算法正确性的证明:数学归纳法
EUCLID算法正确性的证明:
当n=0时,对于任何m,有Euclid(m,0)=0
假设当n<=N时成立,考虑n=N+1的情况:
先有Euclid(m, N+1) = Euclid(N+1, m mod (N+1) ) ,而m mod(N+1)<=N恒成立,根据假设可知Euclid(N+1, m mod (N+1) )总能得出正确的答案,即n=N+1得证。
三、算法分析
3.1 算法的性能指标
- 时间复杂度
- 空间复杂度
在RAM中,时间复杂度使用RAM中执行简单操作的个数衡量,空间复杂度使用RAM中寄存器的个数来衡量。这样,对算法的性能分析变成了一个计数问题。由于RAM是抽象的,所以我们的衡量指标也是机器无关、语言无关的。
3.2 最坏情况复杂度
最坏复杂度的含义是最坏的输入对于的复杂度
例子:
在顺序搜索之中,待搜索的数k在数组e的位置越靠后,所需要搜寻的次数也就越多,当k在e的最后一个,此时为最坏情况。
3.3 平均情况复杂度
仅仅靠最坏情况时间复杂度不能充分代表算法性能。可以采用平均情况下的复杂度。
- 明确算法所有输入的分布情况
- 计算期望
例子:
对于顺序搜索的问题,给定数组为E[],长度为n,搜寻目标为K,假设所有输入情况等概率的出现。则成功的平均概率应该如下:
以上是关于课程笔记计算机体系结构复习笔记的主要内容,如果未能解决你的问题,请参考以下文章