重学计算机组成原理(三)- 进击,更强的性能!

在上一篇中,咱们谈到过java

程序的CPU执行时间 = 指令数×CPI×Clock Cycle Time

要提高计算机的性能,能够从上面这三方面着手。git

经过指令数/CPI,好像都太难了。github

所以工程师们,就在CPU上多放晶体管,不断提高CPU的时钟频率,让CPU更快,程序的执行时间就会缩短。算法

  • 从1978年Intel发布的8086 CPU开始,计算机的主频从5MHz开始,不断攀升
  • 1980年代中期的80386可以跑到40MHz
  • 1989年的486可以跑到100MHz
  • 直到2000年的奔腾4处理器,主频已经到达了1.4GHz

1 功耗:CPU的“人体极限”

奔腾4的CPU主频历来没有达到过10GHz,最终它的主频上限定格在3.8GHz编程

并且奔腾4的主频虽然高,可是实际性能却配不上一样的主频数组

想要用在笔记本上的奔腾4 2.4GHz处理器,其性能只和基于奔腾3架构的奔腾M 1.6GHz匹配性能优化

因而不只让Intel的对手AMD得到了喘息之机,更是表明着“主频时代”的终结。架构

后面几代Intel CPU主频不但没有上升,反而降低了。机器学习

到现在,2019年的最高配置Intel i9 CPU,主频也不过是5GHz工具

相较于1978年到2000年,这20年里300倍的主频提高,从2000年到如今的这19年,CPU的主频大概提升了3倍

  • CPU的主频变化,奔腾4时进入瓶颈期

奔腾4的主频为何没能超3.8GHz?

就由于功耗.

一个3.8GHz的奔腾4处理器,满载功率是130瓦

130瓦是什么概念呢?机场容许带上飞机的充电宝的容量上限是100瓦时

若是咱们把这个CPU安在手机里面,不考虑屏幕内存之类的耗电,这个CPU满载运行45分钟,充电宝里面就没电了

而iPhone X使用ARM架构的CPU,功率则只有4.5瓦左右。

