计算机组成原理-性能是什么
什么是性能
两个标准:
- 相应时间或执行时间: 执行程序,到底要花多少时间,花的时间越少,性能自然越好
- 吞吐率(Throughput)或带宽(BandWidth):一定时间范围内,能处理完多少事情
通常情况下,缩短相应时间就能提升吞吐率。提升服务器性能、集群等也可以处理更多的数据,吞吐率也就上来了。
可以这么说:
性能 = 1 / 相应时间
性能 = 1 / 相应时间
计算机的计时间单位: CPU时钟
用时间来衡量性能存在的问题:
- 时间不准,每次统计的时间不会完全一样,该时间是程序运行结束时间 - 开始时间,该时间被称为Wall Clock Time 或 Elapsed Time。 计算机同时常常运行多个程序,CPU实际上不停地在各个程序之前切换,而且有些程序再运行的时候,可能会从网络、磁盘去读取数据,也会耗费时间。
- 即使拿到了CPU时间,也不一定直接读“比较”两个程序的性能差异。
- CPU 可能满载运行也可能降频运行
- 性能指标还会受到主板、内存这些其他相关硬件的影响
linux的time命令:
# macos执行
➜ ~ /usr/bin/time -p time seq 100000 | wc -l
0.03 real 0.02 user 0.00 sys
real 0.03
user 0.02
sys 0.00
100000
# macos执行
➜ ~ /usr/bin/time -p time seq 100000 | wc -l
0.03 real 0.02 user 0.00 sys
real 0.03
user 0.02
sys 0.00
100000
linux的time命令返回字段:
- real: Wall Clock Time
- user time: CPU 在运行你的程序,在[用户态]运行指令的时间
- sys time: CPU 在运行你的程序,在[内核态]里运行指令的时间
CPU时间 = user time + syst time
可以看出,user time + syst time < real time的(多核或者多cpu的机器上可能有出入,两条命令可能会分配到不同的CPU上处理)。
内核态(Kernel Mode):运行操作系统程序,操作硬件
用户态(User Mode):运行用户程序内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态。因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;
当程序运行在0级特权级上时,就可以称之为运行在内核态。
运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态(比如操作硬件)。这两种状态的主要差别是处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的处于内核态执行时,则能访问所有的内存空间和对象,且所占有的处理器是不允许被抢占的。
由于以上衡量的不确定性,我们需要对“时间”这个我们可以感知的指标进行拆解,把程序的 CPU 执行时间变成 CPU 时钟周期数(CPU Cycles)和 时钟周期时间(Clock Cycle)的乘积。
程序的 CPU 执行时间 =CPU 时钟周期数×时钟周期时间
程序的 CPU 执行时间 =CPU 时钟周期数×时钟周期时间
时钟周期:
- 例如主频是2.8GHz,我们可以先粗浅地认为,CPU 在 1 秒时间内,可以执行的简单指令的数量是 2.8G 条
- CPU能表达的最小的时间间隔
- 晶振带来的每一次“滴答”,就是时钟周期时间
简单的新能提升方案:
- 自然缩短时钟周期时间,也就是提升主频,超频就是走的这个路子
- 缩短CPU的时钟周期
把程序的CPU执行时间做更进一步分解:
程序的 CPU 执行时间 = 指令数 × CPI(每条指令的平均时钟周期数) × Clock Cycle Time
程序的 CPU 执行时间 = 指令数 × CPI(每条指令的平均时钟周期数) × Clock Cycle Time
总结,如何解决性能问题:
- 提高时钟周期时间
- 提升频率: 无法无限制提升,有功耗、散热等问题
- 多核CPU: 通过提升“吞吐率”而不是“响应时间”,来达到目的
- 优化CPI
- 指令数
多核CPI:
- 阿姆达尔定律(Amdahl’s Law): 对于一个程序进行优化之后,处理器并行运算之后效率提升的情况。
- 优化后的执行时间 = 受优化影响的执行时间 / 加速倍数 + 不受影响的执行时间
其他方案:
- 加速大概率事件。最典型的就是,过去几年流行的深度学习,整个计算过程中,99% 都是向量和矩阵计算,于是,工程师们通过用 GPU 替代 CPU,大幅度提升了深度学习的模型训练过程。Google 更是不满足于 GPU 的性能,进一步地推出了 TPU。
- 通过流水线提高性能。我们把 CPU 指令执行的过程进行拆分,细化运行,也是现代 CPU 在主频没有办法提升那么多的情况下,性能仍然可以得到提升的重要原因之一。
- 通过预测提高性能。通过预先猜测下一步该干什么,而不是等上一步运行的结果,提前进行运算,也是让程序跑得更快一点的办法