从那些方面提升计算机性能

  1. 功耗:CPU的极限

                  奔腾 4 的主频为什么没能超过 3.8GHz 的障碍呢?

                  答案就是功耗问题

                  功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量

                  

  2. 提升方式

        程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time

            (1)从指令数、CPI 以及 CPU 主频入手,由于指令数和cpi不太容易,从80 年代开始,不断增加晶体管(吞吐量)和提升 CPU 的时钟频率

                    缺点:功耗增加太多,就会导致 CPU 散热跟不上

                    解决方法:由以上功耗公式可得,功耗和电压的平方是成正比的。这意味着电压下降到原来的 1/5,整个的功耗会变成原来的 1/25

                      注释:电压不可能无限制的降低,一个是电压太低就会导致电路无法联通,另一个是对于工艺的要求也变高了,成本也更贵

           ( 2)并行优化,理解阿姆达尔定律

                     从奔腾 4 开始,Intel 意识到通过提升主频比较“难”去实现性能提升,边开始推出 Core Duo 这样的多核 CPU,通过提升“吞吐率”而不是“响应时间”,来达到目的

                    举个例子,我们做机器学习程序的时候,需要计算向量的点积,比如向量 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​ 这样四个部分的结果,再由一个人进行汇总,需要的时间就会缩短。 

                                   

                            并不是所有问题,都可以通过并行提高性能来解决。如果想要使用这种思想,需要满足这样几个条件。

                         第一,需要进行的计算,本身可以分解成几个可以并行的任务。好比上面的乘法和加法计算,几个人可以同时进行,不会影响最后的结果。

                         第二,需要能够分解好问题,并确保几个人的结果能够汇总到一起。

                         第三,在“汇总”这个阶段,是没有办法并行进行的,还是得顺序执行,一步一步来。这就引出了我们在进行性能优化中,常常用到的一个经验定律,阿姆达尔定律(Amdahl’s Law)

                           这个定律说的就是,对于一个程序进行优化之后,处理器并行运算之后效率提升的情况。具体可以用这样一个公式来表示:

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

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

                     

           (3) 加速大概率事件。

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

           (4) 通过流水线提高性能

                                我们把 CPU 指令执行的过程进行拆分,细化运行,也是现代 CPU 在主频没有办法提升那么多的情况下,性能仍然可以得到提升的重要原因之一

           (5) 通过预测提高性能

                               典型的例子就是在一个循环访问数组的时候,凭经验,你也会猜到下一步我们会访问数组的下一项

posted @ 2020-11-16 14:54  R旅途  阅读(284)  评论(0)    收藏  举报