基于VLIWDSP的可重定向编译器设计与实现

点赞:26511 浏览:120038 近期更新时间:2024-04-12 作者:网友分享原创网站原创

摘 要 :本文给出了一种基于VLIW DSP的快速移植编译器的方法,详细讨论了Trimaran架构中的关键技术: Elcor、模拟器以及写作目标机指令和操作码,成功移植了基于BWDSP100芯片单簇体系结构的编译器,很大程度上缩短了开发周期.

关键字:可重定向,编译器,Trimaran

文献标识码:A中图分类号:TP314

Design of a Retargetable Compiler based on VLIW DSP

YU Feng-lin1,DAI Fu-quan2,ZAI yan3

(1.CETC No.38 Research Institute, Hefei, 230031, China

2. Dept of puter, University of Science and Technology of China, Hefei, 230027

3. China Mobile Group Design Institute , Anhui, 230031)

Abstract: In this article we propose a method for quickly constructing a piler based on VLIW DSP. First the architecture of Trimaran is analyzed, and then the key technology of implementation is discussed in detail, including providing Mdes and Elcor and simulator, and customized instructions. Then the implementation of piler transplantation based on single cluster is presented.

Keywords:retargetable, piler, Trimaran

1引言

DSP是一种用于数字信号处理的专用处理器,为了提供强大的运算能力,DSP内部往往采用不同于微处理器的体系结构,支持专用DSP指令以加速常用DSP算法.为了满足嵌入式应用对于时间和空间的要求以及方便编写高效率的代码, 可以采用汇编语言编写程序.但是手工编写汇编代码易于出错、维护困难、难于移植并且耗时.随着市场竞争的加剧, 这种方式已经不再适应开发周期越来越短的现状.如果用一个优化效果较好的高级语言编译器, 则既可以满足DSP应用的时空要求, 又可以克服手工编写汇编代码开发方式的缺点.C语言正是效率高的通用高级编程语言,所以目前绝大多数DSP支持的高级语言编译器都是C编译器.

目前国外有一些比较成熟的开放源代码的可重定向编译的基础设施可以利用, 如GCC、LCC、IMPACT、OPENIMPACT、ORC、Trimaran、Zephyr等等.其中ORC、IMPACT和Trimaran都可以重定向到超长指令字机器,ORC和Impact的可重定向性都不是很佳,而Trimaran的可重定向机制很灵活,并且在Elcor模块中采用了基于图的中间表示,很容易理解,且Trimaran的技术资料非常详细,因此我们选择了Trimaran作为开发DSP编译器的平台.

2Trimaran组织结构

Trimaran是一个集成编译和性能监测环境的编译基础设施,是由HP实验室、Illinois大学的IMPACT研究组和Geia CREST中心(前身为New York大学的ReaCT-ILP实验室)三方合作研发的,主要面向EPIC和VLIW体系结构,支持指令级并行体系结构的编译器后端技术研究.它提供了一个参数化的EPIC处理器模型HPL-PD,支持条件执行、猜测执行和编译器控制的存储管理模块,此模型可以通过机器描述语言HMDES来修改.Trimaran主要由三个部分组成,其组织结构图如图1所示.

The Openimpact piler分析源文件输出一个机器无关的中间语言Lcode,the Elcor piler分析Lcode文件生成机器相关中间语言REBEL,the Simu simulator是一个模拟和性能统计的环境.Trimaran提供了一个包括全套分析和优化功能的编译模块,一个详细的模拟器和灵活的性能监测环境,还提供了基于图的中间表示Elcor,实现了数据依赖图、控制、流图的可视化,其图形用户界面可以方便地显示数据相关关系、性能统计结果等,另外Trimaran也可以生成IA-64代码.

2.1 Elcor Compiler

