基于龙芯3A的编译器及操作系统深度优化

2017-06-01 08:48何信华连彦泽王新
中国高新技术企业 2017年9期
关键词:编译器操作系统

何信华 连彦泽 王新

摘要:为了深度发挥龙芯3A1500的性能,文章提出了一种基于龙芯3A的编译器及操作系统深度优化方法,使用loongson3a指令集(mips64r2是loongson3a指令集的子集)重新编译了Fedora21(即Loongnix1.0)操作系统。经过试验验证,优化后的操作系统性能大幅度提升,部分函数性能提升6倍以上。

关键词:龙芯处理器;编译器;操作系统;深度优化;基础指令集 文献标识码:A

中图分类号:TP302 文章编号:1009-2374(2017)08-0044-02 DOI:10.13535/j.cnki.11-4406/n.2017.08.021

1 概述

重新编译srpm包共14781个,编译后生成39369个rpm包,该系统原生支持64位,同时兼容32位应用程序,包括O32和N32,集成了office、浏览器、编译工具、调试工具、QT图形工具、媒体播放、云计算、数据库等各类应用,是迄今为止龙芯处理器上最完整的操作系统,提供海量软件仓库。

2 编译器优化

GCC编译器添加了一系列针对龙芯GS464处理器核(简称464核)的定制和优化,主要工作如下:

2.1 GS464、GS464E处理器核基础支持

将464核的基础指令集从mips64升级到mips64r2。升级后,编译器代码生成时以mips64r2的标准进行,与mips64相比,指令集中将增加如下指令:(d)ror、(d)seb、(d)seh、(d)ext、(d)mthc1、(d)mfhc1。

根据464核官方文档中描述的指令延迟特征,建立了后端流水线描述;添加龙芯三操作数乘法、除法、取模以及load到0号寄存器的预取指令模板支持;针对龙芯464处理器核在O32 ABI下(即FR=0),浮点寄存器应按照mips3模式使用的特征,对奇数号浮点寄存器的使用规则进行了定制;添加-march=loongson3a选项,该选项虽然名字叫做3a,但实际上可以控制3A/3B/2H/2J处理器的优化。在GCC代码中,可以通过TARGET_LOONGSON_3A宏来实现对464核的定制优化。

2.2 函数序跋的128位访存优化

本优化在GCC的pro_and_epilogue遍实施,该遍生成函数的序和跋的RTL指令序列,该遍通过gen_prologue()(由模板define_expand prologue生成)调用到mips后端的对应函数,分别为mips_expand_prologue()和mips_expand_epilogue()。在这两个函数中,分别有对应于寄存器保存(序)和寄存器恢复(跋)的代码生成函数,通过函数mips_for_each_saved_reg来对每一个需要保存和恢复的寄存器生成对应的store和load的RTL指令。

为了实现该优化,为mips_for_each_saved_reg增加一个参数,用于区分保存/恢复。当同时满足条件时,进行特殊的代码生成过程,否则依然按照原来的方式生成寄存器保存和恢复序列。

实现该优化后,可以提高代码密度,减小代码尺寸,并且减少访存指令数量,从而减小访存队列和访存部件压力。但是由于龙芯3A处理器和3B处理器对128位访存指令的实现细节不同,对3A处理器而言,128位访存指令是在浮点访存功能部件中实现的,使用时需要内核将浮点协处理器置为可用状态,而内核出于效率考虑,一般不使用浮点指令。因此3A处理器不宜在系统态使用128位访存,而3B处理器在用户态和系统态下均可使用。该优化spec2000平均提升5~6%,有单个测试用例提升10%。

2.3 64位数组指针乘法优化

464核由于不对hi/lo寄存器重命名,因此在执行m指令时,后续指令都要暂停取指重命名以等待其结果。在gcc的-mips3指令集选项下,乘法指令是双操作数的(mult和multu),结果隐式写入hi/lo寄存器,当使用-mips64指令集选项后,编译器能够产生三操作数的乘法指令,但仅局限于将两个源通用寄存器内的32位的有符号数相乘得到一个64位结果存入目标通用寄存器。

龙芯扩展指令集提供了将两个64位整数相乘的低64位结果存入结果寄存器的指令gsdmult和gsudmult,且龙芯还具有在执行32位定点alu操作和访存操作时,将通用寄存器的高32位进行隐式的符号扩展的特点。

该优化可以在减小代码密度的同时,提升运算速度,运算速度的提升来自于三个方面:首先,指令变少;其次,会堵流水线的hi/lo移动指令被消除;最后,链式alu操作减少,降低了464核上alu到alu的forwarding具有一拍延迟的影响。

该优化可以用于所有具有464核处理器的系统态和用户态上,无任何副作用。

2.4 将464核流水线描述实验性的改为跟5kc一致

