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