CPU,也称做超大规模集成电路(Very-Large-Scale Integration,VLSI

由一个个晶体管组成

CPU的计算过程,其实就是让晶体管里面的“开关”不断“打开”/“关闭”,组合完成各类运算和功能。

要想算得快

  • 增长密度
    在CPU一样的面积,多放晶体管
  • 提高主频
    让晶体管“打开”/“关闭”得快点

这二者,都会增长功耗,带来耗电和散热的问题!!!

能够把CPU想象成一个工厂,有不少工人

就如CPU上面的晶体管,互相之间协同工做。

为了工做快点完成,在工厂里多塞一点人

你可能会问,为何不把工厂造得大点?

这是由于,人和人之间若是离得远了,互相之间走过去须要花的时间就会变长,这也会致使性能降低!

这就如若是CPU的面积大,晶体管之间的距离变大,电信号传输的时间就会变长,运算速度天然就慢了。

除了多塞一点人,还但愿每一个人动做快点,一样时间就可多干活了

这就至关于提高CPU主频,可是动做快,每一个人就要出汗散热

要是太热了,对工厂里面的人来讲会休克,对CPU来讲就会崩溃出错。

咱们会在CPU上面抹硅脂、装风扇,乃至用上水冷或者其余更好的散热设备

就好像在工厂里面装风扇、空调,发冷饮同样

可是一样的空间下,装上风扇空调可以带来的散热效果也是有极限的

所以,在CPU里面,可以放下的晶体管数量和晶体管的“开关”频率也都是有限的。

一个CPU的功率,能够用这样一个公式来表示:

功耗  ≈ 1/2 ×负载电容 × 电压的平方 × 开关频率 × 晶体管数量

为了提高性能,要不断地增长晶体管数量

一样的面积下,想要多放一点晶体管,就要把晶体管造得小一点

这个就是平时咱们所说的提高“制程”

从28nm到7nm,至关于晶体管自己变成了原来的1/4大小

这个就至关于咱们在工厂里,一样的活儿,咱们要找瘦小一点的工人,这样一个工厂里面就能够多一些人

咱们还要提高主频,让开关的频率变快,也就是要找手脚更快的工人

但功耗增长过多,CPU散热就跟不上

这时就须要下降电压

这里有一点很是关键,在整个功耗的公式里面,功耗和电压的平方是成正比的

这意味着电压降低到原来的1/5,整个的功耗会变成原来的1/25。

事实上,从5MHz主频的8086到5GHz主频的Intel i9,CPU的电压已经从5V左右降低到了1V左右

这也是为何咱们CPU的主频提高了1000倍,可是功耗只增加了40倍

2 并行优化 - 阿姆达尔定律

虽然制程的优化和电压的降低,在过去的20年里,让CPU性能有所提高

可是从上世纪九十年代到本世纪初,软件工程师们所用的“面向摩尔定律编程”的套路愈来愈用不下去了

“写程序不考虑性能,等明年CPU性能提高一倍,到时候性能天然就不成问题了”,这种想法已经不可行了。

因而,从奔腾4开始,Intel意识到经过提高主频比较“难”去实现性能提高

开始推出Core Duo这样的多核CPU,经过提高“吞吐率”而不是“响应时间”,来达到目的。

提高响应时间,就比如提高你用的交通工具的速度

本来你是开汽车,如今变成了高铁乃至飞机

可是,在此之上,再想要提高速度就不太容易了

CPU在奔腾4的年代,就比如已经到了飞机这个速度极限

那你可能要问了,接下来该怎么办呢?

相比于给飞机提速,工程师们又想到了新的办法,能够一次同时开2架、4架乃至8架飞机,这就好像咱们如今用的2核、4核,乃至8核的CPU。

虽然从上海到北京的时间没有变,可是一次飞8架飞机可以运的东西天然就变多了,也就是所谓的“吞吐率”变大了。因此,无论你有没有须要,如今CPU的性能就是提高了2倍乃至8倍、16倍。

这也是一个最多见的提高性能的方式,经过并行提升性能

这个思想在不少地方均可以使用

举个例子,咱们作机器学习程序的时候,须要计算向量的点积,好比向量

$W = [W_0, W_1, W_2, …, W_{15}]$

和向量

$X = [X_0, X_1, X_2, …, X_{15}]$
$W·X = W_0 * X_0 + W_1 * X_1 +$
$W_2 * X_2 + … + W_{15} * X_{15}$

这些式子由16个乘法和1个连加组成。若是你本身一我的用笔来算的话,须要一步一步算16次乘法和15次加法。

若是这个时候咱们把这我的物分配给4我的,同时去算\(W_0~W\_3\), \(W\_4~W\_7\), \(W\_8~W_{11}\), \(W_{12}~W_{15}\)这样四个部分的结果,再由一我的进行汇总,须要的时间就会缩短。

但并非全部问题,均可以经过并行提升性能来解决

要使用这种思想,须要知足如下条件:

  • 须要进行的计算,自己能够分解成几个能够并行的任务
    比如上面的乘法和加法计算,几我的能够同时进行,不会影响最后的结果。
  • 须要可以分解好问题,并确保几我的的结果可以汇总到一块儿
  • 在“汇总”这个阶段,是没有办法并行进行的,仍是得顺序执行,一步一步来。

这就引出了性能优化中一个经验定律

  • 阿姆达尔定律(Amdahl’s Law)
    对于一个程序进行优化以后,处理器并行运算以后效率提高的状况

具体能够用这样一个公式来表示:

优化后的执行时间 = 受优化影响的执行时间/加速倍数+不受影响的执行时间

在刚刚的向量点积例子里,4我的同时计算向量的一小段点积,就是经过并行提升了这部分的计算性能

可是,这4我的的计算结果,最终仍是要在一我的那里进行汇总相加

这部分汇总相加的时间,是不能经过并行来优化的,也就是上面的公式里面不受影响的执行时间部分

好比上面的各个向量的一小段

  • 点积,须要100ns
  • 加法须要20ns

总共须要120ns。这里经过并行4个CPU有了4倍的加速度。那么最终优化后,就有了100/4+20=45ns

即便咱们增长更多的并行度来提供加速倍数,好比有100个CPU,整个时间也须要100/100+20=21ns。

3 总结

不管是简单地经过提高主频,仍是增长更多的CPU核心数量,经过并行提高性能,都会遇到相应的瓶颈

仅靠简单地经过“堆硬件”的方式,在今天已经不能很好地知足咱们对于程序性能的指望了。

因而,工程师们须要从其余方面开始下功夫了。

在“摩尔定律”和“并行计算”以外,在整个计算机组成层面,还有这样几个原则性的性能提高方法。

3.1 加速大几率事件

深度学习,整个计算过程当中,99%都是向量和矩阵计算

因而,工程师们经过用GPU替代CPU,大幅度提高了深度学习的模型训练过程

原本一个CPU须要跑几小时甚至几天的程序,GPU只须要几分钟就行了

Google更是不知足于GPU的性能,进一步地推出了TPU

一般咱们使用 O 表示一个算法的好坏,咱们优化一个算法也是基于 big-O
可是 big-O 实际上是一个近似值,就比如一个算法时间复杂度是 O(n^2) + O(n)
这里的 O(n^2) 是占大比重的,特别是当 n 很大的时候,一般咱们会忽略掉 O(n),着手优化 O(n^2) 的部分

3.2 经过流水线提升性能

现代的工厂里的生产线叫“流水线”。

咱们能够把装配iPhone这样的任务拆分红一个个细分的任务,让每一个人都只须要处理一道工序,最大化整个工厂的生产效率。

咱们的CPU其实就是一个“运算工厂”

咱们把CPU指令执行的过程进行拆分,细化运行,也是现代CPU在主频没有办法提高那么多的状况下,性能仍然能够获得提高的重要缘由之一

3.3 经过预测提升性能

预测下一步该干什么,而不是等上一步运行结果,提早进行运算,也是让程序跑得更快一点的办法

在一个循环访问数组的时候,凭经验,你也会猜到下一步咱们会访问数组的下一项

后面要讲的“分支和冒险”、“局部性原理”这些CPU和存储系统设计方法,其实都是在利用咱们对于将来的“预测”,提早进行相应的操做,来提高咱们的程序性能。

深度优先搜索算法里面的 “剪枝策略”,防止没有必要的分支搜索,这会大幅度提高算法效率

  • 整个组成乃至体系结构,都是基于冯·诺依曼架构组成的软硬件一体的解决方案
  • 这里面的方方面面的设计和考虑,除了体系结构层面的抽象和通用性以外,核心须要考虑的是“性能”问题

参考

深刻浅出计算机组成原理

X 交流学习

Java交流群

博客

Github

相关文章
相关标签/搜索