当前位置:首页 » 《随便一记》 » 正文

功耗是如何影响计算机性能的?_miles_ye的博客

0 人参与  2021年11月22日 15:03  分类 : 《随便一记》  评论

点击全文阅读


计算机性能的提升源自公式: 程 序 的 C P U 执 行 时 间 = 指 令 数 × C P I × 时 钟 周 期 时 间 程序的CPU执行时间=指令数×CPI×时钟周期时间 CPU=×CPI×

1.功耗问题的引出

实例1:貌似要减少指令数,减小CPI比较困难,而减小时钟周期可行。于是,从 1978 年 Intel 发布的 8086 CPU 开始,计算机的主频从 5MHz 开始,不断提升。1980 年代中期的 80386 能够跑到 40MHz,1989 年的 486 能够跑到 100MHz,直到 2000 年的奔腾 4 处理器,主频已经到达了 1.4GHz。而消费者也在这 20 年里养成了“看主频”买电脑的习惯。当时已经基本垄断了桌面 CPU 市场的 Intel 更是夸下了海口,表示奔腾 4 所使用的 CPU 结构可以做到 10GHz,颇有一点“大力出奇迹”的意思。

但是,Intel遇到了CPU的极限问题——功耗。奔腾 4 的CPU主频从来没有达到过10GHz,最高只有3.8GHz。而且发现奔腾 4 2.4GHz的CPU性能与奔腾 3 1.6Ghz的CPU性能差不多。这让AMD获得了喘息的机会,代表着“主频时代”的终结。

如今,2019 年的最高配置 Intel i9 CPU,主频也只不过是 5GHz 而已。相较于 1978 年到 2000 年,这 20 年里 300 倍的主频提升,从 2000 年到现在的这 19 年,CPU 的主频大概提高了 3 倍。

实例2:一个 3.8GHz 的奔腾 4 处理器,满载功率是 130 瓦。这个 130 瓦是什么概念呢?机场允许带上飞机的充电宝的容量上限是 100 瓦时。如果我们把这个 CPU 安在手机里面,不考虑屏幕内存之类的耗电,这个 CPU 满载运行 45 分钟,充电宝里面就没电了。而 iPhone X 使用 ARM 架构的 CPU,功率则只有 4.5 瓦左右。

2. 性能与功耗

CPU是超大规模集成电路(Very Large Scale Integration,简称VLSI)。要提高CPU计算速度,一方面,在 CPU 里,同样的面积里面,多放一些晶体管,也就是增加密度;另一方面,要让晶体管“打开”和“关闭”得更快一点,也就是提升主频。而这两者,都会增加功耗,带来耗电和散热的问题。就像为了加快工作,要在工厂里多塞点人一样。
散热方式:风扇、空调、水冷。但是在CPU内增加晶体管密度和“开关”频率也是有限的。
功 耗 ≈ 1 / 2 × 负 载 电 容 × 电 压 的 平 方 × 开 关 频 率 × 晶 体 管 数 量 功耗\approx1/2 ×负载电容×电压的平方×开关频率×晶体管数量 1/2××××

  1. 增加晶体管数量 --> 多放一点晶体管 --> 将晶体管造的小一点
    这就是提升“制程”,目前我国可以达到28nm,而荷兰ASML可以达到5nm,相当于将晶体管变小到了原来的1/5大小。
    在这里插入图片描述
  2. 降低电压
    功耗和电压的平方是成正比。这意味着电压下降到原来的 1/5,整个的功耗会变成原来的 1/25。
    实例:从 5MHz 主频的 8086 到 5GHz 主频的 Intel i9,CPU 的电压已经从 5V 左右下降到了 1V 左右。这也是为什么我们 CPU 的主频提升了 1000 倍,但是功耗只增长了 40 倍。微软Surface Go轻薄笔记本上使用了0.25V 的低电压 CPU,使得笔记本能有更长的续航时间。

3. 性能与并行优化

在过去的 20 年里,制程的优化电压的下降让CPU性能有所提升。但是从二十世纪90年代至二十一世纪初,软件工程师所用的“面向摩尔定律编程”的套路越来越行不通了。这种思想就是“写程序不考虑性能,等明年 CPU 性能提升一倍,到时候性能自然就不成问题了”。

