之前的几篇文章中,分别介绍了性能优化方法、工具...
但是计算机系统是非常庞大的,包含了计算机体系结构、操作系统、网络、存储等,单单拎出任何一个方向都值得我们去研究很久,因此,我们在分析系统性能的时候,可能会碰到一些无法解释的问题或者现象,程序员必须了解的性能延迟指标 我们可以借助一些理论去帮助我们去进一步推断和解决问题。
本文主要介绍阿姆达定律、古斯塔夫森定律、帕累托法则、利特尔法则。
科学计算中用多处理器进行并行加速时,总体程序受限于程序所需的串行时间百分比。譬如说,一个程序 50% 是串行的,其他一半可以并行,那么,最大的加速比就是 2。无论用多少处理器并行,这个加速比不可能提高到大于 2。
加速比 = 优化前的系统耗时/优化后的系统耗时
对每一条曲线我们都可以看到,超过一定的并行度后,就很难进行进一步的速度提升了。由此可见,为了提高系统的性能,只提高CPU的数量不一定能起到有效的作用。需要从根本上修改系统的串行行为。提高系统内可优化模块的比重,在此基础上,合理增加处理器的数量,才能以最小的投入,得到最大的加速比。
听起来可能比较晦涩,我举个简单的例子:
你洗衣服加上晾晒衣服总共需要30分钟,但是洗衣机洗衣服15分钟时间是固定(串行)的,但是晾晒衣服可以通过多人并行操作,最后缩短为1分钟甚至更短,但是不可能小于15分钟。
这个定律看似陌生,其实在日常工作中经常遇到,有时在优化代码过程中发现有个递归算法,于是乎想到通过单层for循环,以为发现了新大陆,性能一定会大幅度提高,最后发现没有任何区别。
这个定律告诉我们从线性模型中抽离出来,继续细分整个处理流程,找出执行时间最长的程序热点,对这些代码段进行并行化从而将所有瓶颈逐个击破,这才是使通过并行化获得最大性能提升的最好办法。
同时它也可以用木桶定律解释,一个桶能够装多少水取决于最短的那块板子。