前言
随着摩尔定律的消失,日益增长的数据交换增长并促进更快的硬件及软件的需求。对整个网络和存储也有了更高的要求。
在实际项目中,经常发现应用程序的性能并没有随着CPU数量的增加而提升。在性能为王的时代,如果不能找到产品的性能瓶颈并进行调优,那么产品将会被市场抛弃。
其实,大部分应用程序的性能提升都源于软件栈。下面是一个4096X4096矩阵乘法的性能表现:
影响软件性能的因素
系统默认情况下获得最佳性能的一些重要因素有:
- cpu的限制, cpu不会自动优化指令,而是按程序给定的指令进行运算;
- 编译器的限制,虽然编译器已经很智能,但是没有办法所有程序都编译成最佳的指令
- 算法复杂度分析的限制,算法的复杂度并不适合所有的场景,对不同数据规模效果不一致
性能升一方面可以优化程序,还可以优化硬件的设计以及提升算法的性能。
性能分析
性能分析就是通过测量数据,分析程序的瓶颈。找到问题后,使用合理的方法解决。
软件优化同时也需要考虑成本,只有大的收益情况下的优化才有意义。
性能测量
笔者的工作是为一些加速器开发对应的软件栈。加速器在硬件设计的时候,产品定好了指标,再根据指标和算法原理,指导硬件进行设计实现。
最终,经过全局的均衡,可以根据硬件的时钟频率、算法流程,计算一个理论最大性能。
经过硅前验证,最终实现的软件栈性能与理论性能差距在5%以内。数据越短的,性能差距越大,软件的性能损耗占比越高。
有了指标,测出来的数据也符合理论性能,那么就没有优化的必要。针对短数据,根据perf执行的分析,主要是一些数据拷贝组装占比较高,采用一些常用的优化技巧进行调优,最终效果并不明显。
为了进行测试,预先构建好命令,只对硬件操作部分进行基准测试,结果符合预期。
但是实际应用时,在短数据下是无法达到理论性能的,软件流程必须是一个完成的过程。作为产品,必须以真实程序的性能为准。
性能还受到环境影响,如果在系统还在运行其他程序,cpu不断地被调度,每次测出来的性能都会有个10%左右的波动,因此性能数据一般需要五组以上的数据取平均。
原厂给出的性能数据基本是基准程序测试法给出的,应用集成后,也会对完整的业务流程测试性能。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
博客地址: https://fishmwei.github.io
掘金主页: https://juejin.cn/user/2084329776486919