摘要:当应用软件及硬件确定后,编译器对应用的自动优化将成为应用性能的关键。

从应用优化说起

一个应用的优化通常有架构级优化、模块级优化和函数级优化,高性能作为云数据库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,通过协助检测内存安全、代码规范,保障高质量交付。

点击关注,第一时间了解华为云新鲜技术~

当GaussDB遇上了毕昇编译器的更多相关文章

  1. 当property遇上category

    [当property遇上category] @property可以在类定义中,以及extension定义中使用,编译器会自动为@property生成代码,并在变量列表(ivar_list_t)中添加相 ...

  2. 当Java代码遇上抽象、重载加重写,一切都不美好了

    当Java代码遇上抽象.重载加重写.一切都不美好了 前几天调程序遇上个奇怪的bug.一直没找到问题,今天最终发现问题所在了,不说了先上代码(下面代码是演示样例代码,经測试,Java不存在这问题,安卓存 ...

  3. MVC遇上bootstrap后的ajax表单模型验证

    MVC遇上bootstrap后的ajax表单验证 使用bootstrap后他由他自带的样式has-error,想要使用它就会比较麻烦,往常使用jqueyr.validate的话只有使用他自己的样式了, ...

  4. 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)

      邀请函: 尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实 ...

  5. 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)

        我们将在广州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战技巧. 时间:2 ...

  6. 敏捷遇上UML——软创基地马年大会(深圳站 2014-3-15)

    邀请函: 尊敬的阁下: 我们将在深圳为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战 ...

  7. 初识genymotion安装遇上的VirtualBox问题

    想必做过Android开发的都讨厌那慢如蜗牛的 eclipse原生Android模拟器吧! 光是启动这个模拟器都得花上两三分钟,慢慢的用起来手机来调试,但那毕竟不是长久之计,也确实不方便,后来知道了g ...

  8. SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败解决方案

    SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败的问题,可作如下尝试: 更新失败后,在windows的[事件查看器→应用程序]中找到来源为MsiInstaller,事件ID为1 ...

  9. 当创业遇上O2O,新一批死亡名单,看完震惊了!

    当创业遇上O2O,故事就开始了,总投入1.6亿.半年开7家便利店.会员猛增至10万……2015半年过去后,很多故事在后面变成了一场创业“事故”,是模式错误还是烧钱过度?这些项目的失败能给国内创业者带来 ...

  10. LoadRunner - 当DiscuzNT遇上了Loadrunner(下) (转发)

    当DiscuzNT遇上了Loadrunner(下) 在之前的两篇文章中,基本上介绍了如何录制脚本和生成并发用户,同时还对测试报告中的几个图表做了简单的说明.今天这篇文章做为这个系列的最后一篇,将会介绍 ...

随机推荐

  1. CSP初赛知识点

    初赛知识点 计算机基础知识 1946年,世界上第一台计算机 ENIAC(埃尼阿克)在美国宾夕法尼亚大学诞生. 冯·诺依曼:计算机之父,提出了计算机体系结构(冯·诺依曼架构) 运算器 控制器 存储器:存 ...

  2. springboot整合shiro框架学习

    springboot整合shiro框架做用户认证与授权 springboot整合shiro框架的流程主要分为: 导入shiro依赖 <dependency> <groupId> ...

  3. zabbix监控Tomcat/JVM 实例性能

    1.背景 zabbix-4.0 环境已部署好 JDK .Tomcat环境已部署好 2.配置Tomcat JMX 编辑catalina.sh加入以下配置 # vim /usr/local/tomcat/ ...

  4. AT通讯总结(56K猫调制解调器Modem)型号I-56EM

    1.关闭流控RTS与DTR AT&D0&K0\r\n 2.保存到非易失性存储 AT&W\r\n 3.向800001音频拨号 ATDT800001\r\n 4.接听 ATA\r\ ...

  5. centos7通过yum安装mysql5.7以上版本

    1.检查并卸载mariadb yum remove *mariadb* 遇到要求输入直接y/n 直接输入y回车 2.下载并安装mysql mysql源地址:https://repo.mysql.com ...

  6. GitHub 官方开源的字体集「GitHub 热点速览」

    前几天 GitHub 官方一口气开源了 5 款字体,各有特色,彼此兼容,重要的是代码友好.这不,一开源就获得了 4.5k+ 的 star. 本周除了这个热点之外,当属 OpenAI 又有新动态了,你可 ...

  7. Spring5学习随笔-Spring5的第一个程序(环境搭建、日志框架整合)

    第二章.第一个Spring程序 1.软件版本 1.JDK1.8+ 2.Maven3.5+ 3.IDEA2018+ 4.SpringFramework 5.1.4 官网:www.spring.io 2. ...

  8. Docker安装与教程-Centos7(一)

    复现漏洞时,经常要复现环境,VMware还原太过麻烦,所以学习docker的基本操作也是必要的 Docker三要素-镜像.容器.仓库 操作系统:Centos7 官方教程文档 1.Docker的安装与卸 ...

  9. 火山引擎ByteHouse:如何优化ClickHouse物化视图能力?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近期,火山引擎 ByteHouse 升级了基于 ClickHouse 的物化视图能力,为解决数据量爆炸式增长带来的 ...

  10. 2018CCPC桂林 A(贪心,思维)

    题目 分析:首先发现将大的数放在小的数前面结果更优,于是想到通过比较元素大小的方式将两个数组合并,大的放前面小的放后面,但很容易就能想到比这样合并更优的方案.一开始我是想先按这种方式进行合并,然后将最 ...