关于后端:程序员必备的linux常用的26条命令

9次阅读

共计 4628 个字符,预计需要花费 12 分钟才能阅读完成。

04 穿梭功耗墙,咱们该从哪些方面晋升“性能”?

上一讲,在讲 CPU 的性能时,咱们提到了这样一个公式:

程序的 CPU 执行工夫 = 指令数×CPI×Clock Cycle Time

这么来看,如果要晋升计算机的性能,咱们能够从指令数、CPI 以及 CPU 主频这三个中央动手。要搞定指令数或者 CPI,乍一看都不太容易。于是,研发 CPU 的硬件工程师们,从 80 年代开始,就挑上了 CPU 这个“软柿子”。在 CPU 上多放一点晶体管,一直晋升 CPU 的时钟频率,这样就能让 CPU 变得更快,程序的执行工夫就会缩短。

于是,从 1978 年 Intel 公布的 8086 CPU 开始,计算机的主频从 5MHz 开始,一直晋升。1980 年代中期的 80386 可能跑到 40MHz,1989 年的 486 可能跑到 100MHz,直到 2000 年的奔流 4 处理器,主频曾经达到了 1.4GHz。而消费者也在这 20 年里养成了“看主频”买电脑的习惯。过后曾经根本垄断了桌面 CPU 市场的 Intel 更是夸下了海口,示意奔流 4 所应用的 CPU 构造能够做到 10GHz,颇有一点“鼎力出奇观”的意思。

功耗: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 倍。比如说,我写这篇文章用的是 Surface Go,在这样的轻薄笔记本上,微软就是抉择了把电压降落到 0.25V 的低电压 CPU,使得笔记本能有更长的续航工夫。

并行优化,了解阿姆达尔定律

尽管制程的优化和电压的降落,在过来的 20 年里,让咱们的 CPU 性能有所晋升。然而从上世纪九十年代到本世纪初,软件工程师们所用的“面向摩尔定律编程”的套路越来越用不上来了。“写程序不思考性能,等明年 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]W=[W0,W1,W2,…,W15] 和向量 X=[X0,X1,X2,…,X15]X=[X0,X1,X2,…,X15],W⋅X=W0∗X0+W1∗X1+W·X=W0∗X0+W1∗X1+ W2∗X2+…+W15∗X15W2∗X2+…+W15∗X15。这些式子由 16 个乘法和 1 个连加组成。如果你本人一个人用笔来算的话,须要一步一步算 16 次乘法和 15 次加法。如果这个时候咱们把这个人物调配给 4 集体,同时去算 W0~W3W0~W3, W4~W7W4~W7, W8~W11W8~W11, W12~W15W12~W15 这样四个局部的后果,再由一个人进行汇总,须要的工夫就会缩短。

然而,并不是所有问题,都能够通过并行进步性能来解决。如果想要应用这种思维,须要满足这样几个条件。

第一,须要进行的计算,自身能够分解成几个能够并行的工作。好比下面的乘法和加法计算,几个人能够同时进行,不会影响最初的后果。

第二,须要可能合成好问题,并确保几个人的后果可能汇总到一起。

第三,在“汇总”这个阶段,是没有方法并行进行的,还是得程序执行,一步一步来。

这就引出了咱们在进行性能优化中,经常用到的一个教训定律,阿姆达尔定律(Amdahl’s Law)。这个定律说的就是,对于一个程序进行优化之后,处理器并行运算之后效率晋升的状况。具体能够用这样一个公式来示意:

优化后的执行工夫 = 受优化影响的执行工夫 / 减速倍数 + 不受影响的执行工夫

在刚刚的向量点积例子里,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 和存储系统设计办法,其实都是在利用咱们对于将来的“预测”,提前进行相应的操作,来晋升咱们的程序性能。

好了,到这里,咱们讲完了计算机组成原理这门课的“前情提要”。一方面,整个组成乃至体系结构,都是基于冯·诺依曼架构组成的软硬件一体的解决方案。另一方面,你须要明确的就是,这外面的方方面面的设计和思考,除了体系结构层面的形象和通用性之外,外围须要思考的是“性能”问题。

接下来,咱们就要开始深刻组成原理,从一个程序的运行讲起,开始咱们的“机器指令”之旅。

本文由 mdnice 多平台公布

正文完
 0