1. 早期计算机提速方式
- 减少晶体管的切换时间,但是最终会遇到瓶颈,所以芯片厂商发明各种新技术来提升性能
- 这样使得运算更快,也可以处理更复杂的任务
2. 早起使用减法来实现除法的功能效率低
- 例如:16/4,会执行为 16-4-4-4,碰到 0 或者负数才停下
- 但是这种方法需要多个时钟周期,很低效
- 现代 CPU 直接在硬件层面设计了除法,可以直接给 ALU 除法指令
3. 指令数量不断增加
- 人们习惯了它的便利就很难删掉,所以为了兼容旧指令集,指令数量越来越多
- 英特尔 4004,第一个集成 CPU,有 46 条指令,但是现代处理器有上千条指令,有各种巧妙复杂的电路
- 超高的时钟速度带来另外一个问题:如何快速传递数据给 CPU ?
4. 快速传递数据给 CPU
- RAM 是 CPU 之外的独立组件,意味着数据要用线来传递,叫「总线」
- 电信号的传输接近光速,但 CPU 每秒可以处理上亿条指令,很小的延迟也会造成问题
- RAM 需要时间找地址、取数据、配置、输出数据,一条「从内存读数据」的指令可能要多个时钟周期,CPU 空等数据
- 提升性能的解决的方法之一是给 CPU 加点 RAM,叫「缓存」
- 缓存离 CPU 近,一个时钟周期就能给数据,所以 CPU 不用空等,比反复去 RAM 拿数据快的多
- 如果想要的数据已经在缓存,叫「缓存命中」
- 如果想要的数据不在缓存,叫「缓存未命中」
- 缓存也可以当临时空间,存一些中间值,适合长/复杂的运算
- 缓存里每块共建,有一个特殊的标记,叫「脏位」
- 同步一般发生在当缓存满了而 CPU 又要缓存时,在清理缓存腾出空间之前,会先检查「脏位」
- 如果是「脏」的,在加载新内容之前,会把数据写回 RAM
- 提升性能的解决的方法之二是「指令流水线」
- 使用「并行处理」进一步提高效率,即「执行」一个指令时,同时「解码」下一个指令,「读取」下个指令,不同任务重叠执行,同时用上 CPU 里所有部分
- 带来的问题:
- 指令之间的依赖关系。例如:你在读某个数据,而正在执行的指令会修改这个数据,也就是说拿到的是旧数据,因此流水线处理器,要先弄清数据依赖性,必要时停止流水线,避免出问题
- 「乱序执行」高端 CPU,比如笔记本和手机里那种,会更进一步,动态排序有依赖关系的指令,最小化流水线的停工时间,这叫乱序执行。
- 「条件跳转」,这些指令会改变程序的执行流
- 「推测执行」高端 CPU 会猜哪条路的可能性大一些,然后提前把指令放进流水线
- 「分支预测」为了尽可能减少清空流水线的次数,CPU 厂商开发了复杂的方法,来猜测那条分支更有可能。
- 提升性能的解决的方法之三是「同时运行多个指令流」
- 使用多核处理器
- 超级计算机
- 如果要做怪兽级运算,比如模拟宇宙形成,则需要更强大的计算能力
- 世界上最快的计算机在中国无锡的国家超算中心
- 神威·太湖之光有 40960 个 CPU,每个 CPU 有 256 个核心
- 总共超过1千万个核心,每个核心的频率时 1.45GHz
- 每秒可以进行 9.3 亿亿次浮点数运算,也叫「每秒浮点运算次数」
5. 总结
- 这些年处理器不但大大提高了速度,而且变得更复杂,用各种技巧,榨干每个时钟周期,做尽可能多的运算
- 我们的人物是利用这些运算能离,做又酷又实用的事,编程就是为了这个