Open64重定向技术报告RetargetOpen64technicalreport中文翻译Word格式文档下载.docx

上传人:b****6 文档编号:18908086 上传时间:2023-01-02 格式:DOCX 页数:13 大小:23.42KB
下载 相关 举报
Open64重定向技术报告RetargetOpen64technicalreport中文翻译Word格式文档下载.docx_第1页
第1页 / 共13页
Open64重定向技术报告RetargetOpen64technicalreport中文翻译Word格式文档下载.docx_第2页
第2页 / 共13页
Open64重定向技术报告RetargetOpen64technicalreport中文翻译Word格式文档下载.docx_第3页
第3页 / 共13页
Open64重定向技术报告RetargetOpen64technicalreport中文翻译Word格式文档下载.docx_第4页
第4页 / 共13页
Open64重定向技术报告RetargetOpen64technicalreport中文翻译Word格式文档下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Open64重定向技术报告RetargetOpen64technicalreport中文翻译Word格式文档下载.docx

《Open64重定向技术报告RetargetOpen64technicalreport中文翻译Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Open64重定向技术报告RetargetOpen64technicalreport中文翻译Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。

Open64重定向技术报告RetargetOpen64technicalreport中文翻译Word格式文档下载.docx

/config_targ.h

为ls_Target_xxx添加宏,xxx代表目标机支持的处理器。

比如:

对于MIPS有ls_Target_R10K()。

为目标机添加ABI宏。

设置GP大小。

设置目标机的调试信息。

在common/util中,从ia64中将<

c_qwmultu.c拷贝过来。

2.编连libsmpls

libiberty

libcomutil

如果在编连过程中需要现实命令行,可以修改linux/make/目录下的gcommondefs和gcommonrules。

E.在common/targ_info中,创建<

目录机器相关文件。

按照如下顺序:

isa/<

/isa.cxx

/isa_properties.cxx

/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.cxx

abi/<

/abi_properties.cxx

proc/<

/proc.cxx

/proc_properties.cxx

/<

_si.cxx

该目录包含了重定向的大部分基本设置。

大多数重定向出错都是由于这个目录中的错误设置,因而所有文件都要仔细编写。

3.编连targ_info

F.处理目录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目录中,将#defineElf32_Byte和Elf64_Byte使能。

若在前端添加了一些新的语意,则需一起更新lexer,parser和声明。

如其一不相匹配,则前端会出现意想不到的问题。

G.创建common/com/<

/config_platform.h

common/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

/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_*文件控制汇编输出,分区类型,重定位等,只有到了后端的重定向时才需要修改这些文件。

基本上需要修改此目录下的每一个文件。

4.编连gccfe

5.编连g++fe

6.编连ir_tools

H.创建be/be/<

和be/com/<

目录

在目录be/be/<

下创建driver_targ.cxx

和fill_align_targ.cxx

在目录be/com/<

下创建betarget.cxx

这里你可以使问题简略化,先使之能运行,最后再进行优化。

例如,可以先设置Can_Do_Fast_Multiply

为FALSE,之后再来处理这个问题。

7.编连be

8.编连libelf

libelfutil

libwarf

libunwindP

I.创建be/cg/<

/register_targ.h

be/cg/<

/tn_targ.h

/op_targ.h

在lib/elf.h中为自己的芯片创建特定的部分(或者适合的elf.h),定义合理的重定位,分区等。

9.编连wopt

J.在be/cg<

中创建文件。

修正cgtarget_arch.h,比如CGTARG_Copy_Op,...

可能需要想be/cg/op.h

中添加信息。

修正cgdwarf_targ.cxx,Find_Spill_TN,...,

在dwarf中解开表。

10.编连cg

11.编连driver.

12.编连ipl

13.编连lno

14.编连inline

15.编连whirl2c

16.编连ipa

2.2注释

在下列注释中,1~4由FredChow和SunChan给出,5~8由我添加。

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/com

intrinsic.def

