当GaussDB遇上了毕昇编译器
摘要:当应用软件及硬件确定后,编译器对应用的自动优化将成为应用性能的关键。
从应用优化说起
一个应用的优化通常有架构级优化、模块级优化和函数级优化,高性能作为云数据库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遇上了毕昇编译器的更多相关文章
- 当property遇上category
[当property遇上category] @property可以在类定义中,以及extension定义中使用,编译器会自动为@property生成代码,并在变量列表(ivar_list_t)中添加相 ...
- 当Java代码遇上抽象、重载加重写,一切都不美好了
当Java代码遇上抽象.重载加重写.一切都不美好了 前几天调程序遇上个奇怪的bug.一直没找到问题,今天最终发现问题所在了,不说了先上代码(下面代码是演示样例代码,经測试,Java不存在这问题,安卓存 ...
- MVC遇上bootstrap后的ajax表单模型验证
MVC遇上bootstrap后的ajax表单验证 使用bootstrap后他由他自带的样式has-error,想要使用它就会比较麻烦,往常使用jqueyr.validate的话只有使用他自己的样式了, ...
- 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)
邀请函: 尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实 ...
- 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)
我们将在广州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战技巧. 时间:2 ...
- 敏捷遇上UML——软创基地马年大会(深圳站 2014-3-15)
邀请函: 尊敬的阁下: 我们将在深圳为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战 ...
- 初识genymotion安装遇上的VirtualBox问题
想必做过Android开发的都讨厌那慢如蜗牛的 eclipse原生Android模拟器吧! 光是启动这个模拟器都得花上两三分钟,慢慢的用起来手机来调试,但那毕竟不是长久之计,也确实不方便,后来知道了g ...
- SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败解决方案
SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败的问题,可作如下尝试: 更新失败后,在windows的[事件查看器→应用程序]中找到来源为MsiInstaller,事件ID为1 ...
- 当创业遇上O2O,新一批死亡名单,看完震惊了!
当创业遇上O2O,故事就开始了,总投入1.6亿.半年开7家便利店.会员猛增至10万……2015半年过去后,很多故事在后面变成了一场创业“事故”,是模式错误还是烧钱过度?这些项目的失败能给国内创业者带来 ...
- LoadRunner - 当DiscuzNT遇上了Loadrunner(下) (转发)
当DiscuzNT遇上了Loadrunner(下) 在之前的两篇文章中,基本上介绍了如何录制脚本和生成并发用户,同时还对测试报告中的几个图表做了简单的说明.今天这篇文章做为这个系列的最后一篇,将会介绍 ...
随机推荐
- [第五空间 2021]yet_another_mysql_injection
随便输入进去,发现只有账号是admin可以进入 使用弱密码admin admin,报错为hacker 就没啥办法了,想着F12看一下源码 发现有一个source,打开看看 可以发现username是固 ...
- 低代码平台探讨-MetaStore元数据缓存
背景及需求 之前提到我们模型驱动的实现选择的是解释型,需要模型的元数据信息,在接到请求后动态处理逻辑. 此外,应用的通用能力中还包括:页面dsl查询,菜单查询等. 而且后期加入触发器,用户自定义api ...
- 17.1 隐藏执行CMD命令
本章内容涉及使用Socket API和CMD命令行工具实现本地CMD命令执行.无管道正向CMD和无管道反向CMD三种功能.执行本地CMD实现使用CreateProcess函数创建一个新的CMD进程,并 ...
- Telegram 正式引入国产小程序技术
Telegram 宣布为其开发者提供了一项"能够在 App 中运行迷你应用"的新功能( 迷你应用即 Mini App,下文中以"小程序"代替). 在一篇博客文章 ...
- vscode/sublime 语法高亮定义和代码段的区别
vscode插件数据格式基于json,sublime插件数据格式基于xml.sublime插件的官方文档说的不清楚,相关教程也很难找,遇到的一些坑记录一下 语法定义文件对比 同样使用TextMate定 ...
- [Python急救站课程]猴子吃桃问题
问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个:第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后,每天早上都吃了前一天剩下的一半多一个.到了第五天早上想再吃时,见只剩下一个桃 ...
- 打造我的 Windows 开发环境
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- Android 线性布局和相对布局
LinearLayout 线性布局 orientation 排列方式:vertical 竖直 horizontal 水平(默认值) layout_weight 权重:将子视图以对应的权重分配其空间大小 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-33-处理https 安全问题或者非信任站点-上篇
1.简介 这一篇宏哥主要介绍playwright如何在IE.Chrome和Firefox三个浏览器上处理不信任证书的情况,我们知道,有些网站打开是弹窗,SSL证书不可信任,但是你可以点击高级选项,继续 ...
- #ifndef、#define、#ifdef等命令在C#中的应用
1.#ifndef指令的理解 #ifndef是一个预处理指令,用于判断一个表示符是否被定义.如果该标识符未被定义,则执行条件编译中的代码块.否则,将跳过该代码块.下面是一个简单的粒子. 1 #ifnd ...