于是,从奔腾 4 开始,Intel 意识到通过提升主频比较“难”去实现性能提升,就开始推出 Core Duo 这样的多核 CPU,通过提升“吞吐率”而不是“响应时间”,来达到提升CPU性能的目的**。提升“吞吐率”就是通过并行优化来提升CPU性能**,就好比用多匹马拉车,而减小“响应时间”就好比用一匹优等马换一匹劣等马。

实例3:做机器学习程序的时候,需要计算向量的点积,比如向量 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​ 这样四个部分的结果,再由一个人进行汇总,需要的时间就会缩短。
在这里插入图片描述
但是,这样的并行计算需要满足3个条件:
1)没有上下文关联,或者称为上下文解耦。也就说需要进行的计算,本身可以分解成几个可以并行的任务。好比上面的乘法和加法计算,几个人可以同时进行,不会影响最后的结果。
2)需要能够分解好问题,并确保几个人的结果能够汇总到一起。
3)在“汇总”这个阶段,是没有办法并行进行的,还是得顺序执行,一步一步计算。

这就引出了在进行性能优化时的一个经验——阿姆达定律(Amdahl’s Law),对于一个程序进行优化之后,处理器并行运算之后效率提升情况如下列公式所示:

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

上例中,4 个人同时计算向量的一小段点积,就是通过并行提高了这部分的计算性能。但是,这 4 个人的计算结果,最终还是要在一个人那里进行汇总相加。这部分汇总相加的时间,是不能通过并行来优化的,也就是上面的公式里面不受影响的执行时间这一部分。

比如上例的各个向量的一小段的点积,需要 100ns,加法需要 20ns,总共需要 120ns。这里通过并行 4 个 CPU 进行了 4 倍的加速度。那么最终优化后,就有了 100/4+20=45ns。即使我们增加更多的并行度来提供加速倍数,比如有 100 个 CPU,整个时间也需要 100/100+20=21ns。
在这里插入图片描述

4. 小结

无论是简单地通过提升主频(功耗和散热问题),还是增加更多的 CPU 核心数量,通过并行来提升吞吐量,达到提升性能的目的(并行部分可以提高,但串行部分提高不了),都会遇到相应的瓶颈。

在“摩尔定律”和“并行计算”之外,在整个计算机组成层面,还有如下几个原则性的性能提升方法:

1)加速大概率事件。最典型的就是,过去几年流行的深度学习,整个计算过程中,99% 都是向量和矩阵计算。于是,工程师们通过用 GPU 替代 CPU,大幅度提升了深度学习的模型训练过程。本来一个 CPU 需要跑几小时甚至几天的程序,GPU 只需要几分钟就好了。Google 更是不满足于 GPU 的性能,进一步地推出了 TPU。后面会为讲解 GPU 和 TPU 的基本构造和原理。

2)通过流水线提高性能。现代的工厂里的生产线叫“流水线”。我们可以把装配 iPhone 这样的任务拆分成一个个细分的任务,让每个人都只需要处理一道工序,最大化整个工厂的生产效率。类似的,CPU 其实就是一个“运算工厂”,把 CPU 指令执行的过程进行拆分、细化运行,也是现代 CPU 在主频没有办法提升那么多的情况下,性能仍然可以得到提升的重要原因之一。后面也会讲到,现代 CPU 里是如何通过流水线来提升性能的,以及反面的,过长的流水线会带来什么新的功耗和效率上的负面影响。

3)通过预测提高性能。通过预先猜测下一步该干什么,而不是等上一步运行的结果,提前进行运算,也是让程序跑得更快一点的办法。典型的例子就是在一个循环访问数组的时候,凭经验,你也会猜到下一步我们会访问数组的下一项。后面要讲的“分支和冒险”、“局部性原理”这些 CPU 和存储系统设计方法,其实都是在利用对于未来的“预测”,提前进行相应的操作,来提升程序性能。

问题:这里介绍了三种常见的性能提升思路,分别是:加速大概率事件、通过流水线提高性能和通过预测提高性能。请你想一下,除了在硬件和指令集的设计层面之外,在软件开发层面,有用到过类似的思路来解决性能问题吗?


点击全文阅读


本文链接:http://zhangshiyu.com/post/31183.html

性能  提升  主频  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1