学习笔记-总目录
通过功耗墙,我们应该从哪些方面来提高性能?
- 前言
- 一、功耗:CPU 人体极限
- 二、并行优化,了解阿姆达尔定律
- 三、延伸【略看】
- 四、总结【个人总结重点】
前言
上一讲,在讲 CPU 在性能方面,我们提到了这样一个公式:
程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time
在这种情况下,如果我们想提高计算机的性能,我们可以从指令数、CPI 以及 CPU 主频从这三个地方开始。确定指令数或指令数。 CPI,乍一看并不容易。
于是,研发 CPU 硬件工程师,从 80 从年代开始,就挑上了 CPU 这个软柿子。晶体管,不断提升 CPU 时钟频率可以让 CPU 程序的执行时间会缩短。
于是,从 1978 年 Intel 发布的 8086 CPU 从一开始,计算机的主频就开始了 5MHz 开始,不断改进。 1980 年代中期的 80386 能够跑到 40MHz, 1989 年的 486 能够跑到 100MHz, 直到 2000 年的奔腾 4 处理器,主频已到达1.4GHz。
5MHz(1978年,8086CPU) 40MHz(1980年代中期, 80386CPU) 100MHz(1989年,80486CPU) 1.4GHz(2000年, 奔腾4处理器)
而且消费者也在这里 20 多年来,我养成了看主频买电脑的习惯。当时桌面基本垄断了 CPU 市场的 Intel 更夸下海口,说奔腾 4 所使用的 CPU 可以做到结构 10GHz,有点大力出奇迹。
一、功耗:CPU 人体极限
然而,计算机科学界从未相信大力出奇迹。。这不是最糟糕的。更糟糕的是,人们发现奔腾 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 倍。
奔腾 4 为什么主频不能超过 3.8GHz 障碍呢?答案是功耗。功耗问题是什么?让我们先看一个直观的例子。
一个 3.8GHz 的奔腾 4 满载功率为处理器130 瓦。这个 130 瓦片的概念是什么?机场允许飞机充电宝的容量上限是100 瓦时。假如我们这样做 CPU 安装在手机里,不考虑屏幕内存等功耗,这个 CPU 满载运行 45 分钟,充电宝里电了。 iPhone X 使用 ARM 架构的 CPU,功率则只有 4.5 瓦左右。
我们的 CPU,一般称为。这些电路实际上是由晶体管组成的。CPU 在计算中,实际上是让晶体管中的开关不断打开和关闭,结合各种计算和功能。
一方面,我们想快速计算 CPU 在同一面积内,放置更多的晶体管,即;另一方面,我们应该更快地打开和关闭晶体管。两者都会增加功耗,带来耗电散热问题。
这么说可能还是有点抽象,我还是给你举一个例子。你可以把一个计算机 CPU 想象一个巨大的工厂,里面有很多工人,相当于 CPU 上述晶体管相互配合。
为了工作得更快,我们必须在工厂里塞更多的人。你可能会问,为什么不把工厂建得更大呢?这是因为,如果人们离得很远,他们需要更长的时间才能走过去,这也会导致性能下降。就好像如果 CPU 面积大,晶体管间距大,电信号传输时间长,运行速度慢。
除了多塞一点人,我们也希望每个人的动作都更快,这样我们就可以在同一时间做更多的工作。这相当于
我们会在 CPU 抹硅脂,安装风扇,甚至使用水冷或其他更好的散热设备,就像在工厂安装风扇、空调、冷饮一样。
因此,在 CPU 在里面,晶体管的数量和晶体管的开关频率也有限。 CPU 可以用这样的公式来表示:
功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量
然后,为了提高性能,我们需要不断增加晶体管的数量。在同一区域,如果我们想放更多的晶体管,我们必须使晶体管更小。这就是我们通常所说的完善工程。。这相当于我们在工厂,同样的工作,我们想找一个更瘦的工人,这样一个工厂就可以有更多的人。我们还需要提高主频率,使开关的频率更快,也就是说,我们需要找到更快的工人。 但是,。在整个功耗公式中,。这意味着电压下降到原来的水平 1/5,整个的功耗会变成原来的 1/25。
事实上,从 5MHz 主频的 8086 到 5GHz 主频的 Intel i9,CPU 电压已经从 5V 左右下降 1V 左右。这就是为什么我们 CPU 主频增加 1000 倍,但功耗只增加了。 40 倍。例如,我用这篇文章写这篇文章 Surface Go,在如此轻薄的笔记本上,微软选择将电压降低到 0.25V 的低电压 CPU,使笔记本能有更长的续航时间。
二、并行优化,理解阿姆达尔定律
尽管过去工艺的优化和电压的下降 20 年,让我们的 CPU 性能有所提高。但从90年代到本世纪初,软件工程师使用的摩尔定律编程套路越来越不可用。写程序不考虑性能,等明年 CPU 性能翻了一番,性能自然就不成问题了。
于是,从奔腾 4 开始,Intel 意识到通过提高主频难来提高性能开始推出 Core Duo 这样的多核 CPU,通过提高吞吐率而不是响应时间来实现目标。
提高响应时间就像提高你使用的交通工具的速度。例如,你最初开车,但现在它变成了火车甚至飞机。从上海到北京开车 20 个小时,换成飞机就只要 2 已经一个小时了,但是,在此之上,提高速度并不容易。 CPU 在奔腾 4 就像飞机的速度极限一样。
那你可能要问,接下来该怎么办?与加速飞机相比,工程师们想出了新的方法,可以一次同时开 2 架、4 架乃至 8 就像我们现在用的飞机一样 2 核、4 核,乃至 8 核的 CPU
虽然从上海到北京的时间没有改变,但一次飞行 8 飞机自然会运输更多的东西,也就是所谓的吞吐率。所以,不管你需要不需要,现在 CPU 性能有所提高 2 倍乃至 8 倍、16 倍。这也是提高性能最常见的方法,。。
这个想法可以在很多地方使用。例如,当我们做机器学习程序时,我们需要计算向量点积,如向量 W=[W0,W1,W2,…,W15] 和向量 X=[X0,X1,X2,…,X15],W?X=W0?X0 W1?X1 W2?X2 … W15?X15。这些式子由 16 个乘法和 1 一个连加组成。如果自己用笔算,需要一步一步算。 16 次乘法和 15 次加法。如果这时候我们把这个任务分配给 4 个人,同时去算 W0~W3, W4~W7, W8~W11, W12~W15 这样四个部分的结果,再由一个人进行汇总,需要的时间就会缩短。 但是,并不是所有问题,都可以通过并行提高性能来解决。如果想要使用这种思想,需要满足这样几个条件。
-
第一,需要进行的计算,本身可以分解成几个可以并行的任务。好比上面的乘法和加法计算,几个人可以同时进行,不会影响最后的结果。
-
第二,需要能够分解好问题,并确保几个人的结果能够汇总到一起。
-
第三,在“汇总”这个阶段,是没有办法并行进行的,还是得顺序执行,一步一步来。
这就引出了我们在进行性能优化中,常常用到的一个经验定律,。这个定律说的就是,对于一个程序进行优化之后,处理器并行运算之后效率提升的情况。具体可以用这样一个公式来表示:
优化后的执行时间 = 受优化影响的执行时间 / 加速倍数 + 不受影响的执行时间
在刚刚的向量点积例子里,4 个人同时计算向量的一小段点积,就是通过并行提高了这部分的计算性能。但是,这 4 个人的计算结果,最终还是要在一个人那里进行汇总相加。这部分汇总相加的时间,是不能通过并行来优化的,也就是上面的公式里面这一部分。
比如上面的各个向量的一小段的点积,需要 100ns,加法需要 20ns,总共需要 120ns。这里通过并行 4 个 CPU 有了 4 倍的加速度。那么最终优化后,就有了 100/4+20=45ns。即使我们增加更多的并行度来提供加速倍数,比如有 100 个 CPU,整个时间也需要 100/100+20=21ns。
三、延伸【略看】
我们可以看到,无论是简单地通过提升主频,还是增加更多的 CPU 核心数量,通过并行来提升性能,都会遇到相应的瓶颈。仅仅简单地通过“堆硬件”的方式,在今天已经不能很好地满足我们对于程序性能的期望了。于是,工程师们需要从其他方面开始下功夫了。
在“摩尔定律”和“并行计算”之外,在整个计算机组成层面,还有这样几个原则性的性能提升方法。
1.。最典型的就是,过去几年流行的深度学习,整个计算过程中,99% 都是向量和矩阵计算,于是,工程师们通过用 GPU 替代 CPU,大幅度提升了深度学习的模型训练过程。本来一个 CPU 需要跑几小时甚至几天的程序,GPU 只需要几分钟就好了。Google 更是不满足于 GPU 的性能,进一步地推出了 TPU。后面的文章,我也会为你讲解 GPU 和 TPU 的基本构造和原理。
2.。现代的工厂里的生产线叫“流水线”。我们可以把装配 iPhone 这样的任务拆分成一个个细分的任务,让每个人都只需要处理一道工序,最大化整个工厂的生产效率。类似的,我们的 CPU 其实就是一个“运算工厂”。我们把 CPU 指令执行的过程进行拆分,细化运行,也是现代 CPU 在主频没有办法提升那么多的情况下,性能仍然可以得到提升的重要原因之一。我们在后面也会讲到,现代 CPU 里是如何通过流水线来提升性能的,以及反面的,过长的流水线会带来什么新的功耗和效率上的负面影响。
3.。通过预先猜测下一步该干什么,而不是等上一步运行的结果,提前进行运算,也是让程序跑得更快一点的办法。典型的例子就是在一个循环访问数组的时候,凭经验,你也会猜到下一步我们会访问数组的下一项。后面要讲的“分支和冒险”、“局部性原理”这些 CPU 和存储系统设计方法,其实都是在利用我们对于未来的“预测”,提前进行相应的操作,来提升我们的程序性能。
各种缓存(内存缓存、CDN缓存)
并发编程、异步编程
音视频播放器边播放边缓冲
小说的下一页预加载
电商大促的CDN预热
四、总结【个人总结的重点】
-
:集成电路上可以容纳的晶体管数目在大约每经过18个月便会增加一倍(行业内的“提升制程”28nm—>7nm)。【摩尔的经验之谈】现已失效。即主频已经无法按此速度快速增加了。提升性能就得从其他方面考虑了(并行执行)。【类似工厂雇佣更瘦的、干活更快的人】。
-
:多核CPU(2、4、8核处理器)【类似工厂增多人手】
-
主频提高的理解:工厂的工人又挤(晶振增多)、干活又得快(各晶振距离变短,信息传输就快),那么就会更热,功耗会更大,CPU就会崩溃,这就。
-
功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量
-
通过降低电压来减小功耗(功耗和CPU电压的平方成正比,所以电压下降到原来的 1/5,整个的功耗会变成原来的 1/25。)
-
常识:飞机上带的最大的充电宝100Wh。
-
iPhone X 使用 ARM 架构的 CPU,满载功率则只有 4.5 瓦左右,100Wh的充电宝可以使用大约20小时(100Wh/4.5W≈20小时)。
【计算机组成原理】学习笔记——总目录