“原来的电脑性能跟不上了”、“这个程序性能需要优化一下”。那什么是计算机的性能呢?学习和研究计算机组成原理,就是在理解计算机是怎么运作的,以及为什么要这么运作。“为什么”所要解决的事情,很多时候就是提升“性能”。
1. 什么是性能?
两个指标用来衡量计算机的标准
- 响应时间(Response Time),也称执行时间(Execution Time)
响应时间是指执行一个程序需要花费的时间。响应时间越小也就意味着花的时间越少,计算机的性能自然性能就越好。 - 吞吐率(Throughput),也称带宽(Bandwidth)
吞吐率是在一定的时间范围内,能够处理的数据或者执行的程序指令数量。吞吐率越大,计算机的性能也越好。这也就解释了为什么要用8核、16核的CPU了。
2. 如何提升性能?
- 提升吞吐率的方法 --> 初步认为:较容易, “大力出奇迹”,多堆硬件。(略)
- 降低响应时间的方法 --> 难!10年前就处于“挤牙膏”模式了。
如果
性
能
=
1
响
应
时
间
性能=\frac{1}{响应时间}
性能=响应时间1? 同样一个程序,在 Intel 最新的 CPU Coffee Lake 上,需要 30s 就能运行完成。而在 5 年前 CPU Sandy Bridge 上,需要 1min 才能完成。那么Coffee Lake 的性能是 1/30,Sandy Bridge 的性能是 1/60,两个的性能比为 2。于是,就说Coffee Lake 的性能是 Sandy Bridge 的 2 倍。 世界各大CPU和服务器都组织了一个叫作 SPEC(Standard Performance Evaluation Corporation)的第三方机构,专门用来指定各种“跑分”的规则。 SPEC 提供的 CPU 基准测试程序,就好像 每届CPU 的“高考”。通过数十个不同的计算程序,对于 CPU 的性能给出一个最终评分。这些程序丰富多彩,有编译器、解释器、视频压缩、人工智能国际象棋等等,涵盖了方方面面的应用场景。这是SPEC跑分连接。
3. 计算机的计时单位:CPU时钟
用时间来衡量计算机性能是显而易见的,但存在两个问题: a) 时间不准 实例:自行编写的同一个程序,每一次运行的时间会是不一样的,有时45ms,有时53ms。为什么呢? 答:运行时间的计算用Wall Clock Time或Elapsed Time,是程序运行结束时间减去程序开始运行的时间。但是, 1)计算机会同时运行许多程序,CPU不停地在各个程序之间进行切换。在这些走掉的时间中,很可能CPU切换运行其他程序了。 2)有些程序在运行时需要从网络、硬盘读取数据,再给内存和CPU,需要花费时间。 因此,准确统计程序运行时间,比较不同计算机的性能,需要减去上述2种时间。 应用:Linux操作系统中运行如下命令,可以统计Wall Clock Time
$ time seq 1000000 | wc -l
1000000
real 0m0.101s
user 0m0.031s
sys 0m0.016s
说明: real time:即Wall Clock Time,指运行程序这个过程花费的时间。 user time:指CPU花在当前用户执行程序的时间。 sys time:指CPU花在操作系统内核执行程序的时间。 CPU执行时间(即CPU Time) = user time + sys time CPU Time=user time+sys time=0.031+0.016=0.047s,可见运行程序的时间中只有不到一半的时间用在了CPU计算上。 同样的程序换一台Linux计算机结果如下:
[root@ecs-ffe4 ~]
1000000
real 0m0.011s
user 0m0.016s
sys 0m0.004s
发现CPU Time=user time+sys time=0.016+0.004=0.020s > real time。这是为什么呢? 答:这是一台多核CPU或多CPU计算机,它将seq和wc两条命令分别给两个CPU进行运行。user time和sys time是两个CPU运行时间的相加的结果。而real time是运行过程中实际的时间花销,极端情况user time+sys time会是real time的2倍。 b)即使确定了CPU时间,也不一定能比较出两个程序的性能。 例如,CPU的满载运行 VS. CPU的降频运行 VS. CPU的超频运行。此外,程序运行还会受主板、内存等硬件的影响。 因此,需要把程序的CPU时间拆解为CPU时钟周期数(CPU Cycles)和时钟周期时间(Clock Cycle) 即
程
序
的
C
P
U
执
行
时
间
=
C
P
U
时
钟
周
期
数
×
时
钟
周
期
时
间
程序的 CPU 执行时间 =CPU 时钟周期数×时钟周期时间
程序的CPU执行时间=CPU时钟周期数×时钟周期时间
4. 再看如何提升计算机性能?
- 时钟周期(即时钟周期时间,Clock Cycle)
实例:某计算机使用的CPU是Intel Core-i7-7700HQ 2.8GHz。这里的2.8GHz被称为计算机的主频(Frequency/Clock Rate)。 理解:CPU可以在1s时间内执行2.8G条简单指令。是CPU的“钟表”,是CPU能够识别的最小时间间隔,就像墙上的挂钟能够识别的最小时间单位为秒。 时钟周期的产生部件是晶体振荡器(Oscillator Crystal),简称晶振。计算机中有晶体振荡器,电子石英表中也有晶振。晶振是计算机CPU使用的电子表。晶振的一个“滴答”就是时钟周期。2.8GHz CPU的时钟周期为1/2.8G=0.36ns。 结论:主频越高,CPU的计算性能越快。 有时候说的“超频”其实就是把CPU的时钟周期调快,加速CPU的计算。当然这个快是由散热、使用寿命代价的。 根据
程
序
的
C
P
U
执
行
时
间
=
C
P
U
时
钟
周
期
数
×
时
钟
周
期
时
间
程序的 CPU 执行时间 =CPU 时钟周期数×时钟周期时间
程序的CPU执行时间=CPU时钟周期数×时钟周期时间 - 方法:
方法一. 缩短时钟周期时间 --> 提升主频,即换性能更好的CPU,工程上很难改变。 方法二. 减少CPU时钟周期数。将CPU时钟周期数分解为:CPU时钟周期数 = 指令数×每条指令的平均时钟周期数(Cycles Per Instruction,简称 CPI)。 因此,
程
序
的
C
P
U
执
行
时
间
=
指
令
数
×
C
P
I
×
时
钟
周
期
时
间
程序的 CPU 执行时间 =指令数×CPI×时钟周期时间
程序的CPU执行时间=指令数×CPI×时钟周期时间 提升计算机性能归结为: 1) 时钟周期时间,即计算机主频。例如80386 CPU主频为33MHz,而现在的Core-i7 CPU主频为2.8GHz,提升了将近100倍。 2)CPI,每条指令的平均时钟周期数。例如流水线技术(Pipeline)可以减少CPI,对CPI进行优化是计算机组成的重要内容之一。 3)指令数,指执行特定程序需要多少条指令,用哪些指令。这主要依靠编译器解决。 把自己想象成CPU,自己编写程序时如何提高速度呢?主频好像打字速度、CPI好像熟悉快捷键的程度,指令数好像程序设计的合理性。
5. 计算机性能指标实例
例题1. 某计算机主频为1GHz,运行的目标代码有2x105条指令,分为4类,各类指令所占比例和各自CPI如下表所示。
指令类型 | CPI | 指令混合占比 |
---|
算术和逻辑 | 1 | 60% | Load/Store | 2 | 18% | 转移 | 4 | 12% | Cache缺失访存 | 8 | 10% | | | |
求: 1. CPI 2. MIPS 3. 该程序的CPU时间 解: CPI=1x60%+2x18%+4x12%+8x10%=2.24 MIPS=f/CPI=1GHz/2.24=1000MHz/.2.24=446 CPU时间=2x105xCPI/f = 2x105x2.24/(1x109)=4.48x10-4 秒 或 CPU时间=指令数量/(MIPSx106) 例题2. 假定基准程序A 在某计算机上的运行时间为100s、其中90s为CPU时间、 其余为I/O时间。若CPU速度提高50%, I/O速度不变, 则运行基准程序A所耗费的时间是多少? 解:运行时间=CPU时间+I/O 100s = 90s+10s T=90/(1+50%) + 10 = 70s 例题3. 程序P在机器M上的执行时间是 20s, 编译优化后、 P 执行的指令数减少到原来的70%、 而CPI增加到原来的1.2倍,则P在M上的执行时间是多少? 解: 设CPU时钟频率为f(主频),原来程序P有x条指令 则原来CPI旧=20f/x 精简指令后,程序P有0.7x条指令,CPI新=1.2CPI旧=24f/x 因此,P在M上的执行时间为:(指令数xCPI)/f=(0.7x CPI新)/f = 16.8 s 例题4. 假定计算机M1和M2具有相同的指令集体系结构(ISA), 主频分别为1.5GHz和1.2GHz。在M1和M2上运行某基准程序P、平均CPI分别为2和1, 则程序P在Ml和M2 上运行时间的比值是多少? 解: 运行时间=(指令数xCPI)/主频 tM1=指令数x2/1.5,tM2=指令数x1/1.2 所以, tM1:tM2=1.6 例题5. 主存储器容量为64Kx32,可以得知: 216=64K,即地址总线(AB)宽度为16 bits。32表示数据总线(DB)宽度为32。进一步可知MAR为16位,PC为16位,MDR为32位。
|