CN112540764A - 条件转移预测方向变换的编译优化方法 - Google Patents
条件转移预测方向变换的编译优化方法 Download PDFInfo
- Publication number
- CN112540764A CN112540764A CN201910897632.5A CN201910897632A CN112540764A CN 112540764 A CN112540764 A CN 112540764A CN 201910897632 A CN201910897632 A CN 201910897632A CN 112540764 A CN112540764 A CN 112540764A
- Authority
- CN
- China
- Prior art keywords
- branch
- conditional branch
- program
- source program
- branch prediction
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3005—Arrangements for executing specific machine instructions to perform operations for flow control
- G06F9/30058—Conditional branch instructions
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开一种条件转移预测方向变换的编译优化方法,当发现因为频繁的分支预测失败带来了严重的性能损失时,执行以下步骤:S1、对源程序重新进行编译,并在编译时添加转移预测方向变换的编译优化选项;S2、对源程序进行控制流分析,并将源程序划分为若干个基本块,同时识别出包含在源程序的最内层循环的条件分支语句,并将其划分为几个独立的基本块,将第一个基本块打上分支预测失败的特殊属性;S3、在具有分支预测失败特殊属性的基本块的起始位置插入一条转移预测器方向切换指令;S4、编译器继续进行剩余的编译过程,产生目标代码。本发明可以避免嵌汇编方式带来的性能损失和潜在的错误问题,还可以提高条件转移预测准确率,达到降低性能损失的目的。
Description
技术领域
本发明涉及一种条件转移预测方向变换的编译优化方法,属于计算机编译优化技术领域。
背景技术
流水线技术是当前处理器普遍采用的一种优化技术。对于分支指令,如果没有分支预测,处理器需要等待分支指令执行结束才能将下一条指令送入流水线的第一个阶段(取指令阶段),这会造成流水线停顿,严重影响性能。分支预测的机制有很多种,转移预测位是其中的一个重要手段。当使用转移预测位进行分支预测时,其实现机制如下:如果转移预测位为“0”,则预测为不发生跳转,顺序取当前指令紧接着的下一条指令;如果转移预测位为“1”,则预测为发生跳转,取跳转目的地址的指令;反之亦然。一般情况下,转移预测位的值与条件转移指令的行为有关,例如后向转移指令(偏移量为负值)始终预测为跳转,前向转移指令始终预测为不跳转。
一般情况下对转移预测位的值的设置是固定的,不会随机发生变化。这会带来一个问题,如果条件转移指令的实际跳转情况经常与预测结果不一致,就会因为严重的流水线停顿导致性能急剧下降。为此,有些处理器提供了转移预测器方向切换指令,它可以临时一次切换条件转移指令的固定预测方向,避免分支预测失败带来的性能损失。而如何利用好转移预测器方向切换指令,则是软件方面的问题了。
对于处理器硬件提供的大量不常用的指令,编译器一般不会提供接口供用户使用。最常用的方式是通过嵌汇编插入到程序中。使用嵌汇编固然很直观,但也存在不少缺点。首先是嵌汇编的固有缺点:它会把原来完整的程序切割成互相独立的两段,影响编译器的指令调度,降低程序的性能。
对于转移预测器方向切换指令而言,它与其他指令数据均无相关性,必须加上volatile的不可优化属性才能避免被编译器优化掉,否则使用不当的话在最后生成的目标码中是没有这条指令的。此外,插入转移预测器方向切换指令的位置是否合适直接影响其作用能否有效发挥,使用嵌汇编需要程序员详细分析程序的控制流行为特征,根据实际运行结果找出分支预测经常失败的位置,这也是一个不小的工作量与挑战。
发明内容
本发明的目的是提供一种条件转移预测方向变换的编译优化方法,该条件转移预测方向变换的编译优化方法可以避免嵌汇编方式带来的性能损失和潜在的错误问题,还可以提高条件转移预测准确率,达到降低性能损失的目的。
为达到上述目的,本发明采用的技术方案是:一种条件转移预测方向变换的编译优化方法,基于以下预先设定:默认情况下,转移预测器的预测方式为,后向转移指令(偏移量为负值)始终预测为跳转,前向转移指令始终预测为不跳转;
程序编译运行后,当用户发现程序的实际运行时间与预期执行时间有较大差异时,通过gdb调试或性能计数器信息统计,进行性能分析,当发现因为频繁的分支预测失败带来了严重的性能损失时,执行以下步骤:
S1、编译器对源程序重新进行编译,并在编译时添加转移预测方向变换的编译优化选项;
S2、编译器对源程序进行控制流分析,对源程序的流程走向进行分析,并根据程序的控制流将源程序划分为若干个基本块,在编译器对源程序进行控制流分析时,编译器识别出包含在源程序的最内层循环的条件分支语句,并将该条件分支语句划分为几个独立的基本块,编译器将这几个基本块中的第一个基本块单独挑选出来,打上分支预测失败的特殊属性,以说明紧跟在此基本块之后执行的条件分支语句将会频繁预测失败;
S3、编译器在S2中挑选出来的具有分支预测失败特殊属性的基本块的起始位置插入一条转移预测器方向切换指令,使得此切换指令加入所在基本块的指令序列中,参与后续的编译过程,并给此切换指令置上volatile的特殊属性,以保证该切换指令不会在后续的编译过程中被优化删除;
S4、编译器继续进行剩余的编译过程,产生目标代码。
上述技术方案中进一步改进的方案如下:
1. 上述方案中,在S2中,对源程序的划分规则为:每一个基本块就是若干个顺序执行的代码组成的集合,不同基本块之间的跳转走向由程序的控制流决定。
2. 上述方案中,所述条件分支语句包括条件分支判断语句以及根据条件分支判断结果将要执行的不同分支语句。
由于上述技术方案的运用,本发明与现有技术相比具有下列优点:
本发明条件转移预测方向变换的编译优化方法,其通过对程序重新编译时添加额外的转移预测方向切换的选项,避免修改程序,利用处理器提供的转移预测器方向切换指令,一方面提供内部函数接口供程序员使用,在程序中合适的位置插入指令,避免嵌汇编方式带来的性能损失和潜在的错误问题,另一方面通过编译优化,在分析程序控制流特征的基础上在合适位置自动插入指令,达到修改条件转移指令的预测方向,提高条件转移预测准确率,降低性能损失的目的。
附图说明
附图1为条件分支程序的代码示例;
附图2为修改后的程序及编译产生的汇编代码示例1;
附图3为修改后的程序及编译产生的汇编代码示例2;
附图4为本发明条件转移预测方向变换的编译优化方法流程图。
具体实施方式
实施例:一种条件转移预测方向变换的编译优化方法,基于以下预先设定:默认情况下,转移预测器的预测方式为,后向转移指令(偏移量为负值)始终预测为跳转,前向转移指令始终预测为不跳转;
程序编译运行后,当用户发现程序的实际运行时间与预期执行时间有较大差异时,通过gdb调试或性能计数器信息统计,进行性能分析,当发现因为频繁的分支预测失败带来了严重的性能损失时,执行以下步骤:
S1、编译器对源程序重新进行编译,并在编译时添加转移预测方向变换的编译优化选项;
S2、编译器对源程序进行控制流分析,对源程序的流程走向进行分析,并根据程序的控制流将源程序划分为若干个基本块,在编译器对源程序进行控制流分析时,编译器识别出包含在源程序的最内层循环的条件分支语句,并将该条件分支语句划分为几个独立的基本块,编译器将这几个基本块中的第一个基本块单独挑选出来,打上分支预测失败的特殊属性,即在系统符号表里增加一个针对基本块的属性描述,以说明紧跟在此基本块之后执行的条件分支语句将会频繁预测失败;
S3、编译器在S2中挑选出来的具有分支预测失败特殊属性的基本块的起始位置插入一条转移预测器方向切换指令,使得此切换指令加入所在基本块的指令序列中,参与后续的编译过程,并给此切换指令置上volatile的特殊属性,为了实现程序语句中volatile关键字的功能,编译器在系统符号表中有volatile属性设置,对于具有该属性的变量、语句等,编译器不会将其删除或者做其它特殊的高级优化,以保证该切换指令不会在后续的编译过程中被优化删除;
S4、编译器继续进行剩余的编译过程,产生目标代码。
在S2中,对源程序的划分规则为:每一个基本块就是若干个顺序执行的代码组成的集合,不同基本块之间的跳转走向由程序的控制流决定。
上述条件分支语句包括条件分支判断语句以及根据条件分支判断结果将要执行的不同分支语句。
实施例进一步解释如下:
本发明根本目的在于通过编译器提供方便高效利用处理器提供的转移预测器方向切换指令,提高条件转移预测准确率,降低因预测失败造成的性能损失的目的。
首先给出如下预先设定:默认情况下,转移预测器的预测方式为:后向转移指令(偏移量为负值)始终预测为跳转,前向转移指令始终预测为不跳转。
下面以具体程序为例,详细说明本发明的原理,使用方式等。
对于图1给出的示例程序,for循环中包含if条件分支语句,这是许多程序中常见的用法。而在实际执行过程中,只有少数几次会进入if分支语句内部执行。
根据转移预测器的默认预测方式,条件转移指令始终预测为不跳转,即紧跟着执行后面的访存指令。然而实际情况是,绝大多数情况下,他是需要跳转执行的,分支预测失败带来了严重的流水线停顿,导致性能急剧下降。
在通过各种性能分析手段找到问题症结所在后,我们需要做的就是在条件转移指令之前插入一条转移预测器方向切换指令来临时切换一下转移预测器的预测方向。使用嵌汇编插入指令的缺点前面已经解释过了,为了避免这些缺点,本发明提供了指令的内部函数接口供程序员使用,修改后的程序代码如图2所示。
在if条件语句之前插入一条__builtin_pws()语句,这个是本发明提供的内部函数接口,编译器最终将它翻译成一条转移预测器方向切换指令,在条件转移指令之前,修改转移预测器的预测方向,预测指令为跳转。在条件转移指令执行结束后,转移预测器的预测方向仍然按照默认预测方式进行,不影响后续的跳转指令的行为。
从上面的示例中可以看出,指令的插入位置非常关键,需要程序员使用多种手段分析程序特征,找出分支预测经常失败的位置,同时也需要修改程序,比较麻烦。
本发明另外提出了一种编译优化的方法,通过编译器自动插入指令,不需要修改程序,只是在编译程序时加上一个额外的选项即可。
分支预测失败会带来流水线停顿,降低性能,但是一两次的预测失败并不会严重影响程序的整体性能。只有连续的经常性的预测失败才会给性能带来严重影响。而这种情况的发生是有特定条件的,程序必须满足一定的特征才有可能发生。通过分析多种循环体、分支语句的行为特征,我们发现,普通的循环体并不会发生这样的情况,它一般只在循环执行结束后的最后一次分支跳转预测时会预测失败;简单的只执行一次的if条件语句等也不会因为预测失败严重影响性能。只有在循环体中包含了条件分支,而该条件分支又经常性的预测失败才会对程序性能造成较大影响。图1给出的例子就符合这样的情况。这就给编译器的优化提供了可利用的空间。
在控制流分析过程中,编译器识别出包含在最内层循环中的条件分支语句,并进行标记。当程序第一遍执行发现因为分支预测失败带来了严重的性能损失后,我们不需要修改程序,只需要对程序加上转移预测方向切换的选项重新编译,编译器就会在造成分支预测失败的条件分支语句之前自动插入一条转移预测器方向切换指令,编译结束后重新运行,其效果与通过修改程序插入指令相同,也能提高条件转移预测的准确率,达到降低性能损失的目的。
采用上述条件转移预测方向变换的编译优化方法时,其通过对程序重新编译时添加额外的转移预测方向切换的选项,避免修改程序,利用处理器提供的转移预测器方向切换指令,一方面提供内部函数接口供程序员使用,在程序中合适的位置插入指令,避免嵌汇编方式带来的性能损失和潜在的错误问题,另一方面通过编译优化,在分析程序控制流特征的基础上在合适位置自动插入指令,达到修改条件转移指令的预测方向,提高条件转移预测准确率,降低性能损失的目的。
上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。
Claims (3)
1.一种条件转移预测方向变换的编译优化方法,其特征在于:基于以下预先设定:默认情况下,转移预测器的预测方式为,后向转移指令(偏移量为负值)始终预测为跳转,前向转移指令始终预测为不跳转;
程序编译运行后,当用户发现程序的实际运行时间与预期执行时间有较大差异时,通过gdb调试或性能计数器信息统计,进行性能分析,当发现因为频繁的分支预测失败带来了严重的性能损失时,执行以下步骤:
S1、编译器对源程序重新进行编译,并在编译时添加转移预测方向变换的编译优化选项;
S2、编译器对源程序进行控制流分析,对源程序的流程走向进行分析,并根据程序的控制流将源程序划分为若干个基本块,在编译器对源程序进行控制流分析时,编译器识别出包含在源程序的最内层循环的条件分支语句,并将该条件分支语句划分为几个独立的基本块,编译器将这几个基本块中的第一个基本块单独挑选出来,打上分支预测失败的特殊属性,以说明紧跟在此基本块之后执行的条件分支语句将会频繁预测失败;
S3、编译器在S2中挑选出来的具有分支预测失败特殊属性的基本块的起始位置插入一条转移预测器方向切换指令,使得此切换指令加入所在基本块的指令序列中,参与后续的编译过程,并给此切换指令置上volatile的特殊属性,以保证该切换指令不会在后续的编译过程中被优化删除;
S4、编译器继续进行剩余的编译过程,产生目标代码。
2.根据权利要求1所述的条件转移预测方向变换的编译优化方法,其特征在于:在S2中,对源程序的划分规则为:每一个基本块就是若干个顺序执行的代码组成的集合,不同基本块之间的跳转走向由程序的控制流决定。
3.根据权利要求1所述的条件转移预测方向变换的编译优化方法,其特征在于:所述条件分支语句包括条件分支判断语句以及根据条件分支判断结果将要执行的不同分支语句。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910897632.5A CN112540764A (zh) | 2019-09-23 | 2019-09-23 | 条件转移预测方向变换的编译优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910897632.5A CN112540764A (zh) | 2019-09-23 | 2019-09-23 | 条件转移预测方向变换的编译优化方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112540764A true CN112540764A (zh) | 2021-03-23 |
Family
ID=75012873
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910897632.5A Withdrawn CN112540764A (zh) | 2019-09-23 | 2019-09-23 | 条件转移预测方向变换的编译优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112540764A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116661808A (zh) * | 2023-07-26 | 2023-08-29 | 龙芯中科技术股份有限公司 | 二进制翻译方法、装置、电子设备及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103838616A (zh) * | 2014-03-05 | 2014-06-04 | 北京工业大学 | 基于树型程序分支的计算机程序即时编译方法 |
US20160103683A1 (en) * | 2014-10-10 | 2016-04-14 | Fujitsu Limited | Compile method and compiler apparatus |
-
2019
- 2019-09-23 CN CN201910897632.5A patent/CN112540764A/zh not_active Withdrawn
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103838616A (zh) * | 2014-03-05 | 2014-06-04 | 北京工业大学 | 基于树型程序分支的计算机程序即时编译方法 |
US20160103683A1 (en) * | 2014-10-10 | 2016-04-14 | Fujitsu Limited | Compile method and compiler apparatus |
Non-Patent Citations (1)
Title |
---|
白书敬 等: "《反馈式编译优化在转移预测中的研究》", 《计算机工程与应用》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116661808A (zh) * | 2023-07-26 | 2023-08-29 | 龙芯中科技术股份有限公司 | 二进制翻译方法、装置、电子设备及存储介质 |
CN116661808B (zh) * | 2023-07-26 | 2023-11-10 | 龙芯中科技术股份有限公司 | 二进制翻译方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5452457A (en) | Program construct and methods/systems for optimizing assembled code for execution | |
US8516465B2 (en) | Register prespill phase in a compiler | |
US5901308A (en) | Software mechanism for reducing exceptions generated by speculatively scheduled instructions | |
Kohn et al. | Adaptive execution of compiled queries | |
US8522220B2 (en) | Post-pass binary adaptation for software-based speculative precomputation | |
US6622300B1 (en) | Dynamic optimization of computer programs using code-rewriting kernal module | |
US5713010A (en) | Source line tracking in optimized code | |
US7861234B1 (en) | System and method for binary translation to improve parameter passing | |
US5732210A (en) | Use of dynamic translation to provide fast debug event checks | |
US6308322B1 (en) | Method and apparatus for reduction of indirect branch instruction overhead through use of target address hints | |
Suganuma et al. | A region-based compilation technique for a Java just-in-time compiler | |
US7840952B2 (en) | Method and system for generating object code to facilitate predictive memory retrieval | |
US5937191A (en) | Determining and reporting data accessing activity of a program | |
US7698697B2 (en) | Transforming code to expose glacial constants to a compiler | |
JP2000066898A (ja) | コンピュ―タ命令の実行をスケジュ―ルする方法 | |
US20090313611A1 (en) | Dynamically Patching Computer Code Using Breakpoints | |
Hiniker et al. | Improving region selection in dynamic optimization systems | |
JPH04330527A (ja) | プログラムの最適化方法及びコンパイラ・システム | |
JPH02217926A (ja) | コード生成方法 | |
Suganuma et al. | A region-based compilation technique for dynamic compilers | |
US20090019431A1 (en) | Optimised compilation method during conditional branching | |
CN105117269B (zh) | 基于向量中断的编译器的优化方法 | |
CN112540764A (zh) | 条件转移预测方向变换的编译优化方法 | |
US20060277530A1 (en) | Data hiding in compiled program binaries for supplementing computer functionality | |
Adve et al. | Changing interaction of compiler and architecture |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WW01 | Invention patent application withdrawn after publication | ||
WW01 | Invention patent application withdrawn after publication |
Application publication date: 20210323 |