Trimaran提供了构造代码生成器的模板,并提供了机器无关的寄存器分配器,其中机器描述文件描述机器的指令格式、指令执行时占用的资源以及指令延迟、操作数格式等信息,通过获取机器描述文件中的信息,The Elcor Compiler可以把OpenImpact输出的中间语言Lcode转化为与目标机器相关的中间语言Rebel,并对Rebel进行机器相关优化比如公共子表达式删除、常数传播、复写传播、死代码删除以及寄存器分配、指令调度等等,其流程图如图2所示.

2.2 Simu Simulator

The Trimaran Simulator支持基于EPIC和VLIW的体系结构,用户可以通过修改机器描述文件来构造自己的Simulator.The Simulator输入的IR是REBEL,产生的是类似于汇编语言的c语言代码,The Simulator可以模拟程序在目标机上的运行,并产生一系列的统计数据来评价程序的执行状况,其流程图如图2所示.

The Simulator有两个组件,一个静态的Codegen,一个动态的Emulib, Codegen把中间语言REBEL转换为类似于汇编的低级c语言代码,用目标机上的c编译器编译并连接动态库组件(Emulib)生成目标代码文件,Emulib支持谓词执行(Predicated Execution) 、软件流水、模调度(Modulo Scheduling)、分簇体系结构(Clustered Archit- ectures) 、短向量指令寄存器(Short Vector Instru- ction Register)等等.Codegen产生的输出文件类型如下所示:

● 后缀名为.c文件:

● 后缀名为.inc文件:包含了外部变量、全局变量、结构体、共同体(union)和源文件中的映射关系,保存了跟踪执行统计结果和剖析信息的必要数据.

● 后缀名为.tbls文件:收集了emulation tables的所有信息.在emulation tables中列举了一系列的指令和操作信息.

● 后缀名为.simu文件:初始化所有的全局数据结构.

3写作目标机指令

Trimaran是很方便扩展的,可以根据目标机器添加新的指令或操作码到编译器和模拟器中去,这对于不同体系机构的编译器移植是很有用的.下面根据一个例子来说明这个特性,比如我们添加一个乘累加指令,指令的非循环计算图和指令格式如下:

指令格式:FMPYADD dest,src1,src2,src3

上述指令表达的语义是dest 等于 src1 * src2 +src3,下面详细介绍添加指令所需的步骤:机器描述文件处理、修改Elcor和模拟器的修改.

3.1 添加指令到MDES

机器描述文件存放在$TRIMARAN_ROOT/ elcor/mdes目录中,其中TRIMARAN_ROOT是Trimaran的根目录,添加一个新指令主要分为两步:

3.1.1添加指令opcode

在_ops.hmdes2文件中定义opcode:

$def OP_floatarith3_floatmpy FMPYADD

在上述定义中,定义了一组指令,它们分享共同的ISA属性,有同样的I/O格式、指令延迟、调度备选等等.

3.1.2添加操作格式等

在_pristine.hmdes2文件中定义操作格式、资源使用、调度备选等等,在段Operation_Format中添加操作格式信息,如下所示:

$for( clust in $0..(num_clusters-1)){

Of_floatarith3_${clust}(

pred(FT_p_${clust})

src(FT_f_${clust}FT_f_${clust} FT_f_${clust})

dest(FT_f_${clust})),

}

上述描述中${clust}表示体系结构中的簇,num_clusters表示体系机构中的簇数,src,dest分别制定了操作数类型、个数.下面段Scheduling_Alternative定义了指令的调度备选,资源信息,如下所示:

$for( clust in $0..(num_clusters-1)){

$for( idx in $0..(float_units -1)){

SA_floatarith3_floatmpy_${clust}_f${idx}(

format(OF_floatarith3_${clust})

latency(OL_floatmpy)

resv(RT_${clust}_f{idx})

),}

}

上述描述中${idx }表示体系结构中的处理浮点数的运算单元,float_units表示体系机构中能处理浮点数运算单元的个数,在上述段中定义了操作调度备选信息、操作延迟信息和资源使用状况信息等等.

