首页 / 程序优化方法

程序优化方法无效专利 发明

技术领域

[0001] 本发明涉及缩短程序的执行时间的编译方法,更具体地,涉及基于抑制因高速缓存未命中而引起的性能下降的编译器的程序优化方法。

相关背景技术

[0002] 本申请在此将2008年7月22日申请的日本专利申请2008-188386号的包括说明书、附图、权利要求书在内的全部内容作为参考,并纳入到本说明书中。
[0003] 近年来,CPU的处理能力有所提高,因此,为了缩短程序的执行时间,缩短存储器访问所需的时间就变得重要。
[0004] 作为缩短存储器访问所需时间的方法之一,目前广泛已知一种使用高速缓冲存储器的方法。在访问处理中程序具有局部性,这就是通过使用高速缓冲存储器能够缩短存储器访问所需时间的原因。
[0005] 访问处理中的局部性包括:
[0006] ·时间局部性(在不久的将来访问相同的数据的可能性高)、以及[0007] ·空间局部性(在不久的将来访问附近的数据的可能性高)。
[0008] 由于程序具有这种访问处理中的局部性,因此存储在高速缓冲存储器中的数据可被视为在不久的将来被访问的可能性高。因此,如果将能够比主存储器更高速被访问的存储器使用于高速缓冲存储器,则能够明显缩短存储器访问所需的时间。
[0009] 在具有高速缓冲存储器的计算机系统中,如果在程序执行过程中发生高速缓存未命中(キヤツシユミス),则程序的执行时间延长。因此,在按照地址顺序执行一系列的命令代码时,或者重复执行纳入高速缓冲存储器范围的命令代码时,存储命令代码的高速缓冲存储器的功效会变大。但是,在现实的程序中,基于处理性能、程序的开发效率、存储器大小的限制、程序的可读性等原因,会使用分支、循环、子程序等结构。因此,在执行现实的程序时,无法完全地抑制高速缓存未命中的发生。
[0010] 作为抑制因高速缓存未命中而引起的性能下降的方法之一,已知一种在正在执行的程序中预先将不久的将来被执行的可能性高的数据预取(プリフエツチ)到高速缓冲存储器中的方法。为了提高预取的效果,该方法会在执行程序之前,对程序中的分支和循环的重复次数等进行解析,执行对高速缓存未命中进行预测的处理。但是,由于分支目的地和循环的重复次数等是在程序执行过程中动态确定的,因此,在多数情况下,在程序执行前的静态解析中无法正确地进行预测。如此,在基于程序的静态解析结果进行预取的方法中,存在对高速缓存未命中的预测易于产生错误的问题。
[0011] 另外,作为更有效地抑制因高速缓存未命中而引起的性能下降的方法,提出了一种在执行基于编译器的程序优化时,使用程序的动态解析结果(以下称为轮廓(プロフアイル)信息)的方法。例如,在专利文献1中,公开了一种虚拟执行程序的一次编译结果来计算出轮廓信息,根据计算出的轮廓信息进行二次编译的方法。据此,在专利文献1中,能够取得在合适的位置插入有预取命令的目标文件。
[0012] 专利文献2中公开了一种基于轮廓信息,使带条件的分支命令中的分支方向具有侧重性的方法。另外,专利文献3中公开了一种提高利用了空间局部性的高速缓存效率的方法。
[0013] 专利文献1:日本特开平7-306790号
[0014] 专利文献2:日本特开平11-149381号
[0015] 专利文献3:日本特开2006-309430号
[0016] 但是,在各专利文献所公开的现有方法中,需要取得程序的动态解析结果即轮廓信息。为了取得上述信息,剖析(プロフアイリング)的算法和编译器需要特殊的方法,为此,需要高度的技术和累积了经验的分析技术。
[0017] 另外,在利用了空间局部性的现有方法中,在系统运行时的运行和多个任务的运行中,未运行的处理部分的源代码有时会被配置在高速缓冲存储器中。但如果这样,配置在高速缓冲存储器中的源代码会阻碍在高速缓冲存储器中配置必要的处理。

具体实施方式

