1、/config_targ.h为ls_Target_xxx添加宏,xxx代表目标机支持的处理器。比如:对于MIPS有ls_Target_R10K()。为目标机添加ABI宏。设置GP大小。设置目标机的调试信息。在common/util中,从ia64中将c_qwmultu.c拷贝过来。2.编连libsmplslibibertylibcomutil如果在编连过程中需要现实命令行,可以修改linux/make/目录下的gcommondefs和gcommonrules。E.在common/targ_info中,创建目录机器相关文件。按照如下顺序:isa/isa.cxx/isa_properties.cxx
2、/isa_subset.cxx/isa_registers.cxx/isa_enums.cxx/isa_lits.cxx/isa_operands.cxx/isa_hazards.cxx/isa_print.cxx/isa_pack.cxx/isa_bundle.cxx/isa_decode.cxx/isa_pseudo.cxxabi/abi_properties.cxxproc/proc.cxx/proc_properties.cxx/_si.cxx该目录包含了重定向的大部分基本设置。大多数重定向出错都是由于这个目录中的错误设置,因而所有文件都要仔细编写。3.编连targ_infoF.处理目
3、录kgccfe和kg+fe中的前端在kgccfe/gnu,kgccfe/gnu/config,kg+fe/gnu,kg+fe/gnu/config中,创建目录,内容从ia64或x8664中拷贝,修正一些参数和文件名字即可。修正gnu_config.h,使其包含对应于目标机的config.h文件。修正/config.h,/hconfig.h, /tconfig.h, /tm_p.h使其包含的文件对应于目标机。确保Makefile和Makefile.gbase也能找到gnu/目录。在include/elf.h目录中,将#define Elf32_Byte和Elf64_Byte使能。若在前端添加了一
4、些新的语意,则需一起更新lexer,parser和声明。如其一不相匹配,则前端会出现意想不到的问题。G.创建common/com/config_platform.hcommon/com/config_asm.h/config_cache_targ.cxx/config_elf_targ.cxx/config_host.c/config_platform.c/config_targ.cxx/config_targ_opt.cxx/config_targ_opt.h/targ_const.cxx/targ_const_private.h/targ_ctrl.h/targ_em_const.cxx/
5、targ_em_dwarf.cxx/targ_em_dwarf.h/targ_em_elf.cxx/targ_em_elf.h/targ_sim.cxx/targ_sim.h所有这些文件均可从相似目标机的目录里拷贝,然后按规则更新。在config_host.c, config_ targ.cxx 和common/com/config.cxx中,确保字节顺序设置正确。在config_asm.c中,确保正确设置了.s文件输出的汇编语法。在targ_sim.h中确保调用约定和参数传递设置正确。config_cache_targ.cxx设置cache模型。Targ_em_*文件控制汇编输出,分区类型,
6、重定位等,只有到了后端的重定向时才需要修改这些文件。基本上需要修改此目录下的每一个文件。4.编连gccfe5.编连g+fe6.编连ir_toolsH.创建be/be/和be/com/目录在目录be/be/下创建driver_targ.cxx和fill_align_targ.cxx在目录be/com/下创建betarget.cxx这里你可以使问题简略化,先使之能运行,最后再进行优化。例如,可以先设置Can_Do_Fast_Multiply为FALSE,之后再来处理这个问题。7.编连be8.编连libelflibelfutillibwarflibunwindPI.创建be/cg/register_
7、targ.hbe/cg/tn_targ.h/op_targ.h在lib/elf.h中为自己的芯片创建特定的部分(或者适合的elf.h),定义合理的重定位,分区等。9.编连woptJ.在be/cg中创建文件。修正cgtarget_arch.h,比如CGTARG_Copy_Op, .可能需要想be/cg/op.h中添加信息。修正cgdwarf_targ.cxx, Find_Spill_TN, .,在dwarf中解开表。10.编连cg11.编连driver.12.编连ipl13.编连lno14.编连inline15.编连whirl2c16.编连ipa 2.2 注释在下列注释中,14由Fred Cho
8、w和Sun Chan给出,58由我添加。1. 仔细浏览be/cg目录中的expand.cxx, whirl2ops.cxx。2. be/cg/目录中的xp_branch.cxx, exp_divrem.cxx, exp_loadstore.cxx, expand.cxx, entry_exit_targ.cxx 需要做大量的修改或调整。3. 若想为某些目录添加更多的编译选项,则修改该目录下的Makefile.gbase。细心的修改,勿因此而破坏其他目标机的规则。4. 若要添加intrinsic,则需注意如下文件common/comintrinsic.def-定义了INTRINSIC_ID, 这
9、是intrinsic的性质(顺序很重要,由INTRINSIC_ID编序)kgccfe/gnu中的前端定义文件。Builtins.def id, name, prototype, attributeBuiltin-types.def 需要新类型时要更改此文件Wfe_expr.cxx 将 GNU builtin翻译成WHIRL.5. 最初要将所有文件修改正确是很不容易的,别担心,可以通过运行,跟踪,调试编译器来修正这写bugs。当你熟悉此过程后,就可以对这写文件作大的修改。6. 虽然不正确的修改某些文件不会导致编译器出错,但会降低输出代码的质量。例如,若CGTARG_Compute_Branch_
10、Parameters(be/cg/cgtarget.cxx)中的分支开支设置不正确,则会导致代码中的if-语句块的层次结构不合预期。所以,当编译器生成的代码质量太差时,记得检查机器参数。7. 若你将cygnus当作ld来生成ipa-link,则需在顶层创建targcygnus_ia32_并在其中创建BUILD_gas, CLOBBER, CONFIGURE文件。再在顶层Makefile中将将ld的make目录指向targcygnus_ia32_8. 若需要打开/关闭某些系统结构特征,可以先在be/cg/cg_flags.cxx中搜索标记。例如,可以开启Enable_Fill_Delay_Slo
11、ts来使能延时槽。2.3 重定向结果2.3.1 机器参数处理器:龙芯2f,订单ISA:MIPS3主频:666MHz版次:4ALU:2FALU:MEM 单元:12.3.2 稳定性在O3选项下,该编译器已经通过斯坦福基准(Stanford benchmark)和Stepanov编写的抽象延迟基准(Abstraction penalty benchmark)。这表明适用于MIPS的编译器的大体框架已经成型,C和C+前段能正常工作,大部分优化也能实现。2.3.3 性能及分析性能应该由SPEC和其他基准来标定,但我还没有进行过此类测试。因此贴出斯坦福基准和抽象延迟基准的结果。斯坦福基准(-O2)测试案例
12、 大小 时间bubble 10000 1.27qsort 1000000 0.71queen 12 0.26matmul 400 1.50perm 10 1.54sieve 1000000 0.76抽象延迟基准(大小:2000, 迭代次数:250000)选项(-O2) 测试序号绝对时间(秒)每秒加法次数(M)对测试0的比例5.2894.701.005.8485.621.1135.4292.251.037.1669.831.3655.3992.761.0267.5566.231.4375.8785.1888.2160.91.5595.8984.891.12108.1861.12116.4577.
13、521.22129.2953.821.76平均值6.4877.121.23总时间:85.81s抽象延迟:*选项:(-O2 -PHASE:P)7.6065.791.447.8863.451.498.0462.191.525.2994.528.4659.101.606.1781.051.1781.83s(-O3)68.82s抽象延时基准的性能分析:众所周知,本台机器的峰值性能应为其主频,即666M每秒,但事实与峰值差距巨大。我总结原因于此,所有这些问题都是我将来的工作方向。1.正确设置指令调度中的指令延迟.LBB21_Z5test0PdS_:addiu $2,$2,32ldc1 $f3,-32($
14、2)ldc1 $f2,-24($2)ldc1 $f1,-16($2)add.d $f3,$f3,$f0ldc1 $f0,-8($2)add.d $f2,$f2,$f3add.d $f1,$f1,$f2bne $2,$16,.LBB21_Z5test0PdS_add.d $f0,$f0,$f1这是内核的汇编代码,展开4次。FALU延迟为6个机器周期。因而展开银子太小了。2.运用底部装载(Bottom loading)来隐藏装载延时。2.3.4 已知问题在“抽象延时基准的性能分析”部分,除上所述之外还有一些其他问题。1. 编译器目前仅支持MIPS4 ISA,要同时支持其他ISA则需更新CG。2.
15、在生成的.s文件中,展开信息有些问题,需要后续处理。3. 共享对象的编译还未经测试。3.关于从零开始重定向的讨论 我很幸运可以以SL的编译器作为重定向的基础。但是如果你在当今的OPEN64版本中找不到一个类似的平台,那么需要特别关注那些问题呢?本节我将对此进行简要讨论。 回顾Fred Chow建议的重定向步骤,我将讨论若从零开始,哪些步骤将更复杂。很显然我们不需要管编连步骤,因而只需关注文件创建步骤。1. 步骤A,B,C没有任何不同。2. 步骤D:config_targ.h不是问题。即使可以找到类似处理器仍然要进行这一步。因而相较于第二节,这一步需要做更多工作。3. 步骤E:该组文件需要更多工
16、作。4. 步骤F:该不处理前段,因而不会带来麻烦。只需按照2.1节的指示做就可以成功。5. 步骤G:6. 步骤H:driver_targ.cxx和fill_align_targ.cxx并不复杂,你可以根据现成的文件轻松的创建它们。阅读这些文件以便修改。Betarget.cxx为针对目标的功能定义了一些例程。但是按2.1节中提到的,你不必简略它,因为很容易就可以使他工作。Sections.cxx定义生成文件的组织格式。如果输出ELF文件,则不需要对现成的文件作太多修改。但如果要生成其他格式的文件,则需注意此文件。7. 步骤I:创建这写文件是一件琐碎的工作。8. 步骤J: 现在还有三组文件需要进一
17、步讨论,他们使用在步骤E,G和J中。大部分只需从现成的目标机目录中拷贝,浏览一边并根据你的处理器做少许修改。这并不难但是得花时间,例如,你需要在isa_operands.cxx中描述每条指令的操作树。但有几个文件需要从头写起。比如所有的exp_*.cxx,因为exp_*.cxx文件将WHIRLS翻译为指令,所以要全部重写。 简要总结一下,所有需要修改的文件都在2.1和2.2节中有提及。如果OPEN64版本中存在类似目标机器,你就可以剪切这些文件。反之,若要从零开始,则需以其他目标机器的文件当作模版,一行一行的编写某些文件。4.与GCC重定向的比较 GCC是另一个流行的可重定向的编译器架构。因此
18、,本节我们从适应性和性能两个方面比较重定向的OPEN64和GCC。4.1适应性比较 与OPEN64类似,重定向GCC的大部分工作也是处理ISA,ABI,处理器和但吗生成。开发人员需要编连机器描述,包括md文件,C文件和一系列头文件。GCC的机器描述包含如下信息:1.处理器系统结构功能行为,指令的可选资源使用,字节顺序和内存寻址能力等2.ABI寄存器使用,函数调用公约等3.源语言数据类型的层次int,float和char的大小等4.二进制文件的格式对象和可执行文件的格式,调试信息的格式。5.编译环境-汇编器,连接器和库的公约,系统头文件和库的位置等。 考虑这些问题时,应考虑到ISA和代码生成在m
19、d文件中,ABI和处理器信息在头文件中,机器相关的子程序在C文件中。回到OPEN64,我们可以发现其与GCC的不同。在OPEN64中,ISA定义在一组文件中,每个文件描述一部分ISA,而GCC刚好相反,它将几个问题集中到一个大文件中,比如.md文件。 从讨论中看出,GCC和OPEN64的重定向要求开发者熟悉编译器。同时我不认为二者在重定向的适应性上有较大差别。4.2性能比较 虽然机器相关优化和性能调整对于编译器重定向是必要的,我们仍然希望在重定向步骤后得到更高的性能。作为后续优化和调整的基础性能,是越高越好。我将比较仅仅进行重定向后得到的性能,仍然以抽象延时基准作为焦点。*-O3,GCC版本:
20、4.1.27.5466.3198.01s回顾OPEN64的性能,97.4M次加法每秒,OPEN64可以为后续的机器相关的优化提供更好的性能基准。5.结论 在本报告中,我展示了将OPEN64重定向至MIPS平台的经验。获得的稳定性和性能都经过了讨论。我还讨论了从零开始重定向OPEN64的复杂性。对比GCC,重定向OPEN64可以提供更高的性能基准而不会增加复杂度。致谢 非常感谢Sun Chan在实验期间给与我的指导以及珍贵的意见和鼓励。感谢Guang R. Gao教授给予我这次机会。感谢Fred Chow的文章“pro64重定向的建议步骤”。感谢Feng Xiaobing教授的支持与建议。感谢Huo Wei分享他的重定向GCC的经验。还要感谢ICT和Simplight Nanoelectronics成员们的帮助和讨论。参考文献【1】OPEN64主页 【2】W. J. Price. A benchmark tutorial. IEEE Micro, 9(5):28-43, Oct. 1988【3】Alex Stepanov. Abstraction Penalty Benchmark, version 1.2 (KAI). Silicon
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1