CN103530471B - 一种基于模拟器的关键路径分析方法 - Google Patents
一种基于模拟器的关键路径分析方法 Download PDFInfo
- Publication number
- CN103530471B CN103530471B CN201310504546.6A CN201310504546A CN103530471B CN 103530471 B CN103530471 B CN 103530471B CN 201310504546 A CN201310504546 A CN 201310504546A CN 103530471 B CN103530471 B CN 103530471B
- Authority
- CN
- China
- Prior art keywords
- function
- branch
- node
- time
- execution
- 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.)
- Expired - Fee Related
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于模拟器的关键路径分析方法,该方法包括以下步骤:通过模拟器统计、计算每一个分支节点在不同分支路径上的执行概率,其中分支节点对应访问链上的各节点,以及各函数发生函数调用的分支概率;记录一条访问链中上一节点到下一节点的执行时间;依次叠加执行时间到出口函数为止;统计程序中给分支发生跳转的概率;根据分支概率、执行时间的长度,选择关键路径。本发明实现简单、通过模拟器实现、不依赖于硬件平台、可较高效率完成关键路径分析。
Description
技术领域
本发明涉及程序性能分析技术,尤其涉及一种基于模拟器的关键路径分析方法。
背景技术
集成开发环境(Integrated Development Environment,IDE)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。
现有的集成开发环境,如微软的Visual Studio系列等,它们运行的底层硬件平台均提供了用于程序性能数据反馈的专用指令,并依托于编译器对目标源程序进行代码插桩(Code Instrumentation),然后依托处理器硬件平台的计算完成分支概率与关键路径的统计分析。
现有技术提出的关键路径的统计方法的不足之处在于,如果当前目标机不提供用于性能反馈的专用指令,那么上述软硬件协同的统计分析方法就很难被实施。
发明内容
本发明的目的是为了解决上述现有技术存在的不足之处,提供了一种实现简单、执行效率高,且不依赖底层硬件平台的关键路径分析方法。
为实现上述目的,本发明提供了一种基于模拟器的关键路径分析方法,该方法包括以下步骤:
通过模拟器统计、计算每一个分支节点在不同分支路径上的执行概率,其中分支节点对应访问链上的各节点,以及各函数发生函数调用的分支概率;
记录一条访问链中上一节点到下一节点的执行时间;
依次叠加执行时间到出口函数为止;
根据分支概率、执行时间的长度,选择关键路径。
本发明实现简单、通过模拟器实现,脱离硬件平台、可较高效率完成关键路径分析。
附图说明
图1为跳转表结构示意图;
图2为本发明实施例提供的一种基于模拟器的关键路径分析方法流程图;
图3为时间戳流程示意图;
图4为伪指令插桩示意图;
图5为函数名与程序指针的映射关系。
具体实施方式
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
本发明实施例通过配合伪指令可较高效率完成关键路径分析,伪指令是按照目标处理器指令集编码格式独立设计且只运行于模拟平台上的指令。伪指令实现简单并提供额外功能来辅助数据统计与分析。尽管,每种处理器平台具备独特的指令编码格式,但只要根据表1所示的指令编码格式(其中Opcode、Flag、Operand占用的位置根据目标指令集编码格式而定),对离散分布的指令操作码(Opcode)的位宽、取值进行合理设置,就可以避免潜在的冲突。
表1伪指令编码格式
Opcode | Flag | Operand | Opcode |
… | … | … | … |
其中,标志位Flag用于区分各条伪指令,Operand用于存储伪指令操作时所需的操作数,下表2为本发明实施例关键路径分析时所定义的3条伪指令。
表2伪指令定义
指令名称 | 应用范围 |
Leaf | 关键路径分析 |
Interior | 关键路径分析 |
RootOver | 关键路径分析 |
分支概率统计是从统计学角度,根据程序局部性原理,利用现有数据激励来对应用程序中各分支控制流的走向进行预测,它被广泛应用于全局指令调度,硬件转移预测等算法中。通常分支概率是在编译优化之前完成,编译器首先将高级语言切割为多个基本块并构成控制流图,然后通过性能剖析实现对控制流图的概率加权。本发明实施例提出的实现方法由于是基于模拟器实现,因此,对分支概率的统计等价于对分支指令执行概率的统计。
计算分支指令执行概率时,模拟器需要为每条分支指令提供独立的计数器,并在运行时记录它们是否被执行,而模拟器判断分支指令与计数器之间的一对一的映射关系时只能依赖分支指令对应程序计数器的值或指令存储地址,因此,模拟器中流水线开始执行前必须确定各分支指令在存储系统中被分配的地址,这在本发明实施例中是配合汇编器和链接器来实现,但并不限于此。一般来说,应用程序中的分支指令通常占据较大比重,如果在运行时进行顺序判断,算法复杂度将为O(n)(n为取得指令数,模拟执行时n值通常很大),如此庞大的时间开销势必影响动态分析的执行效率,这是难以接受的,因此,如何降低分支判断的算法复杂度成为了关键因素。哈希算法通常是解决这类问题的首选,然而,分支指令在地址空间上一般离散分布的,直接对它们的内存地址进行哈希所带来的存储空间浪费是十分庞大。诸如Visual Studio等集成的编译器框架,Intel等公司提供的X86/X64架构均配置跳转表结构来集中处理分支指令,尽管绝大多数处理器平台中并未采用该结构,但却可以通过在汇编期对比汇编代码进行修改并建立已有分支指令与跳转表内分支指令间一一映射关系来实现,这样对分支概率的统计就等价于对跳转表内分支指令执行概率的统计,而由于跳转表内的分支指令在地址空间上是连续分布的,全散列哈希算法将不会导致存储空间的浪费。图1展示了添加跳转表前后程序结构发生的变化,可以看到整个过程中仅需修改已有分支指令的目标地址,链接期只需为跳转表分配恰当的地址空间即可满足使用,整个过程中对应用程序的额外开销为O(n)(n为应用程序执行的分支指令总数),这样的开销是可以接受的。
跳转表建立完成后,它的各个表项将对应于一个独立的计数器,即可建立如下全散列哈希函数,其中,address代表跳转表地址空间中的首地址,ireg是跳转表内每条分支指令的存储地址,value为对应计数器的指针,这种算法的时间复杂度为O(1),效率最高。
value=hash[(ireg-address)/4]
函数是一个由多个语句块组成,用于描述特定功能的代码区域,高级程序设计语言无一例外的提供了对函数调用的支持。C语言下的应用程序通常是由多个函数组成,避开操作系统,main函数一般可认为是入口函数,用于异常处理的出口函数以及多个节点函数,其中不再发生函数调用的节点函数又被称作叶子函数。叶子函数分为以下两种,静态代码本身就不存在函数调用指令;动态执行时,由于数据激励诱发的函数调用指令不执行。从入口函数途经节点函数到达出口函数或叶子函数过程中,应用程序的执行轨迹或控制流路径就是由反复进行的压栈和入栈操作构成的访问链。本发明实施例提供的关键路径分析方法(如图2所示)是通过计算访问链中各个子路径的处理器执行时间,根据执行时间的长度,分支节点执行概率,选择关键路径,并以此作为评估依据找出应用程序中的性能瓶颈,最终交由程序员或优化工具挖掘出可再次优化的部分。关键路径分析时是以函数为最小处理单位,这源于函数内基本块间路径无法放映应用程序的整体性能。
路径剖析(Programs Profiling)在动态分析领域占据十分重要的地位,它用于分析、统计应用程序中全部执行路径以及各路径的执行次数,这些性能数据被广泛的应用在编译优化等多项研究工作中,关键路径分析就是路径剖析的一种应用。现有技术进行路径剖析的方案较为统一,基本都是结合控制流图CFG(Control Flow Graph)分析向应用程序中插入桩代码,最后回收、计算桩代码统计的性能信息来得出各条路径及执行次数。现有方案中,面向无回边(backedge)路径时,Ball等人提出的过程内单变量剖析方法EPP(efficient path profiling),面向环路路径时Tallam提出的近似剖析方法以及Roy等提出的改进方法都在路径剖析上取得较佳效果。然而,当应用程序结构相对复杂、循环体较多时,这些方法仍有不足,归其原因,不难发现它们均是从高层语言的行为级处理,并受限于语义分析前端以及目标处理器的指令功能,无法进一步扩展应用范围。本发明实施例中关键路径分析部分仍是基于模拟器实现,它的优势不仅是可在不影响程序逻辑的条件下从行为级强化部分指令,而且从指令级进行代码插桩时也更加灵活。与现有技术不同的是,本发明是依据平均执行时间来评估执行路径的复杂度。
处理器指令集中一般提供函数调用类指令Call、Calli,以及函数返回类指令Ret。在此基础上,本发明在模拟器中提供下列功能来辅助关键路径的分析:
(1)、建立全局时钟,所述全局时钟用于在流水线运行时根据每个指令并行包中指令的最大执行周期数计算当前时间点time:
(2)建立函数调用、返回函数时的时间戳(Time Stamp),当函数被调用时,将所述当前时间点压入栈结构中,当目标函数执行完成后,则返回,栈结构执行一次出栈操作并将结果赋值给所述全局时钟。
集成开发环境Visual Studio统计函数执行时间时是通过编译器向目标函数的入口基本块和出口基本块中添加首尾时间戳,它最终获取的是PC机中CPU的硬件执行时间。本发明实施例是依托于模拟器平台实现性能分析的,指令功能是由高级语言层描述,因此,本发明实施例并不利用编译器进行时间戳插桩,而是通过修改Call、Calli以及Ret指令的功能描述完成时间戳的添加。图3(a)展示一条完成的访问链,实线部分代表函数间的逐层调用,虚线部分代表访问链到达叶子函数后的逐层返回,当发生函数调用时,将当前时间点time(i),即total_cycle的值被压入栈结构TimeStack中,当目标函数执行完成后,执行Ret指令发生返回,TimeStack执行一次出栈操作并将结果赋值给total_cycle,整个过程如图3(b)所示,图3(c)中为修改函数调用、函数返回指令功能的伪代码。
(3)、判断当前函数是否为叶子函数或出口函数。叶子函数是指不再发生函数调用的节点函数。叶子函数分为以下两种,静态代码本身就不存在函数调用指令;动态执行时,由于数据激励诱发的函数调用指令不执行。程序执行完叶子函数或出口函数时代表一条路径的结束,因此,模拟执行时需提供判断机制来识别当前函数是否为叶子函数或出口函数。由于静态分析并不能明确一个函数是否为叶子函数,因此需获得动态分析的辅助。为此,本发明实施例添加了三条伪指令Leaf,Interior,RootOver,它们Operand的值均默认为0。模拟器中添加一个全局bool型变量WhetherLeaf,为true时代表进入叶子函数,为false时代表为非叶子函数。Leaf和Interior指令就是用于修改变量WhetherLeaf的值,Leaf将WhetherLeaf置false,Interior则相反,RootOver伪指令用于关键路径输出。汇编期处理时,在每个函数的入口基本块内添加Leaf指令;函数内每条函数调用指令之后添加Interior指令,且推断寄存器与函数调用指令一致;函数内的函数返回指令之前添加RootOver指令,推断寄存器同样为Pr0。因此,一旦进入目标函数,WhetherLeaf将被置为true,当函数调用指令被执行后WhetherLeaf的值则被置为false,这样在动态执行过程中即可明确路径是否执行到叶子函数,下图4显示了这三条伪指令的插桩方式。
(4)、建立函数名与程序指针的映射。虽然各种形式的可执行文件中提供了函数名称信息,但模拟器执行状态下进行反复判断、读取势必影响性能,因此,本发明实施例添加伪指令FuncName来辅助函数名称的读取,它的编码格式与上述三条伪指令一致,Flag的值为4,21位Operand用于检索函数名。图5展示了全部的流程,首先,汇编文件处理时将伪指令FuncName插入各函数入口基本块,Operand的值与预处理表中的顺序一致。其次,在模拟器中建立数据结构MapTable_t,加载预处理表后建立映射表MapTable,最后,模拟器提供全局unsigned int型变量MapPoint,执行FuncName指令时将Operand的值赋给MapPoint。
(5)、关键路径输出。
具体地,当程序运行到叶子函数时,需沿路输出路径中的各个节点,前文提到的伪指令RootOver就是为了实现这一功能。通常,操作系统中建立栈区来保存应用程序的活动记录,软件实现时则需定义相应的栈结构即可获取函数调用关系,StackTable为本发明实施例跟踪活动记录时定义的数据结构,其中MAX_STACK_LEVEL代表目标平台上支持的最大栈访问深度,有符号整型变量call_stack_idx初始值为-1,用于指向软件调用栈call_stack。程序运行时出现函数调用时,当运行到FuncName伪指令时将函数调用指令地址、映射表的索引值构建成StackTable变量后一起存储入call_stack中,call_stack_idx加1。当出现函数返回时,call_stack_idx减1。
表3、StackTable数据结构
当执行RootOver指令时,首先判断WhetherLeaf变量是否为true,否则直接退出。尽管函数之间不可避免的存在递归、相互间的嵌套调用以及同一函数在不同代码块可能调用相同的目标函数,但call_stack_idx的伴随着出栈、压栈操作反复累加、递减已删除冗余,因此,输出路径时只需按照call_stack_idx顺序输出call_stack内MapIdx的值并完成函数名的映射,而total_cycle计算出的时间点是运行时的时间开销。下述为Mp3decoder测试集中一条关键路径的示例:
Time:1.312s
Loader->main->decodeAACfile->NeAACDecDecode->aac_frame_decode->output_to_PCM->to_PCM_16bit
(6)、函数调用路径输出。
具体地,每个函数在执行时可被如函数指针等多种途径调用,这些在静态分析中无法获取。函数间的调用关系分布于各关键路径之中,因此,只需在Leaf指令中添加额外功能即可。Leaf指令读取当前StackTable中已有函数的MapIdx值形成单向链表,判断是否已经存在重复路径,如果存在,考虑到每条路径下执行时间可能不一致,只能通过计算出平均时间来反应路径开销,计算公式为n为路径总数,Time(i)为路径i的执行时间。
程序员可根据评估出应用程序执行时的关键路径以及函数的各调用路径的时间代价,从算法的角度进一步优化来提高程序最终的执行效率。
显而易见,在不偏离本发明的真实精神和范围的前提下,在此描述的本发明可以有许多变化。因此,所有对于本领域技术人员来说显而易见的改变,都应包括在本权利要求书所涵盖的范围之内。本发明所要求保护的范围仅由所述的权利要求书进行限定。
Claims (5)
1.一种基于模拟器的关键路径分析方法,其特征在于:
通过模拟器统计、计算每一个分支节点在不同分支路径上的执行概率,其中分支节点对应访问链上的各节点,以及各函数发生函数调用的分支概率;
通过第一伪指令、第二伪指令和第三伪指令获取访问链,记录一条访问链中上一节点到下一节点的执行时间;
其中,所述访问链是目标源代码中,由函数之间逐层调用关系构成的链状结构,代表了从入口函数到出口函数或叶子函数的一条完整访问路径,所述叶子函数通过第一伪指令和第二伪指令的插桩方式来判断,所述第一伪指令在每个函数的入口基本块内添加,所述第二伪指令在函数内每个函数调用指令之后添加,所述完整访问路径是通过第三条伪指令的插桩方式来判断,所述第三条伪指令在每个函数的返回处添加;所述第一伪指令为Leaf指令,所述第二伪指令为Interior指令,所述第三伪指令为RootOver指令;
依次叠加执行时间到出口函数为止;
根据分支概率、执行时间的长度,选择关键路径。
2.根据权利要求1所述的方法,其特征在于,所述记录一条访问链中上一节点到下一节点的执行时间步骤包括:
建立全局时钟,所述全局时钟用于根据每个指令并行包中指令的最大执行周期数计算当前时间点;
当函数被调用时,将所述当前时间点压入栈结构中,当目标函数执行完成后,则返回,所述栈结构执行一次出栈操作并将结果赋值给所述全局时钟。
3.根据权利要求1所述的方法,其特征在于,所述依次叠加执行时间到出口函数为止步骤包括:
建立函数时间戳步骤,通过时间戳保留当前时间点,当调用其它函数时可恢复到当前时间。
4.根据权利要求1所述的方法,其特征在于,在所述根据分支概率、执行时间的长度,选择关键路径步骤之前还包括统计程序中分支跳转发生的概率步骤,该步骤为:
建立分支跳转表,将源程序中的每条分支指令与跳转表内的跳转指令一一对应;
为跳转表内的跳转指令分配独立的计数器,并统计它们被执行的概率;
分支概率的统计等价于对跳转表内的跳转指令执行概率的统计。
5.根据权利要求1所述的方法,其特征在,所述根据分支概率、执行时间的长度,选择关键路径步骤包括:
当程序运行到叶子函数或出口函数时,计算沿路径输出路径中的各个节点的执行时间;
根据所述各路径的执行时间长度,确定关键路径。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310504546.6A CN103530471B (zh) | 2013-10-23 | 2013-10-23 | 一种基于模拟器的关键路径分析方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310504546.6A CN103530471B (zh) | 2013-10-23 | 2013-10-23 | 一种基于模拟器的关键路径分析方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103530471A CN103530471A (zh) | 2014-01-22 |
CN103530471B true CN103530471B (zh) | 2017-03-08 |
Family
ID=49932478
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310504546.6A Expired - Fee Related CN103530471B (zh) | 2013-10-23 | 2013-10-23 | 一种基于模拟器的关键路径分析方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103530471B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11636122B2 (en) * | 2015-12-30 | 2023-04-25 | Futurewei Technologies, Inc. | Method and apparatus for data mining from core traces |
CN109690536B (zh) * | 2017-02-16 | 2021-03-23 | 华为技术有限公司 | 将多核指令踪迹从虚拟平台仿真器取到性能模拟模型的方法和系统 |
CN111104335B (zh) * | 2019-12-25 | 2021-08-24 | 清华大学 | 一种基于多层次分析的c语言缺陷检测方法及装置 |
CN113762851A (zh) * | 2020-11-11 | 2021-12-07 | 北京京东乾石科技有限公司 | 物料拣选方法、设备、系统以及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6170083B1 (en) * | 1997-11-12 | 2001-01-02 | Intel Corporation | Method for performing dynamic optimization of computer code |
CN102144222A (zh) * | 2008-07-02 | 2011-08-03 | 国立大学法人东京工业大学 | 执行时间估计方法、执行时间估计程序以及执行时间估计装置 |
CN102708045A (zh) * | 2012-04-13 | 2012-10-03 | 电子科技大学 | 一种缓解路径爆炸的动态符号执行方法 |
CN102779296A (zh) * | 2012-06-21 | 2012-11-14 | 浙江工商大学 | 基于活动和资源相结合的过程执行成本测定方法 |
-
2013
- 2013-10-23 CN CN201310504546.6A patent/CN103530471B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6170083B1 (en) * | 1997-11-12 | 2001-01-02 | Intel Corporation | Method for performing dynamic optimization of computer code |
CN102144222A (zh) * | 2008-07-02 | 2011-08-03 | 国立大学法人东京工业大学 | 执行时间估计方法、执行时间估计程序以及执行时间估计装置 |
CN102708045A (zh) * | 2012-04-13 | 2012-10-03 | 电子科技大学 | 一种缓解路径爆炸的动态符号执行方法 |
CN102779296A (zh) * | 2012-06-21 | 2012-11-14 | 浙江工商大学 | 基于活动和资源相结合的过程执行成本测定方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103530471A (zh) | 2014-01-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Callahan et al. | Instruction-level parallelism for reconfigurable computing | |
Liem | Retargetable Compilers for Embedded Core Processors: Methods and Experiences in Industrial Applications | |
Stappert et al. | Efficient longest executable path search for programs with complex flows and pipeline effects | |
JP5717015B2 (ja) | アーキテクチャ・オプティマイザ | |
CN103530471B (zh) | 一种基于模拟器的关键路径分析方法 | |
CN103577242B (zh) | 针对已调度汇编代码的控制流图重构方法 | |
CN103329097A (zh) | 工具生成器 | |
Falk et al. | Source code optimization techniques for data flow dominated embedded software | |
Lorenz et al. | Energy aware compilation for DSPs with SIMD instructions | |
Prokesch et al. | A generator for time-predictable code | |
Cook | The Amalgam Compiler Infrastructure | |
Goswami et al. | Machine learning based fast and accurate High Level Synthesis design space exploration: From graph to synthesis | |
Kumar | Estimation of an early wcet using different machine learning approaches | |
Mizuno et al. | Design methodology and system for a configurable media embedded processor extensible to VLIW architecture | |
CN101727513A (zh) | 一种超长指令字处理器的设计和优化方法 | |
Van Praet et al. | Processor modeling and code selection for retargetable compilation | |
CN102662720A (zh) | 一种多发射嵌入式处理器编译器的优化方法 | |
US20230116546A1 (en) | Method for compilation, electronic device and storage medium | |
Posadas et al. | Single source design environment for embedded systems based on SystemC | |
Hohenauer et al. | C Compilers for ASIPs | |
Hammond et al. | Towards formally verifiable resource bounds for real-time embedded systems | |
Du et al. | Scope-aware data cache analysis for OpenMP programs on multi-core processors | |
Jeanmougin et al. | Warp-Level CFG Construction for GPU Kernel WCET Analysis | |
Marin et al. | Application insight through performance modeling | |
Wong | Parallel evaluation of functional programs |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170308 Termination date: 20201023 |
|
CF01 | Termination of patent right due to non-payment of annual fee |