论文部分内容阅读
程序优化与变换是编译器领域一个热门的研究问题。本文分别在源代码层次、编译器的抽象语法树层次和编译器的中间表示层次进行研究,为程序优化与变换提供工具和支撑。本文在这三个层次分别提出了:一个C到C/CUDA的程序变换工具DPOET;一个结构体数组分拆工具structTrans;一个针对于堆内存对象的结构分析算法。它们分别能:对程序进行并行化;提高程序的数据局部性;为程序存储优化提供支撑。1、实现一种C到CUDA的程序变换工具程序并行化是程序优化中提高性能的一个重要途径,本文基于程序变换工具POET实现一个脚本驱动的、C程序到C/CUDA程序的变换工具DPOET。使用DPOET对程序进行变换时,用户只需要在DPOET的脚本中贴出模板代码以及其参数化和目的代码。DPOET就可以自动为用户生产POET脚本,调用POET对待变换的程序进行解析,识别出其中可以变换的代码片段,进行变换。使用DPOET进行C到C/CUDA的程序变换非常简单。2、实现结构体数组分拆的工具程序中结构体(特别是结构体数组)的大量使用会降低数据局部性,影响程序的性能。为了提高程序的数据局部性,本文基于编译器LLVM的抽象语法树Clang AST实现了一个结构体数组分拆工具,它能够在保持程序语义不变的情况下,把结构体数组按域进行分拆,分拆成其各个域的数组。3、提出针对堆内存对象的结构分析算法如果对多个堆内存对象进行分离进行存储优化,需要获取它们的结构信息从而判断它们是否相互独立。像C这样语言,由于可以使用指针直接操作内存,程序员可以构造出任意深度的堆内存对象。堆内存对象的具体结构无法直接通过指向它的指针或者指针指向的顶层节点获得,需要对其进行指向分析。为此,本文提出了一种域敏感的、流敏感的、上下文敏感的针对于堆内存对象的结构分析算法。本算法主要分为两个部分:流敏感的、域敏感的过程内分析和上下文敏感的过程间分析。