CN102043659A - 消除内存访问冲突的编译装置及其实现方法 - Google Patents
消除内存访问冲突的编译装置及其实现方法 Download PDFInfo
- Publication number
- CN102043659A CN102043659A CN2010105773135A CN201010577313A CN102043659A CN 102043659 A CN102043659 A CN 102043659A CN 2010105773135 A CN2010105773135 A CN 2010105773135A CN 201010577313 A CN201010577313 A CN 201010577313A CN 102043659 A CN102043659 A CN 102043659A
- Authority
- CN
- China
- Prior art keywords
- memory
- variable
- internal memory
- unit
- allocation
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
一种计算机技术领域的消除内存访问冲突的编译装置及其实现方法,该装置包括:前端语言分析单元、内存变量分析单元、内存冲突消除单元和转换输出单元,前端语言分析单元与内存变量分析单元和内存冲突消除单元相连接并传输由源程序转换的中间语言序列、内存模型与内存操作信息和源文件函数依赖树,内存变量分析单元与内存冲突消除单元相连接并传输变量内存分配和内存块操作信息,内存冲突消除单元与转换输出单元相连接并传输经过内存分配优化的中间语言信息,转换输出单元输出最终的可执行代码。本发明使得因内存冲突而产生的额外开销大大减小。
Description
技术领域
本发明涉及的是一种计算机技术领域的装置及方法,具体是一种消除内存访问冲突的编译装置及其实现方法。
背景技术
编译器是将高级语言转换成机器可执行语言的程序。编译器在转换过程中,需要对程序中的变量在内存的存放位置进行分配,以避免内存指令在执行过程中因内存冲突而引发的流水线停顿,最终提高最终生成的机器可执行程序的执行效率。
在现有的处理器中,特别是DSP处理器,指令集通常会支持内存操作数以及多样的寻址方式。由于在数据处理及其应用中,内存访问操作是一个关键的环节,因此,如何进行变量分配以最高效率地利用流水线是具有至关重要的意义的。另一方面,对于多数的DSP架构,为了尽可能地提高内存带宽,通常支持多数据内存架构(一般是双数据内存架构),即指令可以在同一个时钟周期并行访问多个不同的数据内存,但是不能在同一个时钟周期多次访问一个数据内存。
解决这种内存冲突的方法有两大类,一类是程序员手动安排变量的存储位置,特别在嵌入式应用中,手动分配变量是一种非常有效的内存分配方法,它使得程序在数据结构算法层面上消除了内存冲突,但是当程序结构变得复杂时,人为分配变量的方法经常会陷入局部最优化的怪圈;另一类是通过编译器进行优化,这种方法可以从全局角度进行变量存储空间分配,但是现阶段编译器对于多数据存储器架构的变量分配策略仍然不完善。
经对现有技术的文献调查发现,G.Grewal等在2006年IEEE Congress on Evolutionary Computation上采用遗传算法并针对M56K这一类双数据内存的DSP结构提出了一种内存分配策略。但是这种分配策略对于多于双通道的内存结构无能为力,且当内存访问出现源操作数与目的操作数相同的情况,将不可避免地发生内存冲突;同时,这种分配算法仅针对内存变量为单一变量的情况有效,当变量为数组等连续结构时,这种分配算法将失效。
发明内容
本发明针对现有技术存在的上述不足,提供一种消除内存访问冲突的编译装置及其实现方法,使得因内存冲突而产生的额外开销大大减小。
本发明是通过以下技术方案实现的:
本发明涉及一种消除内存访问冲突的编译装置,包括:前端语言分析单元、内存变量分析单元、内存冲突消除单元和转换输出单元,其中:前端语言分析单元与内存变量分析单元和内存冲突消除单元相连接并传输由源程序转换的中间语言序列、内存模型与内存操作信息和源文件函数依赖树,内存变量分析单元与内存冲突消除单元相连接并传输变量内存分配和内存块操作信息,内存冲突消除单元与转换输出单元相连接并传输经过内存分配优化的中间语言信息,转换输出单元输出最终的可执行代码。
所述的前端语言分析单元包括:内存配置组件、语言分析组件和文件函数关系组件,其中:内存配置组件与内存变量分析单元相连接并通过内存操作信息表和内存模型描述表传递内存操作信息和内存模型,语言分析组件将源程序转换为中间语言序列并分别传递给内存变量分析单元和内存冲突消除单元,文件函数关系组件分析源程序中各文件的函数依赖关系并以源文件函数依赖树的形式传递给内存冲突消除单元。
所述的内存操作信息表包括:数学运算指令功能、操作数个数、操作数类型、寻址模式、数据宽度以及执行开销;
所述的内存模型描述表包括内存的总大小、内存分区的个数、各个内存分区的起始地址和大小。
所述的内存变量分析单元读取并分析记录中间程序包含的所有的内存变量及其操作,该内存变量分析单元包括:内存变量分配器和变量分析组件,其中:内存变量分配器分析由前端语言分析单元生成的中间语言序列中的内存变量信息并采用动态分配或静态分配以变量内存分配表的形式传递给变量分析组件,内存变量分析单元通过变量内存分配表来分析每一个程序基本块中的内存操作信息并记录到内存块操作表中。
所述的动态分配是指:内存变量分配器通过唯一确定且记录到变量内存分配表中的分配标识以跟踪记录内存变量的名称以及生存周期信息;
所述的静态分配是指:内存变量分配器标识该变量生存周期为全局并记录到变量内存分配表中;
所述的变量内存分配表包括:变量标识、变量名、变量尺寸、变量生存周期、变量分割以及内存分配,其中:变量标识是区别不同变量的唯一标识;变量尺寸记录变量的大小信息;变量生存周期记录变量的生存周期,包括变量的分配时刻以及变量的释放时刻,在初始阶段对于全局变量来说,分配时刻即程序开始,释放时刻是程序终止;变量分割记录变量经过变量分割变换模块后的新信息,包括分割数量,每个分割的变量重命名,以及各分割的内存分配;
所述的内存块操作表中的每一个表项标识基本块中内存操作的相关信息;相关信息包含:源内存操作数的个数,每个源内存操作数的大小、变量类型和操作数更新方式,目标内存操作数的个数,每个目标内存操作数的大小、类型和操作数更新方式,内存操作的类型。
所述的内存冲突消除单元包括:变量分割组件、全局内存分配组件和寻址模式选择组件,其中:变量分割组件接收由前端语言单元传递的中间语言序列,通过分析中间程序中存在的内存冲突,对符合分割模型的变量进行分割和重命名操作,同时更新变量内存分配表和内存块操作表信息并分别输出至全局内存分配组件和寻址模式选择组件;全局内存分配组件读取更新后的内存分配表并根据其中的内存变量的大小,生存周期采用优化算法对所有的内存变量进行分配并输出至寻址模式选择组件;寻址模式选择组件根据内存块操作表的信息,以基本块为单位为数组形式的变量分配寻址模式。中间程序依次通过上述三个组件的转换后,内存冲突消除单元输出经过内存分配优化的中间程序和一个变量链接文件。
所述的变量链接文件包括:每个内存分区的标识、内存分区的起始地址、分配到该内存的变量信息;为了减小内存的碎片,分配到各内存分区的变量按照变量大小从大到小的顺序依次进行分配;变量信息包括变量名,变量的对齐模式、变量的大小。
所述的转换输出单元,输入为变量链接表和中间程序,通过转换最终输出机器可执行的程序代码。
本发明涉及上述装置的实现方法,包括以下步骤:
第一步:用户编译源程序,对需要进行内存分配调度的变量结构通过内存变量分配器进行分配,使得编译器能够显式识别所有需要内存分配调度的变量;
第二步:用户使用本发明的一种简洁、易行且直观的内存操作和内存模型描述方法对处理器支持的内存操作、寻址模式以及内存的模型进行描述;用户只需要按照规范填入规范化的表格就可完成对内存操作以及内存模型的描述;
第三步:将用户对内存操作以及内存模型的描述信息提取出来,并分别组织成具有良好接口、同时有利于编译器解析的内存操作信息结构和特定内存的内存模型;
第四步:用户输入需要编译的源程序和源程序的文件依赖关系;根据用户编译的文件依赖关系构造一棵源文件函数依赖树;
第五步:源程序通过前端语言单元编译转换成编译器通用的一种中间程序,在这一步中,可以实施多种编译优化策略,包括对内存操作的调度,以消除内存操作之间存在的因数据相关而产生的冲突;
第六步:将由内存变量分配器分配的内存变量存放在变量内存分配表中;
第七步:结合第三步生成的内存操作信息结构,以及第六步生成的变量内存分配表,分析中间程序中对应内存变量的操作行为,并以基本块的形式构建内存块操作表;
第八步:根据第七步生成的内存操作表中各个内存变量的操作类型,通过变量分割模块检测各个内存块操作表项是否匹配分割模型,对于符合模型的内存变量进行变量分割和重命名;
第九步:根据第四步生成的源文件函数依赖树,找到发生分割重命名的基本块与变量,并找到依赖关系中该基本块的所有后续基本块中对此分割重命名变量的所有引用,对它们也依次进行更新;
第十步:重复第八步和第九步,直到完成所有满足模型的变量分割与重命名,同时更新变量内存分配表;
第十一步:根据变量内存分配表、内存块操作表通过全局优化模块进行内存变量全局优化分配;一种全局优化的方法是采用遗传算法计算出内存分配的优化解;根据算法所找到的最优解更新变量内存分配表和内存块操作表;
第十二步:根据内存块操作表的信息中各个内存块操作的源和目的操作数的更新方式,结合第三步中的内存操作结构信息中描述的寻址模式,由寻址模式分配组件选择合适的寻址模式;
第十三步:根据最终的变量内存分配表生成变量链接文件;
第十四步:根据变量链接文件将中间程序生成最终生成机器可执行程序。
与现有技术相比,本发明具有以下有益的效果:
本发明提供了通用的结构化内存指令描述和内存结构模型配置方法,仅需根据用户输入的配置信息便能完成基于用户内存模型的内存变量分配优化。
1)相对于以往仅仅局限于双数据内存模型的内存分配策略,本发明所提供的分配算法不受该条件限制,可以支持多数据内存模型,因此可以针对用户自定义的内存模型进行优化分配。
2)本发明提出的编译装置不仅仅局限于现有技术对内存操作的源操作数冲突分析,而可以同时对内存操作的源操作数之间、源和目的操作数之间进行冲突分析,因此功能更加完善。
附图说明
图1是本发明系统示意图。
图2是本发明方法流程图。
图3是用于描述内存操作的规范化的表格的结构示意图。
图4是用于描述内存模型的规范化的表格的结构示意图。
图5是变量内存分配表示意图。
图6是内存块操作表示意图。
图7是变量链接文件示意图。
图8是第三类分割模型的典型示例的分割示意图。
图9是第三类分割模型一般形式的分割示意图。
图10是第四类分割模型的典型示例的分割示意图。
图11是采用遗传算法的内存全局优化流程图。
图12是实施例内存分配解修复示意图。
具体实施方式
下面对本发明的实施例作详细说明,本实施例在以本发明技术方案为前提下进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。
如图1所示,本实施例包括:前端语言分析单元、内存变量分析单元、内存冲突消除单元和转换输出单元,其中:前端语言分析单元与内存变量分析单元和内存冲突消除单元相连接并传输由源程序转换的中间语言序列、内存模型与内存操作信息和源文件函数依赖树,内存变量分析单元与内存冲突消除单元相连接并传输变量内存分配和内存块操作信息,内存冲突消除单元与转换输出单元相连接并传输经过内存分配优化的中间语言信息,转换输出单元输出最终的可执行代码。
所述的前端语言分析单元包括:内存配置组件、语言分析组件和文件函数关系组件,其中:内存配置组件与内存变量分析单元相连接并通过内存操作信息表和内存模型描述表传递内存操作信息和内存模型,语言分析组件将源程序转换为中间语言序列并分别传递给内存变量分析单元和内存冲突消除单元,文件函数关系组件分析源程序中各文件的函数依赖关系并以源文件函数依赖树的形式传递给内存冲突消除单元。
所述的内存操作信息表包括:数学运算指令功能、操作数个数、操作数类型、寻址模式、数据宽度以及执行开销。
所述的内存模型描述表包括内存的总大小、内存分区的个数、各个内存分区的起始地址和大小。
所述的内存变量分析单元读取并分析记录中间程序包含的所有的内存变量及其操作,该内存变量分析单元包括:内存变量分配器和变量分析组件,其中:内存变量分配器分析由前端语言分析单元生成的中间语言序列中的内存变量信息并采用动态分配或静态分配以变量内存分配表的形式传递给变量分析组件,内存变量分析单元通过变量内存分配表来分析每一个程序基本块中的内存操作信息并记录到内存块操作表中。
所述的动态分配是指:内存变量分配器通过唯一确定且记录到变量内存分配表中的分配标识以跟踪记录内存变量的名称以及生存周期信息。
所述的静态分配是指:内存变量分配器标识该变量生存周期为全局并记录到变量内存分配表中。
所述的变量内存分配表包括:变量标识、变量名、变量尺寸、变量生存周期、变量分割以及内存分配,其中:变量标识是区别不同变量的唯一标识;变量尺寸记录变量的大小信息;变量生存周期记录变量的生存周期,包括变量的分配时刻以及变量的释放时刻,在初始阶段对于全局变量来说,分配时刻即程序开始,释放时刻是程序终止;变量分割记录变量经过变量分割变换模块后的新信息,包括分割数量,每个分割的变量重命名,以及各分割的内存分配。
所述的内存块操作表中的每一个表项标识基本块中内存操作的相关信息;相关信息包含:源内存操作数的个数,每个源内存操作数的大小、变量类型和操作数更新方式,目标内存操作数的个数,每个目标内存操作数的大小、类型和操作数更新方式,内存操作的类型。
所述的内存冲突消除单元包括:变量分割组件、全局内存分配组件和寻址模式选择组件,其中:变量分割组件接收由前端语言单元传递的中间语言序列,通过分析中间程序中存在的内存冲突,对符合分割模型的变量进行分割和重命名操作,同时更新变量内存分配表和内存块操作表信息并分别输出至全局内存分配组件和寻址模式选择组件;全局内存分配组件读取更新后的内存分配表并根据其中的内存变量的大小,生存周期采用优化算法对所有的内存变量进行分配并输出至寻址模式选择组件;寻址模式选择组件根据内存块操作表的信息,以基本块为单位为数组形式的变量分配寻址模式。中间程序依次通过上述三个组件的转换后,内存冲突消除单元输出经过内存分配优化的中间程序和一个变量链接文件。
所述的变量分割组件首先查找中间程序是否存在因源操作数和目标操作数相同(或者重叠)而存在的普通内存分配无法解决的内存冲突操作,分析这些内存操作,并根据分割模型将这些变量进行特定分割以及重命名;分割完成后,根据源文件函数依赖树更新变量,同时更新内存块操作表和变量内存分配表。
所述的分割模型包括:第一种模型源操作数是2个以上的内存操作数,分割该类型的内存操作模型首先引入一个临时中间变量,原内存操作会分裂成两个2操作数的内存操作,第一个操作的目的操作数是临时中间变量,第二个操作的一源操作数为此临时变量;第二种模型的两源操作数是同一个变量,且内存操作是加法、减法或除法,分割该类型的内存操作模型即将移位操作代替加法操、用0代替减法操作、当内存值不为0用1代替除法结果;第三种模型的两源操作数是一个数组的不同元素,分割该类型的内存操作模型即以这两个元素的间隔为单位分割数组单元,并将相间隔的数组分割子块拼接在一起,最终分割成两个数组子块;第四种模型内存操作的一源操作数和目的操作数相同或则是一个数组的不同元素,分割该类型的内存操作模型即将目的操作数进行重命名。
所述的全局内存分配组件,读取变量内存分配表的信息,根据变量分配代价通过全局优化算法计算出变量分配代价最小的值所对应的变量分配策略,根据分配策略生成变量链接文件。
所述的变量分配代价是指:由变量的大小、内存操作的频繁程度和内存操作的执行代价三部分决定的,且变量分配代价与这三个部分成正比。
所述的变量链接文件包括:每个内存分区的标识、内存分区的起始地址、分配到该内存的变量信息;为了减小内存的碎片,分配到各内存分区的变量按照变量大小从大到小的顺序依次进行分配;变量信息包括变量名,变量的对齐模式、变量的大小。
所述的寻址模式选择组件,首先标记内存块操作表中的各个内存块中源操作数和目的操作数的更新方式,根据用户输入的内存指令及寻址模式描述,分配给各个内存块合适的寻址模式。
所述的寻址模式支持正常自增减寻址模式、对称寻址模式、比特反转寻址模式和循环寻址模式。
所述的转换输出单元,输入为变量链接表和中间程序,通过转换最终输出机器可执行的程序代码。
如图2所示,上述编译装置具体通过以下方式实现编译:
第一步:用户编译源程序,对需要进行内存分配调度的变量结构通过内存变量分配器进行分配,使得编译器能够显式识别所有需要内存分配调度的变量;
第二步:用户使用本实施例的一种简洁、易行且直观的内存操作和内存模型描述方法对处理器支持的内存操作、寻址模式以及内存的模型进行描述;用户只需要按照规范填入规范化的表格就可完成对内存操作以及内存模型的描述;
第三步:将用户对内存操作以及内存模型的描述信息提取出来,并分别组织成具有良好接口、同时有利于编译器解析的内存操作信息结构和特定内存的内存模型;
第四步:用户输入需要编译的源程序和源程序的文件依赖关系;根据用户编译的文件依赖关系构造一棵源文件函数依赖树;
第五步:源程序通过前端语言单元编译转换成编译器通用的一种中间程序,在这一步中,可以实施多种编译优化策略,包括对内存操作的调度,以消除内存操作之间存在的因数据相关而产生的冲突;
第六步:将由内存变量分配器分配的内存变量存放在变量内存分配表中;
第七步:结合第三步生成的内存操作信息结构,以及第六步生成的变量内存分配表,分析中间程序中对应内存变量的操作行为,并以基本块的形式构建内存块操作表;
第八步:根据第七步生成的内存操作表中各个内存变量的操作类型,通过变量分割模块检测各个内存块操作表项是否匹配分割模型,对于符合模型的内存变量进行变量分割和重命名;
第九步:根据第四步生成的源文件函数依赖树,找到发生分割重命名的基本块与变量,并找到依赖关系中该基本块的所有后续基本块中对此分割重命名变量的所有引用,对它们也依次进行更新;
第十步:重复第八步和第九步,直到完成所有满足模型的变量分割与重命名,同时更新变量内存分配表;
第十一步:根据变量内存分配表、内存块操作表通过全局优化模块进行内存变量全局优化分配;一种全局优化的方法是采用遗传算法计算出内存分配的优化解;根据算法所找到的最优解更新变量内存分配表和内存块操作表;
第十二步:根据内存块操作表的信息中各个内存块操作的源和目的操作数的更新方式,结合第三步中的内存操作结构信息中描述的寻址模式,由寻址模式分配组件选择合适的寻址模式;
第十三步:根据最终的变量内存分配表生成变量链接文件;
第十四步:根据变量链接文件将中间程序生成最终生成机器可执行程序。
如图1所示为本实施例的方法流程图,即:用户描述步骤,用户通过本实施例提供的内存操作和内存模型描述表进行内存操作和内存模型的描述;前端语言转换步骤,将源程序转换成统一的编译器中间语言;内存变量分析步骤,对中间程序进行分析,记录所有内存变量的信息,以及各个内存块的操作信息;内存冲突消除步骤,搜索中间程序中的内存操作,根据分割模型分别进行变量分割与重命名、全局内存分配优化并生成各个内存变量的链接信息以及分析内存块操作中源操作数和目标操作数的更新方式选择合适的寻址方式;转换输出步骤,根据链接信息将中间程序转换成机器可执行的代码。
如图3~图14所示,本实例中,用户对内存操作和内存模型配置的描述采用填空和填写表格的方式,其中内存操作描述表与内存模型描述表的示意图分别如图3和图4所示,本实例中用户对配置的描述如下所示:
用户的处理器支持32位的乘法指令,该指令有3个操作数,且都为内存操作数,支持普通自加减寻址。内存操作描述表如下:
处理的内存模型结构为,数据内存总大小64kB,起始地址为0x2000,具有4个内存分区,每个分区16k。内存模型描述表如下:
本实施例的一个关键技术是变量的分割变换。变量分割变化是通过分割模型来进行变量分割重命名的;这些模型分别是,源操作数是2个以上的内存操作数的分割模型,两源操作数是同一个变量的分割模型,两源操作数是一个数组的不同元素的分割模型,内存操作的一源操作数和目的操作数相同或则是一个数组的不同元素的分割模型。对于第一种和第二种分割模型,仅仅涉及本内存块操作的等效替换,不存在变量的重命名。下面,探讨第三种和第四种变量分割模型。
[两源操作数是一个数组的不同元素的分割模型]
这个模型的一个典型的例子是如图8所示的C代码数组操作。在这段代码中,A[i],F[i]全部是32比特的整型元素,其中数组A[i]的值由数组F[i]与F[i-1]相乘得到。根据用户定义的内存操作描述,可以知道该操作将被转换成一条32比特的乘法指令,因此该操作将记录到内存块操作表,同时数组A和数组B也将被记录到变量内存分配表中。但是由于该乘法指令的两个源操作数位于内存的连续的位置,会造成内存冲突。根据本分割模型,两个操作数的间隔为1,因此可以F拆成两块,如图9所示,其中,奇数下标的元素组成一块,偶数下标的组成另一块,在内存分配的时这两块的数据存放到不同的位置可以保证进行乘法操作时候没有冲突产生。
一般的情况,如图10所示,两个源操作数的地址间隔为k,此时以k为大小对数组F进行分割,亦可以实现在访问时刻两个源操作数不会发生冲突。
[一源操作数和目的操作数相同或则是一个数组的不同元素的分割模型]
符合此模型的一个例子如图11所示,内存乘法的一个源操作数和目的操作数同为F[i],当乘法的执行周期为3时候,读F[i+3]和写F[i]会产生内存冲突。根据分割模型,目标操作数的F[i]会被重命名为F_1[i],在分配内存中,F与F_1存放在不同的位置可以保证在进行乘法操作的时刻不会发生内存冲突,分割示意图如图12所示。
当内存乘法的一个源操作数和目的操作数为同一个数组的不同元素时候,例如源操作数为F[i],目的操作数为F[i+2],对此模型的分析与源和目的操作数相同的分析相似,通过对目的操作数进行换名,可以消除访问冲突。
经过变量分割变换后,源和目的操作数产生冲突的情况可以得到解决。下面根据用户输入的文件依赖关系生成源文件函数依赖树,如图7所示。根据源文件函数依赖树,编译装置将更新所有后续节点对被分割变量的引用,同时更新内存分配表和内存块操作表。
全局内存分配组件可以采用特定的优化算法。一种全局优化的算法为遗传算法,如图13所示。首先,随机生成一组分配解集合。根据内存操作的执行代价、内存操作的次数和变量的大小计算各个分配解的代价。为了防止得到的解是错误的,例如某一块内存分区溢出,需要对生成的分配解进行修复。修复的策略有很多,一种方式如图14所示,该方法将溢出的内存分区中的变量取出,测试该变量能否被放置在其他分区而不造成冲突,进而重新分配该变量。全局算法完成得到最优的分配解后,更新变量内存分配表和内存块操作表,同时根据变量内存分配表生成变量链接文件;变量链接文件的一种组织形式如图7所示。
经过全局分配模块后,所有变量的内存分配位置都被确定下来,在内存块操作表中可以分析源操作数与目的操作数的更新方式,结合用户输入的内存操作描述表中操作数的寻址方式,可以分配内存变量合适的寻址模式。
最后,输出转换单元根据变量链接文件将中间程序转换成为最终的机器可执行程序。
与现有技术相比,本实施例具有以下有益的效果:
本实施例提供了通用的结构化内存指令描述和内存结构模型配置方法,仅需根据用户输入的配置信息便能完成基于用户内存模型的内存变量分配优化。
1)相对于以往仅仅局限于双数据内存模型的内存分配策略,本实施例所提供的分配算法不受该条件限制,可以支持多数据内存模型,因此可以针对用户自定义的内存模型进行优化分配。
2)本实施例提出的编译装置不仅仅局限于现有技术对内存操作的源操作数冲突分析,而可以同时对内存操作的源操作数之间、源和目的操作数之间进行冲突分析,因此功能更加完善。
Claims (6)
1.一种消除内存访问冲突的编译装置,其特征在于,包括:前端语言分析单元、内存变量分析单元、内存冲突消除单元和转换输出单元,其中:前端语言分析单元与内存变量分析单元和内存冲突消除单元相连接并传输由源程序转换的中间语言序列、内存模型与内存操作信息和源文件函数依赖树,内存变量分析单元与内存冲突消除单元相连接并传输变量内存分配和内存块操作信息,内存冲突消除单元与转换输出单元相连接并传输经过内存分配优化的中间语言信息,转换输出单元输出最终的可执行代码。
2.根据权利要求1所述的消除内存访问冲突的编译装置,其特征是,所述的前端语言分析单元包括:内存配置组件、语言分析组件和文件函数关系组件,其中:内存配置组件与内存变量分析单元相连接并通过内存操作信息表和内存模型描述表传递内存操作信息和内存模型,语言分析组件将源程序转换为中间语言序列并分别传递给内存变量分析单元和内存冲突消除单元,文件函数关系组件分析源程序中各文件的函数依赖关系并以源文件函数依赖树的形式传递给内存冲突消除单元;所述的内存操作信息表包括:数学运算指令功能、操作数个数、操作数类型、寻址模式、数据宽度以及执行开销;所述的内存模型描述表包括内存的总大小、内存分区的个数、各个内存分区的起始地址和大小。
3.根据权利要求1所述的消除内存访问冲突的编译装置,其特征是,所述的内存变量分析单元读取并分析记录中间程序包含的所有的内存变量及其操作,该内存变量分析单元包括:内存变量分配器和变量分析组件,其中:内存变量分配器分析由前端语言分析单元生成的中间语言序列中的内存变量信息并采用动态分配或静态分配以变量内存分配表的形式传递给变量分析组件,内存变量分析单元通过变量内存分配表来分析每一个程序基本块中的内存操作信息并记录到内存块操作表中,其中:动态分配是指:内存变量分配器通过唯一确定且记录到变量内存分配表中的分配标识以跟踪记录内存变量的名称以及生存周期信息;静态分配是指:内存变量分配器标识该变量生存周期为全局并记录到变量内存分配表中;所述的变量内存分配表包括:变量标识、变量名、变量尺寸、变量生存周期、变量分割以及内存分配,其中:变量标识是区别不同变量的唯一标识;变量尺寸记录变量的大小信息;变量生存周期记录变量的生存周期,包括变量的分配时刻以及变量的释放时刻,在初始阶段对于全局变量来说,分配时刻即程序开始,释放时刻是程序终止;变量分割记录变量经过变量分割变换模块后的新信息,包括分割数量,每个分割的变量重命名,以及各分割的内存分配;所述的内存块操作表中的每一个表项标识基本块中内存操作的相关信息;相关信息包含:源内存操作数的个数,每个源内存操作数的大小、变量类型和操作数更新方式,目标内存操作数的个数,每个目标内存操作数的大小、类型和操作数更新方式,内存操作的类型。
4.根据权利要求1所述的消除内存访问冲突的编译装置,其特征是,所述的内存冲突消除单元包括:变量分割组件、全局内存分配组件和寻址模式选择组件,其中:变量分割组件接收由前端语言单元传递的中间语言序列,通过分析中间程序中存在的内存冲突,对符合分割模型的变量进行分割和重命名操作,同时更新变量内存分配表和内存块操作表信息并分别输出至全局内存分配组件和寻址模式选择组件;全局内存分配组件读取更新后的内存分配表并根据其中的内存变量的大小,生存周期采用优化算法对所有的内存变量进行分配并输出至寻址模式选择组件;寻址模式选择组件根据内存块操作表的信息,以基本块为单位为数组形式的变量分配寻址模式,中间程序依次通过上述三个组件的转换后,内存冲突消除单元输出经过内存分配优化的中间程序和一个变量链接文件,该变量链接文件包括:每个内存分区的标识、内存分区的起始地址、分配到该内存的变量信息;为了减小内存的碎片,分配到各内存分区的变量按照变量大小从大到小的顺序依次进行分配;变量信息包括变量名,变量的对齐模式、变量的大小。
5.根据权利要求1所述的消除内存访问冲突的编译装置,其特征是,所述的转换输出单元,输入为变量链接表和中间程序,通过转换最终输出机器可执行的程序代码。
6.一种根据上述任一权利要求所述装置的实现方法,其特征在于,包括以下步骤:
第一步:用户编译源程序,对需要进行内存分配调度的变量结构通过内存变量分配器进行分配,使得编译器能够显式识别所有需要内存分配调度的变量;
第二步:用户使用本发明的一种简洁、易行且直观的内存操作和内存模型描述方法对处理器支持的内存操作、寻址模式以及内存的模型进行描述;用户只需要按照规范填入规范化的表格就可完成对内存操作以及内存模型的描述;
第三步:将用户对内存操作以及内存模型的描述信息提取出来,并分别组织成具有良好接口、同时有利于编译器解析的内存操作信息结构和特定内存的内存模型;
第四步:用户输入需要编译的源程序和源程序的文件依赖关系;根据用户编译的文件依赖关系构造一棵源文件函数依赖树;
第五步:源程序通过前端语言单元编译转换成编译器通用的一种中间程序,在这一步中,可以实施多种编译优化策略,包括对内存操作的调度,以消除内存操作之间存在的因数据相关而产生的冲突;
第六步:将由内存变量分配器分配的内存变量存放在变量内存分配表中;
第七步:结合第三步生成的内存操作信息结构,以及第六步生成的变量内存分配表,分析中间程序中对应内存变量的操作行为,并以基本块的形式构建内存块操作表;
第八步:根据第七步生成的内存操作表中各个内存变量的操作类型,通过变量分割模块检测各个内存块操作表项是否匹配分割模型,对于符合模型的内存变量进行变量分割和重命名;
第九步:根据第四步生成的源文件函数依赖树,找到发生分割重命名的基本块与变量,并找到依赖关系中该基本块的所有后续基本块中对此分割重命名变量的所有引用,对它们也依次进行更新;
第十步:重复第八步和第九步,直到完成所有满足模型的变量分割与重命名,同时更新变量内存分配表;
第十一步:根据变量内存分配表、内存块操作表通过全局优化模块进行内存变量全局优化分配;一种全局优化的方法是采用遗传算法计算出内存分配的优化解;根据算法所找到的最优解更新变量内存分配表和内存块操作表;
第十二步:根据内存块操作表的信息中各个内存块操作的源和目的操作数的更新方式,结合第三步中的内存操作结构信息中描述的寻址模式,由寻址模式分配组件选择合适的寻址模式;
第十三步:根据最终的变量内存分配表生成变量链接文件;
第十四步:根据变量链接文件将中间程序生成最终生成机器可执行程序。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010105773135A CN102043659A (zh) | 2010-12-08 | 2010-12-08 | 消除内存访问冲突的编译装置及其实现方法 |
CN201110073683.XA CN102193811B (zh) | 2010-12-08 | 2011-03-25 | 消除内存访问冲突的编译装置及其实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010105773135A CN102043659A (zh) | 2010-12-08 | 2010-12-08 | 消除内存访问冲突的编译装置及其实现方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102043659A true CN102043659A (zh) | 2011-05-04 |
Family
ID=43909817
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010105773135A Withdrawn CN102043659A (zh) | 2010-12-08 | 2010-12-08 | 消除内存访问冲突的编译装置及其实现方法 |
CN201110073683.XA Expired - Fee Related CN102193811B (zh) | 2010-12-08 | 2011-03-25 | 消除内存访问冲突的编译装置及其实现方法 |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110073683.XA Expired - Fee Related CN102193811B (zh) | 2010-12-08 | 2011-03-25 | 消除内存访问冲突的编译装置及其实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (2) | CN102043659A (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103235745A (zh) * | 2013-03-27 | 2013-08-07 | 华为技术有限公司 | 一种地址冲突检测方法及装置 |
CN103955406A (zh) * | 2014-04-14 | 2014-07-30 | 浙江大学 | 一种基于超级块的投机并行化方法 |
CN104823161A (zh) * | 2012-11-07 | 2015-08-05 | 皇家飞利浦有限公司 | 生成无运算符代码的编译器 |
CN108197027A (zh) * | 2017-12-29 | 2018-06-22 | 广州景派科技有限公司 | 软件性能优化方法、可存储介质、计算机、计算机程序 |
CN108874532A (zh) * | 2017-06-01 | 2018-11-23 | 北京旷视科技有限公司 | 内存分配方法及设备 |
CN110471862A (zh) * | 2019-07-16 | 2019-11-19 | 杭州电子科技大学 | 一种可编程控制器的变量地址分配系统及方法 |
CN110895512A (zh) * | 2018-09-13 | 2020-03-20 | 普天信息技术有限公司 | 一种内存管理方法 |
CN112631610A (zh) * | 2020-11-30 | 2021-04-09 | 上海交通大学 | 一种针对粗粒度可重构结构的数据重用消除访存冲突方法 |
CN115826946A (zh) * | 2023-02-17 | 2023-03-21 | 苏州浪潮智能科技有限公司 | 一种程序异常向量空间优化系统、方法、设备及介质 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106506594B (zh) * | 2016-09-30 | 2019-09-03 | 科大讯飞股份有限公司 | 一种并行计算资源分配方法及装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB0316532D0 (en) * | 2003-07-15 | 2003-08-20 | Transitive Ltd | Method and apparatus for partitioning code in program code conversion |
CN1740989A (zh) * | 2004-08-23 | 2006-03-01 | 中兴通讯股份有限公司 | 通用嵌入式系统虚拟页属性管理方法 |
US7926046B2 (en) * | 2005-12-13 | 2011-04-12 | Soorgoli Ashok Halambi | Compiler method for extracting and accelerator template program |
-
2010
- 2010-12-08 CN CN2010105773135A patent/CN102043659A/zh not_active Withdrawn
-
2011
- 2011-03-25 CN CN201110073683.XA patent/CN102193811B/zh not_active Expired - Fee Related
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104823161B (zh) * | 2012-11-07 | 2018-10-09 | 皇家飞利浦有限公司 | 生成无运算符代码的编译器 |
CN104823161A (zh) * | 2012-11-07 | 2015-08-05 | 皇家飞利浦有限公司 | 生成无运算符代码的编译器 |
CN103235745B (zh) * | 2013-03-27 | 2016-08-10 | 华为技术有限公司 | 一种地址冲突检测方法及装置 |
CN103235745A (zh) * | 2013-03-27 | 2013-08-07 | 华为技术有限公司 | 一种地址冲突检测方法及装置 |
CN103955406A (zh) * | 2014-04-14 | 2014-07-30 | 浙江大学 | 一种基于超级块的投机并行化方法 |
CN108874532A (zh) * | 2017-06-01 | 2018-11-23 | 北京旷视科技有限公司 | 内存分配方法及设备 |
CN108874532B (zh) * | 2017-06-01 | 2020-11-06 | 北京旷视科技有限公司 | 内存分配方法及设备 |
CN108197027A (zh) * | 2017-12-29 | 2018-06-22 | 广州景派科技有限公司 | 软件性能优化方法、可存储介质、计算机、计算机程序 |
CN108197027B (zh) * | 2017-12-29 | 2021-07-16 | 广州景派科技有限公司 | 软件性能优化方法、可存储介质、计算机、计算机程序 |
CN110895512A (zh) * | 2018-09-13 | 2020-03-20 | 普天信息技术有限公司 | 一种内存管理方法 |
CN110471862A (zh) * | 2019-07-16 | 2019-11-19 | 杭州电子科技大学 | 一种可编程控制器的变量地址分配系统及方法 |
CN112631610A (zh) * | 2020-11-30 | 2021-04-09 | 上海交通大学 | 一种针对粗粒度可重构结构的数据重用消除访存冲突方法 |
CN112631610B (zh) * | 2020-11-30 | 2022-04-26 | 上海交通大学 | 一种针对粗粒度可重构结构的数据重用消除访存冲突方法 |
CN115826946A (zh) * | 2023-02-17 | 2023-03-21 | 苏州浪潮智能科技有限公司 | 一种程序异常向量空间优化系统、方法、设备及介质 |
Also Published As
Publication number | Publication date |
---|---|
CN102193811B (zh) | 2014-04-16 |
CN102193811A (zh) | 2011-09-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102193811B (zh) | 消除内存访问冲突的编译装置及其实现方法 | |
CN100465895C (zh) | 编译器、编译方法 | |
Simitsis et al. | Optimizing analytic data flows for multiple execution engines | |
AU2013290313B2 (en) | Method and system for automated improvement of parallelism in program compilation | |
EP2901276B1 (en) | Modernization of legacy software systems based on modeled dependencies | |
CN102750150B (zh) | 基于x86架构的稠密矩阵乘法汇编代码自动生成方法 | |
US9823911B2 (en) | Method and apparatus for compiling code based on a dependency tree | |
CN103348323A (zh) | 动态二进制优化 | |
WO2012099625A1 (en) | Architecture optimizer | |
CN103645930B (zh) | 汇编级跨文件调度框架的构建方法 | |
KR102013582B1 (ko) | 혼합 모드 프로그램의 소스 코드 오류 위치 검출 장치 및 방법 | |
CN104111818A (zh) | 用于批量线程处理的处理器、处理方法和代码生成设备 | |
Rauchwerger | Run-time parallelization: Its time has come | |
CN109189479A (zh) | 一种用于处理器指令集的并行自动化验证方法 | |
CN102289362A (zh) | 分段符号执行装置及其工作方法 | |
CN107851003A (zh) | 用于改进程序性能的字段专业化系统和方法 | |
CN105404611B (zh) | 一种基于矩阵模型的多计算引擎的自动选择方法 | |
CN104750533A (zh) | C程序编译方法及编译器 | |
Popov et al. | Piecewise holistic autotuning of compiler and runtime parameters | |
Chiba et al. | Towards selecting best combination of sql-on-hadoop systems and jvms | |
US11262989B2 (en) | Automatic generation of efficient vector code with low overhead in a time-efficient manner independent of vector width | |
CN102819419A (zh) | 指令执行流信息处理系统和装置及方法 | |
Alvanos et al. | Automatic communication coalescing for irregular computations in UPC language | |
JPWO2017204139A1 (ja) | データ処理装置、データ処理方法、およびプログラム記録媒体 | |
Rao et al. | SODA: A semantics-aware optimization framework for data-intensive applications using hybrid program analysis |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C04 | Withdrawal of patent application after publication (patent law 2001) | ||
WW01 | Invention patent application withdrawn after publication |
Open date: 20110511 |