3.2 添加指令到Elcor

在Elcor中添加一个操作码有两种方式:一种是枚举,一种是定义一个常量.对于每一个操作码都有一个root opcode(低8 bits)和一个opcode modifier(高24 bits),the modifier主要用于具有类似功能的操作码.下面我们在枚举类型IR_ROOT_OPCODE中添加乘累加操作码:

FMPYADD_S等于 ROOT_FMPYADD,

FMPYADD_D等于ROOT_FMPYADD| IR_DOUBLEM

为了Elcor顺利地生成机器相关中间文件REBEL和方便出错时打印信息,为每一个操作码定义一个字符串与之对应是必须的,绑定可以在$TRIMARAN/elcor/src/Graph/ opcode.cpp中的el_init_elcor_opcode_maps _arithmetic()函数中添加下面两行代码来实现:

el_string_to_opcode_map.bind(“FMPYADD_S”, FMPYADD_S),

el_opcode_to_string_map.bind(FMPYADD_S, “FMPYADD_S”),

重新编译Elcor,Elcor能识别FMPYADD _S操作码,但要在指令选择时使用这个新的操作码还必须在Elcor中添加分析程序,来寻找乘累加指令链,并用新的操作码替换它们.

3.3 添加指令到Simu

最后一步是修改simulator来模拟新的操作码,the simulator为每一个操作码自动产生代码,操作码信息在$TRIMARAN/simu /src/emulib/PD_ops.list这个文件中被描述,这个文件有一系列的段组成,每个段包含了一组操作码描述,操作码的信息按功能性来分类,如段float_arith描述了浮点操作的信息,以乘累加为例,操作码FMPYADD_S描述如下:

FMPYADD_S F,F,F:F, Multiply-Accumulatedest1.S等于 src1.S* src2.S +src3.S

基于VLIWDSP的可重定向编译器设计与实现参考属性评定
有关论文范文主题研究: 关于指令的论文范例 大学生适用: 学位论文、电大论文
相关参考文献下载数量: 68 写作解决问题: 本科论文怎么写
毕业论文开题报告: 文献综述、论文摘要 职称论文适用: 论文发表、职称评副高
所属大学生专业类别: 本科论文怎么写 论文题目推荐度: 经典题目

上面描述中FMPYADD_S表示操作码信息,_S和后面的.S表示单精度,F,F,F表示三个源操作数,冒号后面的F表示目的操作数,Multiply-Accumulate表示产生代码时的注释,最后一列表示语义信息.

4目标代码生成

目标代码生成指的是把Elcor优化过后的中间代码REBEL转化为目标机器汇编代码,转换只是个工程实现问题,没有难度,这里不再叙述,只提供两种方法:一是根据Elcor中提供的接口直接生成目标代码,另一种是移植Simulator中的codegen程序生成目标代码.

5实验结果

试验所用的测试程序来自于由HP实验室、Illinois大学和Geia CREST中心联合开发的Trimaran基础编译设施中的benchmarks,试验结果表明无论是对于核心算法程序还是应用程序,使用Trimaran架构技术都极大地扩展了调度的范围,简化了控制流,大幅度提高了ILP.对于有些核心算法而言,主要的控制结构为for循环语句,没有if-then-else等分支控制结构中,由于采用了统一的谓词寄存器分配,使得多余的谓词寄存器可以充当普通寄存器使用,故仍有小幅的性能提升.而在应用测试程序中,由于存在多种控制结构,使得基于Trimaran技术的寄存器分配和列表调度等优化方法均提高了程序的性能,与gcc比较的实验结果如图4所示.

6结束语

本文在Trimaran架构基础上实现了基于单簇体系结构的编译器移植,效果较好,很大程度上缩短了开发编译器周期,节约了成本.下一步工作主要研究基于多簇的编译器移植,并针对VLIW DSP体系结构做一些优化,提高编译器的性能.