计算机类别
个人计算机
- 通用,各种软件
- 受成本/性能权衡的影响
服务器
- 基于网络
- 高容量、性能、可靠性
- 从小型服务器到建筑规模的范围
超级计算机
- 高端科学和工程计算
- 能力最高,但只占整个计算机市场的一小部分
嵌入式计算机:嵌入到其他设备中的计算机,一般运行预定义的一个或者一组应用程序
- 作为系统的组成部分隐藏起来
- 严格的功率/性能/成本限制
- 例如汽车、电视中的微处理器等
程序概念
计算机中的硬件只能执行极为简单的低级指令。从复杂的应用程序到简单的指令需要经过几个软件层次来将复杂的高层次操作逐步解释或翻译成简单的计算机指令。
下图给出了软件的层次的结构:
应用软件
- 用高级语言编写
系统软件
- 编译程序:将HLL代码翻译成机器代码
操作系统:服务代码
- 处理输入/输出
- 管理内存和存储
- 调度任务和共享资源
硬件
- 处理器、内存、I/O控制器
程序代码的级别
性能
一个程序的性能取决于以下各因素的组合:
软件或硬件组成元素 | 如何影响 |
---|---|
算法 | 决定了源码级语句的数量和I/O操作的数量 |
编程语言、编译器和体系结构 | 决定了每条源码级语句对应的计算机指令数量 |
处理器和存储系统 | 决定了指令的执行速度 |
I/O系统(硬件和操作系统) | 决定了I/O操作可能的执行速度 |
对于这个问题首先要定义性能,通过图片可以看到,巡航速度最高的是Concorde,航程最远的是DC-8-50,载客量最大的是747。
假设用速度来定义性能,仍然有两种可能的定义。
如果你关心点对点的到达时间,那么可以将只搭载一名旅客的巡航速度最快的客机认为是最好的。
如果你关心的是运输450名旅客,那么747性能是最好的。
在计算机中这样的两个概念:
响应时间:完成一项任务需要多长时间
吞吐率:每单位时间内完成的总工作。例如,每小时的任务/交易/...
- 将计算机中的处理器更换为更高速的型号
- 增加多个处理器来分别处理独立的任务
一般来说,降低响应时间几乎都可以增加吞吐率。
因此,方式1同时改进了响应时间和吞吐率。
方式2不会使任务完成得更快,只会增加吞吐率。
但是,当需要处理更多任务的时候,系统可能需要令后续请求排队。在这种情况下,随着吞吐率的增加,可同时改进响应时间,因为这缩小了排队等待时间。
为了使性能最大化,我们希望任务的响应时间或执行时间最小化。
对于某个计算机X,可以表达为:
性能X =1 / 执行时间X
如果有两台计算机X和Y,X比Y性能更好,则
性能X >性能Y
1/执行时间X > 1/执行时间Y
执行时间Y > 执行时间x
在讨论计算机设计时,经常要定量地比较两台不同计算机的性能。我们将使用“X是Y的n倍快”的表态方式。
即性能X/性能Y=n
如果X比Y快n倍,那么在Y上的执行时间是在X上执行时间的n倍,即性能X/性能Y=执行时间Y/执行时间X=n
例:如果计算机A运行一个程序只需要10秒,而计算机B运行同样的程序需要15秒,那么计算机A比计算机B快多少
15/10=1.5倍
性能的度量
消逝时间 (响应时间)
表示完成任务所需的总时间,包括了硬盘访问、内存访问、I/O操作和操作系统开销
决定了系统性能
CPU时间 (CPU执行时间)
处理某项工作的时间,它只表示在CPU上花费的时间,而不包括等待I/O或运行其他程序的时间(用户所感受的是程序的响应时间,而不是CPU执行时间)
CPU时钟
几乎所有计算机都用时钟来驱动硬件中发生的各种事件。
时钟周期:一个时钟周期的持续时间。时钟间隔的时间。
例如:250ps=0.25ns=250x10-12s
时钟频率(速率):每秒的周期
例如:4.0GHz=4000MHz=4.0x109Hz
CPU性能
用户和设计者往往以不同的尺度看待性能,我们需要确定一个设计的变化对性能的影响。一个程序的CPU执行时间 = 一个程序的CPU时钟周期数 × 时钟周期时间
由于时钟频率和时钟周期时间互为倒数,故一个程序的CPU执行时间=一个程序的CPU时钟周期数/时钟频率
硬件设计者必须经常在时钟速率和周期数之间进行权衡
,通过以下方式提高性能
- 减少时钟周期的数量
- 提高时钟频率
现在将设计一台计算机B,希望将运行时间缩短为6秒。
计算机的设计者采用的方法是提高时钟频率,但这会影响CPU其余部分的设计,使计算机B运行该程序时需要相当于计算机A的1.2倍的时钟周期数。
那么计算机设计者应该将时钟频率提高到多少?
我们首先要知道在A上运行该程序需要多少时钟周期数:CPU时间A=CPU时钟周期数A/时钟频率A
10秒=CPU时钟周期数A / 2GHz
CPU时钟周期数A=10秒 × 2GHz=20x10的九次方周期数
B的CPU时间公式为:CPU时间B=1.2 × CPU时钟周期数A / 时钟频率B
6秒=1.2 x 20 x10的九次方 / 时钟频率B
时钟频率B=1.2 × 20 x10的九次方 /6秒=0.2 x20 x10的九次方=4x10的九次方=4GHz
因此,要在6秒内运行完该程序,B的时钟频率必须提高为A的两倍。
指令的性能
由于计算机是通过执行指令来运行程序的,因此执行时间一定依赖于程序中的指令数。一种考虑执行时间的方法是,执行时间等于执行的指令数乘以每条指令的平均时间。
所以,一个程序需要的时钟周期数可写为:CPU时钟周期数=程序的指令数 × CPI(每条指令的平均时钟周期数)
用CPI来表示执行每条指令所需的时钟周期数的平均值。不同的指令需要的时间可能不同,CPI是一个程序全部指令所用时钟周期数的平均值。
CPI:每条指令的时钟周期数,表示执行某个程序或者程序片段时每条指令所需的时钟周期平均数。
计算机A的时钟周期为250ps,对某程序的CPI为2.0;
计算机B的时钟周期为500ps,对同样程序的CPI为1.2
对于该程序,请问哪台计算机执行的速度更快,快多少?
对于固定的程序而言,每台计算机执行的总指令数是相同的,我们用I来表示。
首先,求每台计算机的CPU时钟周期数:CPU时钟周期数A=I × 2.0
CPU时钟周期数B=I ×1.2
然后计算每台计算机的CPU时间:CPU时间A=CPU时钟周期数A × 时钟周期时间= I × 2.0×250ps=500 × I
CPU时间B=I ×1.2×500ps=600 × I
CPU性能公式
CPU时间 = 指令数 × 时钟周期时间
或CPU时间 = 指令数 × CPI / 时钟频率
指令数:执行某程序所需的总指令数量
哪个代码序列执行的指令数更多?哪个执行速度更快?每个代码序列的CPI是多少?
类别 | A | B | C |
---|---|---|---|
每类指令的CPI | 1 | 2 | 3 |
代码序列 1 | 2 | 1 | 2 |
代码序列 2 | 4 | 1 | 1 |
代码序列1共执行 2 + 1 + 2 =5条指令
代码序列2共执行 4 + 1 + 1 =6条指令
所以代码序列1执行的指令数更少
用指令数和CPI可以算出CPU时钟周期数(CPU时钟周期数=程序的指令数 × CPI)
CPU时钟周期数1 = (2 × 1)+(1 × 2)+ (2 × 3)=10周期
CPU时钟周期数2 = (4 × 1)+ (1 × 2)+(1 × 3)=9周期
所以代码序列2更快,尽管序列2多执行了一条指令,由于时钟周期数较少,指令数较多,因此它一定具有较小的CPI(CPI的计算公式为:CPI = CPU时钟周期数 / 指令数)
CPI1 = 10 / 5
影响CPU性能公式中的各种因素
硬件或软件指标 | 影响什么 |
---|---|
算法 | 指令数,可能的CPI |
编程语言 | 指令数,CPI |
编译程序 | 指令数,CPI |
指令集体系结构 | 指令数,CPI时钟频率 |
功耗墙
下图是30年间intel八代微处理器的时钟频率和功耗的增长趋势
动态能耗取决于每个晶体管的负载电容和工作电压: