摘要:当应用软件及硬件确定后,编译器对应用的自动优化将成为应用性能的关键。
从应用优化说起
一个应用的优化通常有架构级优化、模块级优化和函数级优化,高性能作为云数据库GaussDB主打特性之一,其在这几方面都进行了大量的优化,也有很强的性能表现。如何进一步提升性能,是否还有其他方面的切入点?
答案之一是编译器,编译器作为人机交流的桥梁,一方面正确地把高级语言翻译成机器语言,另一方通过各种优化变换方法生成更高效的等价语义,所以当应用软件及硬件确定后,编译器对应用的自动优化将成为应用性能的关键。
1.毕昇编译器是什么
毕昇编译器是华为编译器实验室针对通用处理器架构构建,支持C/C++/Fortran编程语言,增强和引入了多种编译优化技术,致力于打造高性能、高可信及易扩展的编译器工具链。毕昇编译器针对鲲鹏架构深度优化,SPEC CPU 2017性能较开源GCC提升30%。
- 高性能:编译深度优化,增强多核并行化,自动向量化等,大幅提升指令和数据呑吐量。
- 多算力支持:支持其他Arm架构国产芯片,如飞腾。支持x86、RISC-V、龙芯等架构。
- 高可信:商业+自研测试套,每日100万+测试用例,全面质量保障;开发态提供多种安全编码工具;社区CVE及时修复;车规级安全认证。
2. 相关编译器优化技术
2.1 函数内联(inline)
函数/过程是编程语言的重要组成部分,函数/过程之间的调用是有一定的开销,比如保存和恢复上下文、传递参数等操作开销。函数内联优化是一种常用的优化技术,它可以将函数调用处直接替换为函数体,从而减少函数调用的开销。下面是一个简单的示例,展示了如何在编译器中应用inline优化。
int square(int x) { return x * x; } int calculate(int a) { return square(a) + square(a + 1); }
编译器进行自动内联后,如下:
int calculate(int a) { return (a * a) + ((a + 1) * (a + 1)); }
在优化后的代码中,不再有调用square函数的开销,另外内联后可以帮助编译器发现更多的优化机会,比如本例中,可以进一步进行编译期间的计算。
这只是一个简单的例子,实际的编译器inline优化会更为复杂,涉及到更多的优化策略和技术。毕昇编译器进行了inline优化增强,如下是mataERP场景下inline的情况。
函数内联后对应用热补丁机制有一定影响,制作工作量会略有增加。
2.2 指令预取优化
指令预取(Instruction Prefetching)是一种计算机体系结构中的优化技术,用于提前获取未来可能需要执行的指令数据,并将其预加载到指令缓存中,以减少指令访问延迟和提高程序的执行效率。
在执行程序时,处理器需要从内存中获取指令数据并进行解码和执行。由于内存访问的延迟比处理器的执行速度慢,处理器可能需要等待指令数据的到达,导致指令执行的停滞。为了克服这种延迟,指令预取技术被引入。
指令预取的基本原理是根据程序的访存模式和分支预测信息,提前预测和获取未来可能需要执行的指令数据。这样,当处理器执行到需要这些指令的时候,它们已经被预先加载到指令缓存(例如指令高速缓存)中,避免了等待时间。
如下面这个来自GaussDB的函数:
毕昇编译器(右侧)插入了prfm预取指令,prfm是鲲鹏平台上定义的内存数据预取指令,执行指令预取优化。
2.3 自动向量化技术
自动向量化技术是编译器利用硬件架构提供的SIMD(single instruction multiple data)指令,如Arm的NEON/SVE指令,x86平台的SSE/AVX指令,一条指令可以处理多路数据,从而提升应用二进制的执行效率。毕昇编译器做了大量向量化新场景识别和算法增强,并结合鲲鹏SIMD指令特点进行深度优化。
如上图,如有两组四个整形数据相加运算,左侧需要四次操作,而右侧向量化后只需要1次操作。
2.4 链接时优化技术
链接时优化LTO(Link Time Optimization)是程序链接期优化,也叫链接期过程间优化。如下图,编译器在链接时将所有编译单元(过程)合并在一起,这样可以发掘不同过程间的优化机会,比如内联(inline)、函数特化(function specialization)、冗余代码消除、常量传播等等,通常可以获得更高的性能收益。当然同时也带来编译器时间加长的负面收益。
2.5 CFGO优化
对于控制流较多、对数据分段访问较多的应用(例如数据库类应用)非常适合编译器的反馈类优化技术,CFGO(Continuous FGO)通过收集程序运行时信息(profile)进行优化决策。编译器根据这些运行时信息指导各种编译优化技术进行更准确的优化决策,生成目标程序。
3. 性能收益
毕昇编译器协同GaussDB跨域创新,基于应用层优化、编译中端优化、算力优化等多种手段对GaussDB应用场景持续优化。
- 高性能:对插入、更新、删除等不同负载的业务,毕昇 for GuassDB优化实现 TPCC性能提升30%,TPCH性能提升13%,应用性能提升5%-10%。
- 高安全:毕昇编译器全面升级代码检测工具,保障安全可信代码开发,实现高质量、高安全的持续集成、交付与部署。
4. 总结与展望
数据库和编译器都是关键的基础软件,为关基行业提供软件根技术,后续将进行如下几方面的工作:
(1)完成GaussDB切换毕昇编译器,直接获取已有的性能收益;
(2)针对典型客户场景,技术能力联合创新和快速验证;
(3)突破编译器/虚拟机关键技术,支撑高斯PLSQL性能提升;
目前GaussDB已启动切换毕昇编译器进程,并在已经在银行、政务云等客户进行了POC验证,相信后续毕昇编译器可以为GaussDB提供更强大的竞争力,从而也为更多行业客户创造更多的商业价值。
另外,毕昇编译器作为通用编译器,也可涵盖金融领域其他应用场景,如优化haproxy应用,助力工行音视频交互服务获得收益;落地上交所CICD,通过协助检测内存安全、代码规范,保障高质量交付。
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!