基于MIPS架构的软件性能探究工具
2018-12-25梁成豪
文/梁成豪
1 引言
如今,高级语言(如C语言)已经成为大量被应用于系统、应用软件的开发。软件的性能好坏在对其进行大规模应用时在设计极差的地方可以被宏观的观察出来,但是也很难定位到问题所在,即便是可以定位到问题所在,也很难分析得很细微以达到对软件相应设计较差的代码进行改进的目的。如今有一些软件性能分析工具如linux的perf,以及C语言库头文件
实际上,实际系统中很难有完全精确的工具来对应用程序的性能进行不间断的精确追踪。这样的精确追踪。而计算机体系结构仿真器是一个很好的解决方案。
计算机体系结构仿真器主要是用来在系统层面探究和优化计算机体系结构参数设计的工具。通常而言,它们详细建模了某一计算机体系结构内部部件,诸如CPU执行部件、cache等。软件通过编译可以在仿真工具上进行运行,运行之后仿真器给出运行结果统计,从而验证软件在某一组体系结构参数(通常包括cache相联性、内存读写端口数等)的性能。本文利用SimpleScalar(SS)为基础来开发MIPS架构软件性能探究工具。
2 工具及可执行文件格式简介
2.1 SimpleScalar简介
SS是由Todd Austin开发的一个用于模拟计算机体积结构诸如计算单元、缓存与内存系统、分支猜测等部件在内的开源仿真器。它本身携带了几个处理器模型,仿真速度从快到慢,精度从低到高依次有sim-fast、simsafe、sim-prof i le、以及sim-outorder等。本文以sim-outorder作为依托,因为其模拟程度最详细,囊括了整数、浮点寄存器、2级可配置cache、哈佛架构并且拥有乱序执行部件、预测执行部件等现代处理器常见架构。流水线方面,它详细模拟了MIPS诸如取指、译码、执行、访存和回写在内的5级流水。
对于sim-outorder来讲,SS以ruu_fetch()、ruu_dispatch()、ruu_commit()等几个关键函数实现5级流水。在指令解码方面,machine.def文件以宏定义的方式汇集了每个指令的指令名称、指令码、执行方式、涉及功能部件等信息。
2.2 可执行文件格式ss-coff-X
可执行文件的格式标识了可执行文件的类型,不同的语言以及不同的执行环境一般会产生不同类型的可执行文件。如Linux平台下可执行文件格式主要有两种:ELF和COFF。前者是现今Linux平台下最为流行的可执行文件格式,通常由GCC编译的可执行文件,其格式就是ELF。系统通常系统根据文件头头几个字节来区分两者的不同。而ECOFF格式是应用于MIPS的可执行文件格式。SS所应用的是一种和ECOFF兼容的可执行文件格式。
3 性能探究工具设计
C语言是高级语言,通常情况下,每句C语言最终都被编译为不止一句汇编语言。要完成C每行代码和程序计数器(PC)的对应,首先就要完成C语言和汇编语言的对应。
3.1 二进制文件信息的提取
SS支持的是ECOFF格式的可执行为文件,因此要下载其自己的binutils工具链来完成。可以在编译应用程序时加上-g选项来进行编译。在编译之后,利用objdump命令对.o文件进行处理,并加入--disassemble选项进行反汇编,-l进行行数显示,--source进行源代码显示。将产生的文件导入新的文件,这个文件就记录了C代码行号和汇编代码的对应关系。由于文件显示信息过多,利用额外的程序对该文件进行正则匹配处理,之拿出行号和汇
编操作码的对应即可。考虑到后面的需要,只需要提取出来汇编指令操作码即可。
3.2 汇编指令和PC的对应信息提取
SS的指令由64位构成。前32位是操作码,后32位是操作数。分别由8个16进制数表示。ECOFF将可执行文件分为.text、.rdata、.data、.sdata、.sbss和 .bss六个段。其中 .text段表示代码段;.rdata表示只读的数据段;.data段表示已被初始化的可读写数据段;.sdata表示;.sbss表示;.bss表示未初始化的数据段。
SS在加载可执行文件的时候。首先会读取可执行文件的文件头信息,里面涵盖了7个信息,其中包含了魔数(f_magic)、段的个数(f_cscns)、文件建立时间(f_timdat)、符号表相对于文件的偏移量(f_symptr)、符号表条目个数(f_nsyms)、可选头部长度(f_opthdr)以及文件标志(f_flags)。
除此之外,还有可选文件头以及各个段的头。每个段的头所涵盖的10个信息有:
段名称(s_name);段物理地址(s_paddr);段虚拟地址(s_vaddr);段大小(s_size);段数据相对于文件的偏移量(s_scnptr);重定位信息偏移量(s_relptr);行信息偏移量(s_lnnptr);重定为条目数(s_nreloc);行信息条目数(s_nlnno);标志(s_flags)。
要拿到汇编操作码和PC指针的对应关系,需要分析TEXT段的内容。由于SS是以s_vaddr为基础将代码段整体放入仿真器内存的,因此首先根据s_flags定位到TEXT段,然后在另一个文件中记录出每8个字节提取前4个字节作为汇编操作码,以及与此相对应的PC值(即每个指令对应的s_vaddr的值)。这样可以得到操作码和PC指针的对应关系文件。
在得到C代码行数和汇编操作码对应的关系文件以及汇编操作码和PC指针的对应关系文件后,便可以得到C语言行数和PC指针的对应关系。这样的记录方式是对可执行文件和执行环境没有侵入的,即没有在可执行文件中加入任何的记录标志,同时也没有对cache进行数据污染。
3.3 每周期数据访问统计信息提取
SS自带有执行过程各部件访问统计,但是没有每周期的数据,为了更好地分析可执行文件的执行过程,可以额外加入每周期的处理器各部件访问统计。在每周期开始时,将统计变量设为初始值,然后在执行过程中在程序不同地方进行每个统计变量的加操作,在一周期执行完毕后,将结果记录,同时再将统计变量设为初始值,以便下个周期进行统计。
在执行的每个周期都进行统计和记录,这样就形成了PC和统计量的对应关系文件。
3.4 最终记录方案
由于在此之前提取了每周期C语言行数和PC指针的对应关系文件以及每周期PC指针和该周期处理器各部件访问统计,因此可以最终得到记录每周期C语言代码和该周期处理器各部件访问统计的文件。将此文件在MATLAB等工具中进行可视化处理,便可以直观分析软件执行过程中每行C语言代码所造成的各部件访问情况,从而达到指导软件优化的目的。
4 结论
由于现阶段程序性能分析工具会侵入目标程序的自身或者执行环境,不能做到精确分析软件自身的问题。为了给目标分析程序提供一个非侵入式的纯净执行环境以便更好地分析程序的执行性能和瓶颈,本文以SimpleScalar仿真器为基础,实现了一个可以与汇编、C程序每执行周期严格对应的应用程序性能分析工具。本文也提出了一个较好的方法,即利用原本用来进行处理器体系结构探索的仿真工具来进行目标指令集和架构的软件性能探索和研究。如果有其它指令集或架构的周期精确体系结构仿真器,利用此方法,依然可以探索该平台下的软件性能。
参考文献
[1]徐恒阳,安虹,刘玉,周伟.Perf在龙芯2F上的设计与实现[J].计算机工程,2011,19(37):236-238.
[2]SimpleScalar Architectural Research Tool Set,version 3.0.www.simplescalar.com.
[3]俞甲子,石凡,潘爱民.程序员的自我修养——链接、装载与库[M].电子工业出版社,2009.