CN103473168A - 一种热点程序的统计方法 - Google Patents
一种热点程序的统计方法 Download PDFInfo
- Publication number
- CN103473168A CN103473168A CN2013104155384A CN201310415538A CN103473168A CN 103473168 A CN103473168 A CN 103473168A CN 2013104155384 A CN2013104155384 A CN 2013104155384A CN 201310415538 A CN201310415538 A CN 201310415538A CN 103473168 A CN103473168 A CN 103473168A
- Authority
- CN
- China
- Prior art keywords
- function
- pseudoinstruction
- data segment
- file
- statement
- 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.)
- Granted
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种热点程序的统计方法,该方法步骤包括:对源文件进行伪指令插桩,所述伪指令作为源文件中各函数的第一条指令,所述伪指令为第一伪指令,所述第一伪指令的操作数代表了各函数对应计数器在数据段中的偏移量,所述数据段用于记录各函数被访问次数和/或各函数被执行的时间;所述源文件经过编译后输出携带所述第一伪指令的目标文件,当执行所述第一伪指令时,根据所述第一伪指令中的操作数查找数据段中对应的全局计算器并加1,而在目标文件的返回指令中添加对各函数执行时间的记录;当目标文件运行完成时,根据数据段中存储的数据获取各函数被运行的次数。本发明实现简单、便于移植。
Description
技术领域
本发明涉及程序性能分析技术,尤其涉及一种热点程序的统计方法。
背景技术
程序运行时并非均衡的对每个函数、数组进行访问,约80%的运行时间花在20%的代码中。嵌入式平台上的存储资源有限,对热点程序分布的统计是为了将访问频度较高的函数、数组尽可能存储与访问速度更快的片上存储。
集成开发环境(Integrated Development Environment,IDE)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。
现有的集成开发环境,如微软的Visual Studio系列等,它们运行的底层硬件平台均提供了用于程序性能数据反馈的专用指令,并依托于编译器对目标源程序进行代码插桩(Code Instrumentation),然后依托处理器硬件平台的计算完成对热点程序与数据的统计。
现有技术的热点程序方法的不足之处在于:
1、依赖于处理器硬件平台的支持;
2、不支持对语句块执行时间的评估。
发明内容
本发明的目的是为了解决上述现有技术存在的不足之处,提供了一种实现简单、便于跨平台移植的热点程序统计方法。
为实现上述目的,本发明提供了一种热点程序的统计方法,该方法包括以下步骤:
对源文件进行伪指令插桩,所述伪指令作为源文件中各函数的第一条指令,所述伪指令为第一伪指令,所述第一伪指令的操作数代表了各函数对应计数器在数据段中的偏移量,所述数据段用于记录各函数被访问次数和/或各函数被执行的时间;
所述源文件经过编译后输出携带所述第一伪指令的目标文件,当执行所述第一伪指令时,根据所述第一伪指令中的操作数查找数据段中对应的全局计算器并加1,而在目标文件的返回指令中添加对各函数执行时间的记录;
当目标文件运行完成时,根据数据段中存储的数据获取各函数被运行的次数。
本发明实现简单、不依赖于硬件平台、可完成对语句块执行时间的评估。
附图说明
图1为本发明实施例定义的数据段.funcnt结构示意图;
图2(a)为本发明实施例提供的指令插桩流程图;
图2(b)为temp.def、映射表、funcnt.s文件格式;
图3为本发明实施例提供的统计目标语句块的执行比率的流程图。
具体实施方式
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
本发明实施例是在处理器模型的基础上讨论如何统计热点程序的统计,所研究的内容并不仅局限于统计热点函数,还提供了对代码片段进行时间开销评估的支持。评估函数被访问次数以及总执行时间是用于评估目标函数是否为热点的两个标准。
本发明实施例通过将伪指令Cnt插入汇编代码片段中来实现函数被访问次数的统计。Cnt指令的语法格式如下:
语法格式:Cnt Imm21(21位无符号数)
Cnt指令所用到的推断寄存器默认为Pr0,即确定执行。Imm21为Operand的值,代表21位的无符号数。处理器内核模型的虚拟内存系统最大为4GB,因此,为了简化对函数执行次数统计的难度,本发明实施例定义了一段占据足够字节数的数据段.funcnt,每8个字节对应于一个函数,其中,前4字节代表目标函数被访问的次数,后4字节代表函数执行的时间。尽管如此,程序设计中不能排除不同源文件中存在由static变量定义的相同函数名的可能,因此,.funcnt段中各全局计数器必须与文件名、函数名称建立一对一的映射关系。具体过程如上所示,而Cnt指令语法格式中的Imm21代表了各函数对应计数器在.funcnt段中的偏移量。
为了不给编译器造成压力,Cnt指令并不参于寄存器分配阶段。因此,编译器对Cnt指令进行插桩时,只需将Cnt指令作为目标函数的第一条指令。然而,通常编译器是顺序的读入、处理各个文件,即下一次编译无法获知上次编译过程中的中间数据,为了保证各函数内Cnt指令的立即数是连续的,编译器在每次编译过程中都会读入一个用于存储当前偏移量的临时文件temp.def,编译之前从中读出当前偏移量,当源文件处理完毕后写入存放新偏移量的temp.def文件。编译结束后,编译器不仅输出插桩后的汇编文件,而且还更新了动态分析过程中用于统计数据的函数、计数器映射表,整个操作流程如图2(a)所示。为了使.funcnt段参与链接期的内存地址分配,本发明实施例添加了用于声明该段的funcnt.s汇编文件,并一起进入后续的汇编、链接阶段。过程中使用到的temp.def、映射表、funcnt.s文件的格式如图2(b)所示,其中ByteNum代表.funcnt申请的字节,且ByteNum=最大索引号*8bytes。
本发明实施例在动态分析过程中定义了一个全局计时器Cycler,当执行Cnt指令时,根据Cnt指令中的立即数查找到.funcnt段中对应的全局计数器并加1,即Cnt指令的功能描述如下:
*(unsigned int*)(addr(.funcnt)+imm*8)+=1;
Cycler=total_cycles;
而在对返回指令Ret中添加对每个函数执行时间的记录:
*(unsigned int*)(addr(.funcnt)+imm*8+4)+=total_cycles-Cycler;
最终,当目标程序运行完成,根据ByteNum的值顺序读出.funcnt段中存储的数据,即动态执行过程中各函数运行次数。表1是通过本发明实施例对1024点快速傅立叶变换(Fast Fourier Transform,FFT)程序进行的函数统计结果。
表1FFT程序统计结果
C语言是一种面向过程的高级编程语言,由它编写的函数中通常封装了即将顺序执行的多个操作或多个语句块,独立评估这些语句块占用目标函数执行时间的比例有利于程序员编写出更高效的代码。然而,编译器很难恰当的将目标函数切割为多个语句块,这主要因为划分的约束很难有统一的标准,几乎无法满足所有人的要求,划分的太细致无法辅助程序员进行算法层上的改进,太粗糙则失去了评估的意义。因此,本发明实施例在进行片段分析时将划分操作交由程序员实现,并提供特定格式的标识语句,这种方法类似于OpenMP中要求程序员对可并行部分进行标识来辅助编译器生成并行代码,OpenMP是用于共享内存并行系统的多线程程序设计的一套指导性的编译处理方案(Compiler Directive)。为了尽可能的减少编译器修改的工作量,本发明实施例采用内嵌汇编实现,绝大部份的操作在汇编期实现。在GCC编译器架构中该种内嵌汇编的格式为:
__asm__("::sentence");
助记符"::"作为汇编期识别的线索,sentence为注释语句,包括:起始句"Block Name","Name"由程序员定义且同一函数内部不能重复定义;终止语句"EndBlock"。起始句与终止句之间为目标高级语句块对应的汇编指令。程序员编程过程中插入这两条语句时,需保证这两条语句分别位于目标语句块的入口和出口处,且必须保证成对出现,代码(a)为一个正确示例,代码(b)为插入不完整的错误示例,这将导致无法统计,代码(c)为非入口或非出口处的错误示例,这同样导致统计过程中的算法出现错误。
本发明实施例在进行汇编文件分析时提供了一个全局计数器,并逐一将内嵌汇编语句"Block Name"替换为伪指令Block,语句"EndBlock"替换为EndBlock,其中Block指令的Operand为注释语句的全局索引值idx,EndBlock指令不定义Operand的值,他们的推断寄存器Pr均默认为Pr0,而"Name"则逐一添加入独立的数据段存储在最终的可执行ELF文件内,它们的语法格式如下:
语法格式:Block Imm21(21位无符号数)
EndBlock
汇编器根据全局索引值idx创建.blkcnt数据段,申请的字节数位idx*8bytes,其中每8个字节的首4字节对应为各Block伪指令指向的计数器,尾4字节对应为当前函数的全局索引值,并建立funcnt.s文件格式的BlockCnt.s文件由于汇编、链接等后续操作。
图3为本发明实施例提供的统计目标语句块的执行比率的流程,具体步骤如下:
1、处理器模型创建一个用于保存执行到Block指令时的时间点time(i)以及Block指令中Operand的全局栈结构,即blkidx(i);
2、执行到EndBlock时,进行一次退栈操作,获取语句块的运行时间time(i),.查询.blkcnt数据段并根据blkidx(i)的值完成对相应计时器的累加;
4、从虚拟内存中读出函数名、Block的命名,并以如下格式输出,即在fft函数中的basic语句块占用的比率为11.93%。
fft→basic→11.93%
本发明实施例实现简单、不依赖于硬件平台、可完成对语句块执行时间的评估。
显而易见,在不偏离本发明的真实精神和范围的前提下,在此描述的本发明可以有许多变化。因此,所有对于本领域技术人员来说显而易见的改变,都应包括在本权利要求书所涵盖的范围之内。本发明所要求保护的范围仅由所述的权利要求书进行限定。
Claims (8)
1.一种热点程序的统计方法,其特征在于:对源文件进行伪指令插桩,所述伪指令作为源文件中各函数的第一条指令,所述伪指令为第一伪指令,所述第一伪指令的操作数代表了各函数对应计数器在数据段中的偏移量,所述数据段用于记录各函数被访问次数和/或各函数被执行的时间;
所述源文件经过编译后输出携带所述第一伪指令的目标文件,当执行所述第一伪指令时,根据所述第一伪指令中的操作数查找数据段中对应的全局计算器并加1,而在目标文件的返回指令中添加对各函数执行时间的记录;
当目标文件运行完成时,根据数据段中存储的数据获取各函数被运行的次数。
2.根据权利要求1所述的方法,其特征在于:从所述数据段选定一个有效的起始地址并划分足够大的内存空间,用于存储所述各函数对应的计数器。
3.根据权利要求1所述的方法,其特征在于:在对源文件进行编译前读入一个用于存储当前偏移量的临时文件,从中读出当前偏移量,所述偏移量为所述各函数对应计数器与起始地址的距离,所述临时文件在所述源文件编译完毕后,重新被写入新偏移量。
4.根据权利要求1所述的方法,其特征在于:所述数据段中每8个字节对应于一个目标函数,其中,前4字节代表目标函数被访问的次数,后4字节代表函数被执行的时间。
5.根据权利要求1所述的方法,其特征在于:所述数据段中各全局计数器与源文件名、函数名称建立一对一的映射关系。
6.根据权利要求1所述的方法,其特征在于:当所述函数中封装了多个操作或多个语句块时,将第二伪指令分别插入到各语句块的入口出,将第三伪指令分别插入到各语句块的出口处,并通过所述第二伪指令获取语句块的运行时间,根据所述语句块的运行时间和对应函数运行总的时间计算目标语句块的占用率,所述语句块的占用率为:所述目标语句块是由程序员根据需要自行划分。
7.根据权利要求6所述方法,其特征在于:所述目标语句块的运行时间通过以下步骤获取:
创建一个用于保存执行所述第三伪指令时的时间点,以及根据所述第三伪指令的全局索引值创建数据段;
当执行到所述第三伪指令时,进行一次退栈操作,获取所述目标语句块的运行时间,并根据所述数据段的值完成对相应计时器的累加;
当执行程序执行完成时,顺序读取所述数据段保存的目标语句块的运行时间数据。
8.根据权利要求1至7中任一权利要求所述的方法,其特征在于:该方法在模拟执行平台上运行,所述模拟执行平台是针对各种体系结构处理器的模拟器。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310415538.4A CN103473168B (zh) | 2013-09-12 | 2013-09-12 | 一种热点程序的统计方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310415538.4A CN103473168B (zh) | 2013-09-12 | 2013-09-12 | 一种热点程序的统计方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103473168A true CN103473168A (zh) | 2013-12-25 |
CN103473168B CN103473168B (zh) | 2016-05-04 |
Family
ID=49798033
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310415538.4A Expired - Fee Related CN103473168B (zh) | 2013-09-12 | 2013-09-12 | 一种热点程序的统计方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103473168B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105279004B (zh) * | 2015-11-24 | 2018-06-26 | 无锡江南计算技术研究所 | 一种基于采样剖析的轻量级程序代码重排方法 |
WO2019071535A1 (zh) * | 2017-10-12 | 2019-04-18 | 深圳市汇顶科技股份有限公司 | 计算机存储介质、程序运行监测方法及装置 |
CN110210046A (zh) * | 2019-02-20 | 2019-09-06 | 芯易微电子(广州)有限公司 | 应用程序及专用指令集处理器一体化敏捷设计方法 |
CN110764771A (zh) * | 2018-07-27 | 2020-02-07 | 龙芯中科技术有限公司 | 动态编译方法和装置、可读存储介质及电子设备 |
US10871976B2 (en) | 2015-12-02 | 2020-12-22 | Huawei Technologies Co, Ltd. | Method and apparatus for identifying hotspot intermediate code in language virtual machine |
CN116257457A (zh) * | 2023-05-15 | 2023-06-13 | 成都赛力斯科技有限公司 | 函数执行情况获取方法、装置、电子设备及可读存储介质 |
CN116483734A (zh) * | 2023-06-16 | 2023-07-25 | 荣耀终端有限公司 | 一种基于编译器的插桩方法、系统及相关电子设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6873934B1 (en) * | 2000-06-29 | 2005-03-29 | Microsoft Corporation | Performance markers to measure benchmark timing of features in a program |
CN1783009A (zh) * | 2004-12-03 | 2006-06-07 | 中国科学院计算技术研究所 | 一种汇编代码热函数中的热路径搜寻方法 |
CN101477472A (zh) * | 2009-01-08 | 2009-07-08 | 上海交通大学 | 动态二进制翻译器中热路径的多核多线程构建方法 |
-
2013
- 2013-09-12 CN CN201310415538.4A patent/CN103473168B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6873934B1 (en) * | 2000-06-29 | 2005-03-29 | Microsoft Corporation | Performance markers to measure benchmark timing of features in a program |
CN1783009A (zh) * | 2004-12-03 | 2006-06-07 | 中国科学院计算技术研究所 | 一种汇编代码热函数中的热路径搜寻方法 |
CN101477472A (zh) * | 2009-01-08 | 2009-07-08 | 上海交通大学 | 动态二进制翻译器中热路径的多核多线程构建方法 |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105279004B (zh) * | 2015-11-24 | 2018-06-26 | 无锡江南计算技术研究所 | 一种基于采样剖析的轻量级程序代码重排方法 |
US10871976B2 (en) | 2015-12-02 | 2020-12-22 | Huawei Technologies Co, Ltd. | Method and apparatus for identifying hotspot intermediate code in language virtual machine |
WO2019071535A1 (zh) * | 2017-10-12 | 2019-04-18 | 深圳市汇顶科技股份有限公司 | 计算机存储介质、程序运行监测方法及装置 |
CN109923526A (zh) * | 2017-10-12 | 2019-06-21 | 深圳市汇顶科技股份有限公司 | 计算机存储介质、程序运行监测方法及装置 |
CN110764771A (zh) * | 2018-07-27 | 2020-02-07 | 龙芯中科技术有限公司 | 动态编译方法和装置、可读存储介质及电子设备 |
CN110764771B (zh) * | 2018-07-27 | 2024-04-05 | 龙芯中科技术股份有限公司 | 动态编译方法和装置、可读存储介质及电子设备 |
CN110210046A (zh) * | 2019-02-20 | 2019-09-06 | 芯易微电子(广州)有限公司 | 应用程序及专用指令集处理器一体化敏捷设计方法 |
CN110210046B (zh) * | 2019-02-20 | 2023-04-07 | 芯易荟(上海)芯片科技有限公司 | 应用程序及专用指令集处理器一体化敏捷设计方法 |
CN116257457A (zh) * | 2023-05-15 | 2023-06-13 | 成都赛力斯科技有限公司 | 函数执行情况获取方法、装置、电子设备及可读存储介质 |
CN116483734A (zh) * | 2023-06-16 | 2023-07-25 | 荣耀终端有限公司 | 一种基于编译器的插桩方法、系统及相关电子设备 |
CN116483734B (zh) * | 2023-06-16 | 2024-03-19 | 荣耀终端有限公司 | 一种基于编译器的插桩方法、系统及相关电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN103473168B (zh) | 2016-05-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103473168B (zh) | 一种热点程序的统计方法 | |
Thies et al. | A practical approach to exploiting coarse-grained pipeline parallelism in C programs | |
CN105637480B (zh) | 用于用户指导剖析驱动优化的架构 | |
CN102193811B (zh) | 消除内存访问冲突的编译装置及其实现方法 | |
CN108197027B (zh) | 软件性能优化方法、可存储介质、计算机、计算机程序 | |
CN116661804B (zh) | 代码编译方法、代码编译装置、电子设备和存储介质 | |
CN115658323A (zh) | 基于软硬件协同的fpga潮流计算加速架构和方法 | |
US8732679B2 (en) | Loop transformation for computer compiler optimization | |
Metcalf | The seven ages of fortran | |
CN104317715A (zh) | 基于模拟器的中央处理器指令集的功能测试自动实施方法 | |
CN104407968A (zh) | 一种通过静态分析测算代码指令最长运行时间的方法 | |
CN107851002A (zh) | 一种代码编译方法及代码编译器 | |
EP3805879A1 (en) | Support device and support program | |
CN105404611A (zh) | 一种基于矩阵模型的多计算引擎的自动选择方法 | |
Riedel et al. | Banshee: A fast LLVM-based RISC-V binary translator | |
CN105867886B (zh) | 一种写表格的方法及装置 | |
CN104063329B (zh) | 64位立即数处理方法及装置 | |
US9940267B2 (en) | Compiler global memory access optimization in code regions using most appropriate base pointer registers | |
Hanappe et al. | FAMOUS, faster: using parallel computing techniques to accelerate the FAMOUS/HadCM3 climate model with a focus on the radiative transfer algorithm | |
Shigenobu et al. | A translation method of ARM machine code to LLVM-IR for binary code parallelization and optimization | |
CN103530471A (zh) | 一种基于模拟器的关键路径分析方法 | |
Kasyanov et al. | Cloud system of functional and parallel programming for computer science education | |
CN114168145A (zh) | 基于llvm编译的计算表达式方法、系统、装置及存储介质 | |
CN113448874A (zh) | 一种单元测试脚本的生成方法及装置 | |
US20090112568A1 (en) | Method for Generating a Simulation Program Which Can Be Executed On a Host Computer |
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: 20160504 Termination date: 20200912 |
|
CF01 | Termination of patent right due to non-payment of annual fee |