在对coremark程序的指令调度调优中,发现将流水线描述改成跟5kc一致后,性能有2%~3%提升,但对SPEC2000进行测试,却发现26个程序有升有降。

主要修改的是mips.md和loongson.md文件。需要注意的细节是mips.h文件中的枚举enum processor_type以及mips.c文件中的static const struct mips_rtx_cost_data mips_rtx_cost_data[PROCESSOR_MAX]数组,以及mips.md文件中的(define_attr “cpu”…)语句中,关于不同处理器名称的出现顺序应该一致,否则将出现rtx insn的cost和流水线描述不能与实际的-march选项所选择的处理器相匹配的问题。而mips.c文件中的mips_cpu_info_table却无需跟另外三者顺序完全对應,该表的查找是采用字符串hash进行的。

优化5的两个patch,除了将在-march=loongson3a选项下的指令调度全部都变成以5kC的方式进行调度,并对与464核的指令集有了更多的描述。

2.5 指令实现数学库中round、lround、trunc、cabs、floor和ceil函数

glibc中的数学函数round、lround、trunc和cabs,这些函数使用c语言实现,通过编译器生成的二进制目标码执行效率低。由于round、lround、trunc、cabs等指令与glibc中对应函数舍入方式不同,无法直接替换为对应指令。通过gcc中的__builtin_round、__builtin_lround、__builtin_trunc等接口,实现glibc中对应函数的功能。性能提升明显,其中spec2000中189.lucas程序提升20%。

glibc中的数学函数floor和ceil,这些函数使用c语言实现,通过编译器生成的目标码执行效率低。由于floor、ceil等指令与glibc中对应函数舍入方式不同,无法直接替换为对应指令。通过gcc中的__builtin_floor、__builtin_ceil接口,实现glibc中对应函数的功能。性能提升明显,其中spec2000中177.mesa程序提升15%。

3 数学库优化

Fedora21基于GNU的glibc-2.20版本优化了数学库及一些string类函数,glibc的数学库计算精度满足IEEE754标准。操作系统的核心库glibc(数学库是其核心的一部分)使用上述优化的GCC版本编译,充分发挥loongson3a指令集优势,流式DMA运算特性支持,能够数倍甚至数量级倍提升三角函数、矩阵运算、FFT等的性能表现。

龙芯处理器提供了abs、sqrt等专用指令,编译器不会直接生成这些指令,从而采用效率很低的C代码,通过手写汇编指令的方法直接使用这些专用指令。分别执行百万次abs和sqrt函数,使用abs指令的性能与C函数相比,性能提高32%,使用sqrt指令的性能与C函数相比,性能提高6倍。

编译器提供了大量的编译选项,不同的编译选项影响生成的目标代码质量,最终影响程序的运行时间,采用编译选项搜索优化,找到适合龙芯处理器和ZY计算的最优编译选项。例如,统计6种三角函数的200万次计算时间,-O3情况下计算时间为12.3秒,-O2情况下计算时间为16.4秒,-O3与-O2相比,计算时间减少了25%。

4 QT优化

目前为止已经完成了初步优化,优化的主要工作如下:(1)QT4.7.4和QT4.8.6的向量指令优化;(2)QT4.8.6中独立绘制过程的部分算法级优化;(3)QT4.8.6中OPENGL后端繪制过程的椭圆绘制的优化;(4)QT4.7.4和QT4.8.6中内存填充过程的优化等。

5 试验结果

multi_calc包括sin、cos、asin、acos等32个函数,是将测试2中的函数放在一起循环百万次计算,也分为dbl-64精度和flt-32精度。可以看出与单个函数测试均值的能提升基本一致,flt-32精度下fedora21优化较fedora13提升较大。

6 结语

基于龙芯3A对编译器及操作系统进行了深度优化,采用算法和内嵌汇编指令的方法优化热点函数,提高操作系统的整体性能。通过内嵌汇编指令,一方面可以直接使用龙芯专用指令;另一方面可以减少指令数量,提高指令的执行效率,从而减少程序的运行时间。通过裁剪保留操作系统最基本的核心功能,从而保证操作系统的最小CPU和内存消耗,满足不同应用场景的需要。

参考文献

[1] 胡奇明.VxWorks操作系统的重新编译和优化研究与

实现[D].国防科学技术大学,2008.

(责任编辑:蒋建华)

猜你喜欢
编译器操作系统
基于相异编译器的安全计算机平台交叉编译环境设计
运行速度大突破华为《方舟编译器》详解
Microchip为MPLAB XC系列专业版编译器推出低成本可续订包月许可证
通用NC代码编译器的设计与实现
编译器无关性编码在微控制器中的优势
基于ARM嵌入式平台的x86译码SOC架构设计