[0039] 下面,对将由某高级语言描述的程序(以下称为高级语言程序)转换为由某机器语言描述的程序(以下称为机器语言程序)的编译器,以及由该编译器执行的程序优化处理进行说明。此外,在本发明中,处理块表示用高级语言书写的具有某功能的一个函数或在高速缓冲存储器上用一个以上的命令代码书写的命令代码的集合,与表示由编译器生成的机器语言程序的命令代码为不同的概念。
[0040] 机器语言程序由具有高速缓冲存储器的计算机执行。如果机器语言程序不包含分支和/或子程序调用等,并被连续地配置在地址空间内的一个区域中,则较少发生高速缓存未命中,因高速缓存未命中而引起的性能下降也不会造成很大问题。但是,现实的机器语言程序包含分支和/或子程序调用等,并被分割配置在地址空间内的多个区域中。因此,当执行机器语言程序时,因高速缓存未命中而引起的性能下降就会造成问题。
[0041] 在以下所示的各实施方式中,本发明被实施于编译器中,所述编译器在将包含多个处理任务和/或多个运行模式的高级语言程序转换为机器语言程序的同时,执行程序优化处理,所述程序优化处理用于确定包含在机器语言程序中的命令代码的配置位置。在各实施方式中,对在包含多个处理任务和/或多个运行模式的高级语言程序的优化处理中实施本发明的方式进行说明。此外,在以下的说明中,使用C语言作为高级语言的例子,但高级语言以及机器语言的种类可以是任意种类。
[0042] (第一实施方式)
[0043] 参考图1A~图5,对本发明的第一实施方式所涉及的基于编译器的程序优化方法的执行例进行说明。图1A、图1B是示出在高速缓冲存储器的行上配置包含在机器语言程序中的命令代码的情况的图。图1A、图1B所示的命令代码相当于由图2所示的流程图表示的处理。图2所示的处理中示出多个处理任务(或多个运行模式)各自的处理块。如图1A等所示,相当于该处理的命令代码包含相当于各处理块的命令代码。
[0044] 图1A、图1B中分别记载了在高速缓冲存储器的两路(ウエイ)上配置命令代码的情况。图1A中包括分别配置了多个处理块的两路。配置在各路上的多个处理块在不相同(不同)的处理任务(或多个运行模式)下进行处理。以下将这种处理块的配置称为第一配置。第一配置通过现有的编译器获得。
[0045] 图1B中虽然包括分别配置了多个处理块的多路,但是配置在各路上的多个处理块在相同的处理任务(或相同的运行模式)下进行处理。以下将这种处理块的配置称为第二配置。第二配置通过本实施方式所涉及的编译器获得。第二配置与第一配置不同,多个处理任务(或多个运行模式)的处理块被覆盖配置在高速缓存的路上。
[0046] 下面,假设计算机执行机器语言程序时执行以行为单位的预取,来对本实施方式进行说明。换言之,视为在读出某命令代码时发生了高速缓存未命中的情况下,包含该命令代码的一行部分的命令代码从主存储器被传送到高速缓冲存储器,来进行本实施方式的说明。
[0047] 在上述条件下,对发生的高速缓存未命中进行说明。在第一配置(图1A)下依次执行处理时,在高速缓冲存储器中预取有相当于处理任务A(或运行模式A)中的处理A-1的处理块的命令。但是,接着在执行相当于处理任务A(或运行模式A)中的处理A-2的处理块的命令时,相当于处理A-2的处理块的命令未被存储在高速缓冲存储器内。因此,在该时刻有可能发生高速缓存未命中。如此,当发生高速缓存未命中时,处理A-2和处理A-3从主存储器被传送到高速缓冲存储器。这样在第一配置下,由于未被处理(没有相关关系)的处理任务B(或运行模式B)涉及的处理块,导致处理任务A(或运行模式A)涉及的一系列处理发生高速缓存未命中。
[0048] 另一方面,在第二配置(图1B)下,在执行处理任务A(或运行模式A)涉及的处理时,高速缓冲存储器中预取有处理A-1、处理A-2以及处理A-3,在处理A-1之后执行处理A-2时,处理A-2已存储在高速缓冲存储器内。因此,处理任务A(或运行模式A)涉及的一系列处理不会发生高速缓存未命中。如此,在第二配置下不发生高速缓存未命中。
[0049] 如果程序开发者根据图2A、图2B的流程图进行如现有那样的编程,则能够获得图3A所示的高级语言程序。如果由现有的编译器处理该高级语言程序,则能够获得图3B所示的机器语言程序。在该机器语言程序中,处理任务A(或运行模式A)的处理块与处理任务B(或运行模式B)的处理块被混杂在一起配置。如此,在如现有那样的编程中,如果在高级语言程序内的处理的记载中,存在有对机器语言程序来说不合适的部分,则在生成的机器语言程序的命令代码(这相当于高级语言程序内的上述处理)的配置中,相当于处理任务A、B等涉及的处理(具体而言相当于该处理的命令代码)的命令代码在高速缓冲存储器内被混杂在一起存储的可能性增高。在这种状态下,易于发生高速缓存未命中。
[0050] 在本实施方式中,当编写包含多个处理任务(或多个运行模式)的高级语言程序时,程序开发者将相互具有下述关系的处理块组指定为没有相关关系(没有交叉运行关系)的处理块组(以下称为第一处理块组)。上述关系是指由是否在一系列的处理序列内被执行所确定出的关系,未在一系列的处理序列内被执行的处理块组被看做是没有相关关系并包含在上述的第一处理块组中。相反,在一系列的处理序列内被执行的处理块组被看做是具有相关关系并包含在上述的第一处理块组以外的处理块组(以下称为第二处理块组)中。此外,作为一系列的处理序列,包含有相同的任务、或不同时处理的运行模式等。
[0051] 下面进行具体说明。如图4A所示,程序开发者使用#pragma预处理指令(プリプロセツサデイレクテイブ)来指定第一处理块组。该#pragma预处理指令具有调用#pragma预处理器的功能。在这里,第一处理块组为具有下述条件的处理块组。即,[0052] ·参数为_uncorrelated_ON(没有相关关系的指定为“开”)的#pragma预处理指令与
[0053] ·参数为_uncorrelated_OFF(没有相关关系的指定为“关”)的#pragma预处理指令
[0054] 之间所夹的处理块被判定为包含在第一处理块组中。具有这种配置关系的#pragma预处理指令相当于用于指定包含在高级语言程序中的处理块的相关关系(交叉关系)的描述。
[0055] 如果用本实施方式所涉及的编译器来处理如图4A所示的高级语言程序,则能够获得图4B所示的机器语言程序。由该机器语言程序执行处理任务A(或运行模式A)涉及的处理时,位于处理A-1之后的命令代码(这里为处理A-2)在高速缓冲存储器中被配置在紧接处理A-1之后。其结果是机器语言程序中的处理A-1~A-3被配置在与高级语言程序中的描述配置不同的位置上。在本实施方式中,紧接在如此抽出的第一处理块组中所包含的任意命令代码之后,不配置包含在第一处理块组(相互没有相关关系)中的其他命令代码,而在这里配置包含在第二处理块组(相互具有相关关系)中的命令代码。包含在第一处理块组中的其他命令代码被配置在其他程序位置上。据此,相当于处理任务A(或运行模式A)涉及的一系列处理的命令代码同时被存储在高速缓冲存储器上。由此,能够抑制高速缓存未命中的发生。
[0056] 下面参考图5,对本实施方式所涉及的编译器的结构进行说明。图5是示出本实施方式所涉及的编译器的整体结构的图。如图5所示,本实施方式所涉及的编译器包括翻译部10和连接部20。翻译部10根据输入的源文件1生成目标文件2。连接部20根据生成的目标文件2生成可执行文件3。源文件1中记录有高级语言程序,目标文件2和可执行文件3中记录有机器语言程序。
[0057] 翻译部10执行预处理指令解析步骤S11、分支结构处理步骤S12以及命令代码生成步骤S13。在预处理指令解析步骤S11中,从记录在源文件中的高级语言程序中抽出用于指定处理块的相关关系(交叉关系)的#pragma预处理指令。在分支结构处理步骤S12中,基于处理块的相关关系(交叉关系)的指定(第一处理块组的指定)生成分支命令。在命令代码生成步骤S13中,在生成除了由分支结构处理步骤S12生成的分支命令之外的命令代码之后,配置命令代码以使具有相关关系(具有交叉关系)的命令代码连续。生成的命令代码作为链接前的机器语言程序被记录在目标文件中。
[0058] 此外,分支结构处理步骤S12与命令代码生成步骤S13相当于范围确定步骤与配置确定步骤,所述范围确定步骤根据包含在高级语言程序中的描述,确定机器语言程序的一个程序部分为实施优化的处理范围,所述配置确定步骤确定位于处理范围内的命令代码的配置位置。此外,为使具有相关关系的处理块(包含在第二处理块组中的处理块)连续,根据分支命令进行排序,并进行最终的配置确定的处理(确定更加效率化的位置的处理)将在后述的第二实施方式的图6的步骤S34中执行。
[0059] 连接部20执行连接步骤S21。在连接步骤S21中,对记录在目标文件2中的链接前的机器语言程序实施链接处理。链接后的机器语言程序被记录在可执行文件3中。
[0060] 如上所示,在本实施方式所涉及的编译器中,如果输入的高级语言程序中包含有用于指定上述的第一处理块组的描述,则紧接在该第一处理块组中所包含的任意处理块之后,并不配置包含在该第一处理块组中的其他处理块。
[0061] 充分理解高级语言程序的运行的程序开发者了解正在开发的程序中包含在第一处理块组中的处理块。因此,在多数情况下,程序开发者能够正确指定作为第一处理块组的处理块。程序开发者在编写高级语言程序时,例如如下所示指定第一处理块组。即,假设使再生系处理与记录系处理在相互独立的运行模式下运行的情况。在这种情况下,当编写的程序中包含有再生系处理所需的处理块与记录系处理所需的处理块时,程序开发者将再生系所需的处理块与记录系所需的处理块指定为第一处理块组。
[0062] 本实施方式所涉及的编译器在包含在第一处理块组中的任意处理块(命令代码)之后配置分支命令,然后,在紧接在分支命令之后或附近的位置上并不配置包含在第一处理块组中的其他处理块(命令代码)。换言之,在包含在第一处理块组中的任意处理块(命令代码)之后配置分支命令,然后,在紧接在分支命令之后或附近的位置上配置包含在第二处理块组中的处理块(命令代码)。据此,能够抑制执行一系列的处理块组时易于发生的高速缓存未命中,从而能够抑制因高速缓存未命中而引起的性能下降。
[0063] (第二实施方式)
[0064] 参考图6~图8,对本发明的第二实施方式所涉及的基于编译器的程序优化方法的执行例进行说明。此外,关于用于指定包含在高级语言程序中的处理块的相关关系(交叉关系)的描述,与图4A所示的相同。
[0065] 在第一实施方式中,紧接在第一处理块组中所包含的任意命令代码(处理块)之后,并不配置包含在第一处理块组中的其他命令代码(处理块),而在这里配置包含在第二处理块组中的命令代码(处理块)。
[0066] 与此相对,在第二实施方式中,在主存储器上对这些包含在第一处理块组中的处理块进行地址配置,以使包含在第一处理块组中的处理块被分别配置在高速缓冲存储器上的同一地址。据此,因高速缓存未命中而引起的性能下降得到进一步抑制。
[0067] 为了计算出这种命令代码的配置位置,本实施方式所涉及的编译器基于包含在高级语言程序中的描述,执行将机器语言程序的一部分确定为处理范围的处理,以及对位于处理范围内的命令代码的配置位置进行确定的处理。
[0068] 下面参考图6,对本实施方式所涉及的编译器的结构进行说明。本实施方式所涉及的编译器的整体结构与第一实施方式所涉及的编译器相同(参考图5)。但是,本实施方式所涉及的编译器包括图6所示的连接部30以代替图5所示的连接部20。连接部30执行一次连接步骤S31、范围确定步骤S32、地址重复检测步骤S33、配置确定步骤S34以及配置步骤S35。另外,连接部30包括记录一次连接步骤S31的输出数据的一次可执行文件4和地址匹配信息文件5。
[0069] 在一次连接步骤S31中,对记录在目标文件2中的机器语言程序执行链接处理。据此,生成可执行的机器语言程序(链接后的机器语言程序)以及子程序和/或标签的地址信息。可执行的机器语言程序被记录在一次可执行文件4中,地址信息被记录在地址匹配信息文件5中。一次可执行文件4中还记录有在高级语言程序中对被指定为高优先级处理的处理进行确定的信息。
[0070] 在范围确定步骤S32中,基于记录在一次可执行文件4中的内容,对处理块的相关关系(交叉关系)进行解析。其结果是选择出相当于相互没有相关关系(没有交叉运行关系)的包含在第一处理块组中的处理块的命令代码,来作为处理对象。
[0071] 在地址重复检测步骤S33中,基于记录在地址匹配信息文件5中的内容,计算出包含在第一处理块组中的多个命令代码在主存储器上的地址。而且,基于计算出的地址组以及与高速缓冲存储器的结构相关的信息,从相当于包含在第一处理块组中的各个处理块的命令代码组之中,检测出其在高速缓冲存储器内的存储位置互不重复的多个命令代码。
[0072] 存在高速缓冲存储器内的存储位置不重复的多个命令代码时,在配置确定步骤S34中,确定命令代码的配置位置,以使上述多个命令代码被重复配置。在配置步骤S35中,相当于第一处理块组的命令代码组被配置在由配置确定步骤S34确定出的位置上。
[0073] 参考图7和图8,对主存储器地址与高速缓冲存储器地址的对应关系(由地址重复检测步骤S33使用)进行说明。在这里,作为例子,对利用两路组关联(2ウエイ·セツト·アソシエイテイブ)方式,行大小为32字节,总容量为8K字节的高速缓冲存储器(参考图7)进行说明。
[0074] 如果设主存储器的地址宽度为32比特,则其中低位13比特与高速缓冲存储器的地址相对应(参考图8)。高速缓冲存储器的地址被分为标签(タグ)地址的最低位比特(1比特)、索引(7比特)以及偏移量(5比特)。标签地址的最低位比特用于指定两路中的任意一个,索引用于指定行,偏移量用于指定行上的字节。
[0075] 相当于两个处理的命令代码的主存储器的地址之中,当标签地址的最低位比特加上索引一共8比特都一致时,这两个命令代码在高速缓冲存储器内被重复配置。如此,在地址重复检测步骤S33中,根据对主存储器地址的一部分是否一致的判断,能够判断出命令代码的高速缓冲存储器内的存储位置是否重复。
[0076] 因此,根据本实施方式所涉及的编译器,通过在高速缓冲存储器内将相当于第一处理块组的命令代码组配置为其地址的存储位置重复,能够抑制因高速缓存未命中而引起的性能下降。
[0077] 此外,在本发明的第一、第二实施方式中,将在高级语言程序内参数为“开”的#pragma预处理指令与参数为“关”的#pragma预处理指令之间所夹的部分指定为第一处理块组(相互没有相关关系(没有交叉运行关系)的处理块的组)。这个步骤相当于用于指定包含在高级语言程序中的第一范围的描述,即用于在机器语言程序之中选择第一范围的程序部分作为处理范围的描述。此外,作为第一处理块组的指定方法也可以使用除此之外的方法。以下,作为其他指定方法,对第一、第二其他指定方法进行说明。
[0078] (第一其他指定方法)
[0079] 在各种高级语言程序之中,具有包括以下所示的第一描述的程序。即,第一描述为用于从第一处理块组的范围之中,将虽然在第一处理块组的范围内,但是如果着眼于对构成第一处理块组的多个处理块进一步微细地进行划分后的处理部分组,则被看做是具有相关关系(具有交叉运行关系)的处理部分组抽出并指定的#pragma预处理指令。
[0080] 如果使用第一描述作为识别基准,则能够指定位于包含在高级语言程序中的第一范围内的第二范围作为处理范围。换言之,能够将在机器语言程序中相当于从第一范围中去除了第二范围的范围的程序部分指定为处理范围。
[0081] (第二其他指定方法)
[0082] 另外,在各种高级语言程序之中,具有包括以下所示的第二、第三描述的程序。即,第二描述为用于指定第二处理块组(具有相关关系(具有交叉运行关系)的处理块组)的#pragma预处理指令。第三描述为用于从第二处理块组的范围之中,将虽然在第二处理块组的范围内,但是如果着眼于对构成第二处理块组的多个处理块进一步微细地进行划分后的处理部分组,则被看做是没有相关关系(没有交叉运行关系)的处理部分组抽出并指定的#pragma预处理指令。
[0083] 如果将上述第二、第三描述用于处理范围的识别基准,则能够对[0084] ·在机器语言程序中相当于第一范围之外的范围的程序部分或者[0085] ·在高级语言程序中位于第一范围内的第二范围
[0086] 进行指定。
[0087] 即,如果将上述第二、第三描述用于识别基准,则能够指定将去除了第二范围的第一范围的部分设为范围之外的机器语言程序的程序部分为处理范围。
[0088] 上述本发明的编译器为用于使计算机执行第一、第二实施方式的优化方法的编译器,本发明的记录介质为记录有用于使计算机执行第一、第二实施方式的优化方法的编译器的计算机可读取记录介质,本发明的信息传输介质为用于经由因特网等传输用于使计算机执行第一、第二实施方式的优化方法的编译器的信息传输介质。
[0089] 本发明的基于编译器的优化方法,由于能够廉价且容易地抑制因高速缓存未命中而引起的性能下降,因此能够利用于将高级语言程序转换为机器语言程序的各种编译器。
[0090] 符号说明
[0091] 1 源文件
[0092] 2 目标文件
[0093] 3 可执行文件
[0094] 4 一次可执行文件
[0095] 5 地址匹配信息文件
[0096] 10 翻译部
[0097] 20、30 连接部
[0098] S11 预处理指令解析步骤
[0099] S12 分支结构处理步骤
[0100] S13 命令代码生成步骤
[0101] S21 连接步骤
[0102] S31 一次连接步骤
[0103] S32 范围确定步骤
[0104] S33 地址重复解析步骤
[0105] S34 配置确定步骤
[0106] S35 配置步骤

当前第1页 第1页 第2页 第3页