-定义了INTRINSIC_ID,这是intrinsic的性质(顺序很重要,由INTRINSIC_ID

编序)

kgccfe/gnu中的前端定义文件。

Builtins.def–id,name,prototype,attribute

Builtin-types.def–需要新类型时要更改此文件

Wfe_expr.cxx–将GNUbuiltin翻译成WHIRL.

5.最初要将所有文件修改正确是很不容易的,别担心,可以通过运行,跟踪,调试编译器来修正这写bugs。

当你熟悉此过程后,就可以对这写文件作大的修改。

6.虽然不正确的修改某些文件不会导致编译器出错,但会降低输出代码的质量。

例如,若

CGTARG_Compute_Branch_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_Slots来使能延时槽。

2.3重定向结果

2.3.1机器参数

处理器:

龙芯2f,订单

ISA:

MIPS3

主频:

666MHz

版次:

4

ALU:

2

FALU:

MEM单元:

1

2.3.2稳定性

在O3选项下,该编译器已经通过斯坦福基准(Stanfordbenchmark)和Stepanov编写的抽象延迟基准(Abstractionpenaltybenchmark)。

这表明适用于MIPS的编译器的大体框架已经成型,C和C++前段能正常工作,大部分优化也能实现。

2.3.3性能及分析

性能应该由SPEC和其他基准来标定,但我还没有进行过此类测试。

因此贴出斯坦福基准和抽象延迟基准的结果。

斯坦福基准(-O2)

测试案例大小时间

bubble100001.27

qsort10000000.71

queen120.26

matmul4001.50

perm101.54

sieve10000000.76

抽象延迟基准(大小:

2000,迭代次数:

250000)

选项(-O2)

测试序号

绝对时间(秒)

每秒加法次数(M)

对测试0的比例

5.28

94.70

1.00

5.84

85.62

1.11

3

5.42

92.25

1.03

7.16

69.83

1.36

5

5.39

92.76

1.02

6

7.55

66.23

1.43

7

5.87

85.18

8

8.21

60.9

1.55

9

5.89

84.89

1.12

10

8.18

61.12

11

6.45

77.52

1.22

12

9.29

53.82

1.76

平均值

6.48

77.12

1.23

总时间:

85.81s

抽象延迟:

***************************************************************************

选项:

(-O2-PHASE:

P)

7.60

65.79

1.44

7.88

63.45

1.49

8.04

62.19

1.52

5.29

94.52

8.46

59.10

1.60

6.17

81.05

1.17

81.83s

(-O3)

68.82s

抽象延时基准的性能分析:

众所周知,本台机器的峰值性能应为其主频,即666M每秒,但事实与峰值差距巨大。

我总结原因于此,所有这些问题都是我将来的工作方向。

1.正确设置指令调度中的指令延迟

.LBB21__Z5test0PdS_:

addiu$2,$2,32

ldc1$f3,-32($2)

ldc1$f2,-24($2)

ldc1$f1,-16($2)

add.d$f3,$f3,$f0

ldc1$f0,-8($2)

add.d$f2,$f2,$f3

add.d$f1,$f1,$f2

bne$2,$16,.LBB21__Z5test0PdS_

add.d$f0,$f0,$f1

这是内核的汇编代码,展开4次。

FALU延迟为6个机器周期。

因而展开银子太小了。

2.运用底部装载(Bottomloading)来隐藏装载延时。

2.3.4已知问题

在“抽象延时基准的性能分析”部分,除上所述之外还有一些其他问题。

1.编译器目前仅支持MIPS4ISA,要同时支持其他ISA则需更新CG。

2.在生成的.s文件中,展开信息有些问题,需要后续处理。

3.共享对象的编译还未经测试。

3.关于从零开始重定向的讨论

我很幸运可以以SL的编译器作为重定向的基础。

但是如果你在当今的OPEN64版本中找不到一个类似的平台,那么需要特别关注那些问题呢?

本节我将对此进行简要讨论。

