程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time数组
CPI和指令数都不太容易,越是研发CPU的硬件工程师们就从COU主频下手性能优化
是由于功耗,咱们的CPU,通常都被叫作超大规模集成电路,这些电路,实际上都是一个个晶体管组合而成的,CPU在计算、其实就是让晶体管里面的开关不断地区“打开”和“关闭”,来组合完成各类运算和功能bash
要想计算得快,一方面,咱们要在CPU里,一样的面积里面,多方一些晶体管,也就是增长密度;机器学习
另外一方面,咱们让晶体管“打开”和“关闭”的更快一点,也就是提高主频,而这二者都会增长功耗,带来耗电和散热的问题工具
你能够把CPU想象成一个巨大的工厂、里面有不少工人,至关于CPU上面的晶体管。互相之间协同工做,为了工做的快一点,咱们在工厂里多塞一点人,你可能会问,为何不把工厂造的大一点呢?性能
一、为何不把工厂造的大一点呢?学习
这是由于,人和人之间若是离得远了,互相之间走过去须要花的时间就会变长也会致使性能降低,优化
这就好像若是CPU的面积大,晶体管之间的距离会变大,电信号传输的时间就会变长,运算速度天然就慢了加密
二、要是太热工厂里的人会中暑、cpu会出错或崩溃spa
除了堵塞一点人,咱们还但愿每一个人的动做都快一点,这样一样的时间里就能够多干一点活儿了,这就至关提高了CPU主频,可是动做快,每一个人要出汗散热,
要是太热,对工厂里的人来都会中暑生病,对CPU来讲就会崩溃出错
三、工厂太热如何处理?
咱们会在CPU上抹硅脂、装风扇,乃至用上水冷或者其余更好的散热设备,就好像在工厂里面装风扇、空调、发冷饮同样。可是一样的空间下,装上风扇空调可以带来的散热效果也有极限的
所以,在CPU里面,可以放下的晶体管数量和晶体管的“开关”频率也都是有限的,一个CPU的功率,能够用这样一个公式来表示一个CPU的功率
功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量
那么,为了提升性能,咱们须要不断地增长晶体管数量,一样的面积下,咱们想要多放一点晶体管,就要把晶体管造得小一点
这个就是平时咱们所说的提高“制程序”,从从 28nm 到 7nm,至关于晶体管自己变成了原来的 1/4大小,这个就至关于工厂里,一样的活儿
咱们要找瘦小一点的工人,这样一个工厂里面就能够多一些人,咱们还要提高主频,让开关的频率变快,也就是要找手脚更快的工人
可是,功耗增长大太多,就会致使CPU散热跟不上,这时,咱们就须要下降电压,这里有一点很是关键,在整个功耗的 公式里面,
功耗和电压的平方是成比的,这觉得着电压降低到原来的1/5,整个的功耗会变成原来的 1/25
一、为何主频提高到了1000倍,可是功耗只增加了40倍
事实上,从到5MHz 主频的 8086 到 5GHz 主频的 Intel i9,CPU 的电压已经从 5V 左右降低到了1V 左右,这也是为何咱们的CPU
主频提高到了1000倍,可是功耗只增加了40倍,好比说,个人Surface Go,在这样的轻薄笔记本上微软就是选择了电压降低到的电压CPU
使得笔记本能有更长的续航时间
从奔腾4开始,Intel 意识到经过提高主频比较“难”去实现性能提高,便开始推出Core Duo 这样的多核 CPU,经过提高“吞吐率”
而不是“响应时间”,来达到目的。提高响应时间,就比如提高你的用的交通工具的速度,好比本来你是开汽车,如今变成了回车乃至飞机
原本开车从上海到北京要20个小时,换成飞机须要2个小时了,可是在这之上,再想要提高速度就不太容易了,咱们的CPU在奔腾4的年代,就比如已经到了飞机这个速度极限了
那你可能要问了,接下来怎么办呢?相比于给飞机提速,工程师们又想到了新的办法,能够一次同时开2架、4架乃至8架飞机,这就好像咱们如今用的2核、4核、乃至8核的CPU
虽然上海到北京的时间没有变,可是一次费8架飞机可以云的东西天然就变多了,也就是所谓的“吞吐率”变大了,因此,无论你有没有须要,如今的性能就是提高了2倍乃至8倍、16倍,
这也是一个最多见的提高性能的方式,经过并行提升性能
可是,并非全部问题,均可以经过并行提升性能来解决,若是想使用这种思想,须要知足这样几个条件。
第一:须要进行的计算,自己能够分解成几个能够并行的任务,比如上面的乘法和加法计算,几我的能够同时进行,不会影响最后的结果
第二:须要可以分解好问题,并确保几我的的结果可以汇总到一块儿
第三:在汇总这个阶段,是没有办法进行的,仍是得顺序执行,一步一步来
这就引出了性能优化中,经常用到的一个经验定律,阿姆尔定律,这定律说的就是,对于一个程序进行优化以后,处理器并行运算以后效率提高的
状况,具体能够用这样一个公式来表示
优化后的执行时间 = 受优化影响的执行时间 / 加速倍数 + 不受影响的执行时间
在刚刚的向量点积例子里,4我的同时计算向量的一小段点积,就是经过并行提升这部分的计算性能,
可是这4我的的计算结果,最终还要在一我的哪里进行汇总相加的时间,是不能经过并行来优化的,也就是上面的公式里面不受影响的执行时间这一部分
好比上面这个向量的一小段点积,须要100ms,加法须要20ns,总共须要120ns,这里经过并行4个CPU有了4倍的加速度,那么最终优化后就有了
100/4+20=45ns
即便咱们增长更多的并行度来提升加速倍数,好比100个cpu,整个事件也须要
100/100+20=21ns
加速大几率事件,最典型的就是,过去今年流行的深度学习,整个计算过程当中99%都是向量和矩阵计算,因而,工程师经过GPU和CPU,大幅度提高了深度学习的模型能
训练过程,奔爱一个c须要跑几个小时甚至几天的程序,GPU只须要几分钟就行了,更是不知足于GPU的西能,进一步脱出了TPU,后面的文章
我会为你讲解GPU和TPU的基本构造和原理
经过流水线提升性能。现代的工厂里的生产线叫“流水线”。咱们能够把装配 iPhone 这样的任务拆分红一个个细分的任务,让每一个人都只须要处理一道工序,
最大化整个工厂的生产效率。类相似的,咱们的 CPU 其实就是一个“运算工厂”。咱们把 CPU 指令执行的过程进行拆分,细化运行,也是现代 CPU 在主频没有办法提高那么多的状况下,
性能仍然能够获得提高的重要缘由之一。咱们在后面也会讲到,现代 CPU 里是如何经过流水线来提高性能的,以及反面的
过长的流水线会带来什么新的功耗和效率上的负面影响。
经过预测提升性能,经过预先猜想一下不应干什么,而不是等上一步运行的结果,提早进行运算,也是让程序跑得更快一点的办法。典型的例子就是在一个循环访问数组的时候,凭经验,你也会猜到下一步咱们会访问数组的下一项,后面要讲的“分支和冒险”、“局部性原理”、这些CPU和存储系统设计方法,其实都是在利用咱们对于将来的“预测”、提早进行相应的操做,来提高咱们的程序性能