回顾FredChow建议的重定向步骤,我将讨论若从零开始,哪些步骤将更复杂。

很显然我们不需要管编连步骤,因而只需关注文件创建步骤。

1.步骤A,B,C没有任何不同。

2.步骤D:

config_targ.h不是问题。

即使可以找到类似处理器仍然要进行这一步。

因而相较于第二节,这一步需要做更多工作。

3.步骤E:

该组文件需要更多工作。

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:

现在还有三组文件需要进一步讨论,他们使用在步骤E,G和J中。

大部分只需从现成的目标机目录中拷贝,浏览一边并根据你的处理器做少许修改。

这并不难但是得花时间,例如,你需要在isa_operands.cxx中描述每条指令的操作树。

但有几个文件需要从头写起。

比如所有的exp_*.cxx,因为exp_*.cxx文件将WHIRLS翻译为指令,所以要全部重写。

简要总结一下,所有需要修改的文件都在2.1和2.2节中有提及。

如果OPEN64版本中存在类似目标机器,你就可以剪切这些文件。

反之,若要从零开始,则需以其他目标机器的文件当作模版,一行一行的编写某些文件。

4.与GCC重定向的比较

GCC是另一个流行的可重定向的编译器架构。

因此,本节我们从适应性和性能两个方面比较重定向的OPEN64和GCC。

4.1适应性比较

与OPEN64类似,重定向GCC的大部分工作也是处理ISA,ABI,处理器和但吗生成。

开发人员需要编连机器描述,包括md文件,C文件和一系列头文件。

GCC的机器描述包含如下信息:

1.处理器系统结构—功能行为,指令的可选资源使用,字节顺序和内存寻址能力等

2.ABI—寄存器使用,函数调用公约等

3.源语言数据类型的层次—int,float和char的大小等

4.二进制文件的格式—对象和可执行文件的格式,调试信息的格式。

5.编译环境--汇编器,连接器和库的公约,系统头文件和库的位置等。

考虑这些问题时,应考虑到ISA和代码生成在md文件中,ABI和处理器信息在头文件中,机器相关的子程序在C文件中。

回到OPEN64,我们可以发现其与GCC的不同。

在OPEN64中,ISA定义在一组文件中,每个文件描述一部分ISA,而GCC刚好相反,它将几个问题集中到一个大文件中,比如.md文件。

从讨论中看出,GCC和OPEN64的重定向要求开发者熟悉编译器。

同时我不认为二者在重定向的适应性上有较大差别。

4.2性能比较

虽然机器相关优化和性能调整对于编译器重定向是必要的,我们仍然希望在重定向步骤后得到更高的性能。

作为后续优化和调整的基础性能,是越高越好。

我将比较仅仅进行重定向后得到的性能,仍然以抽象延时基准作为焦点。

*******************************************************************************

-O3,GCC版本:

4.1.2

7.54

66.31

98.01s

回顾OPEN64的性能,97.4M次加法每秒,OPEN64可以为后续的机器相关的优化提供更好的性能基准。

5.结论

在本报告中,我展示了将OPEN64重定向至MIPS平台的经验。

获得的稳定性和性能都经过了讨论。

我还讨论了从零开始重定向OPEN64的复杂性。

对比GCC,重定向OPEN64可以提供更高的性能基准而不会增加复杂度。

致谢

非常感谢SunChan在实验期间给与我的指导以及珍贵的意见和鼓励。

感谢GuangR.Gao教授给予我这次机会。

感谢FredChow的文章““pro64重定向的建议步骤”。

感谢FengXiaobing教授的支持与建议。

感谢HuoWei分享他的重定向GCC的经验。

还要感谢ICT和SimplightNanoelectronics成员们的帮助和讨论。

参考文献

【1】OPEN64主页

【2】W.J.Price.Abenchmarktutorial.IEEEMicro,9(5):

28--43,Oct.1988

【3】AlexStepanov.AbstractionPenaltyBenchmark,version1.2(KAI).Silicon

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1