230 likes | 319 Views
性能分析. 议程. 代码和数据的大小 ARMulator 周期计算 ARMulator 实时仿真 其他 ARMulator 的问题. 编译器的优化级别. C/C++ 编译器的优化级别是可以选择的. -O0 (debug 版的默认值 , -g ) 除了一些简单的代码转换之外,关闭了大部分的优化 有最好的调试信息,是没有优化的代码. -O1 大部分的优化 . 带有满意的调试信息,同时有好的代码密度. -O2 ( 默认 ) 全部优化 . 有限的调试信息,但有最好的代码密度.
E N D
议程 • 代码和数据的大小 ARMulator 周期计算 ARMulator 实时仿真 其他 ARMulator 的问题
编译器的优化级别 • C/C++ 编译器的优化级别是可以选择的. -O0(debug版的默认值, -g) • 除了一些简单的代码转换之外,关闭了大部分的优化 • 有最好的调试信息,是没有优化的代码. -O1 • 大部分的优化. • 带有满意的调试信息,同时有好的代码密度. -O2 (默认) • 全部优化. • 有限的调试信息,但有最好的代码密度. • 代码密度和执行速度的平衡可以使用选项-Ospace (默认) 或 –Otime来选择. • 利用-g选项来包括源代码调试信息.
应用代码和数据的大小 • armlink 提供两个可选择项来提供相关的信息: • -info sizes(所有目标的大小) • -info totals(总体大小) Read Write (读写) Zero Initialized (零初始化) Read Only(只读) Code RO Data RW Data ZI Data Debug 4220 60 4 10240 6824 Object Totals 26056 728 0 272 10000 Library Totals =================================================================== Code RO Data RW Data ZI Data Debug 30276 788 4 10512 16824 Grand Totals =================================================================== Total RO Size(Code + RO Data) 31064 ( 30.34kB) Total RW Size(RW Data + ZI Data) 10516 ( 10.27kB) Total ROM Size(Code + RO Data + RW Data) 31068 ( 30.34kB) RAM ROM
其他大小的考虑 • 连接器的输出表明了应用最小的ROM和RAM的需求. • 栈和堆需要额外的RAM空间. • 把栈放在零等待状态-32 位的片上内存将比在8位或16位上的片外内存性能更高. • 你也可以把代码从ROM里拷贝到RAM里运行,这样将增加RAM空间. • ELF文件的代码/数据的大小可以使用以下选项得到: fromelf -z. • 库文件的代码/数据的大小可以使用以下选项得到: armar -sizes.
练习 1 在这个练习部分,我们将看到,C编译器的不同优化级别对于一些简单的应用代码的影响. (the Dhrystone 2.1 benchmark) 这些信息是连接时用-info totals 选项时得到的.
议程 代码和数据大小 • ARMulator 周期计算 ARMulator 实时仿真 其他 ARMulator 问题
周期计算 (1) • ARMulator 可以通过执行应用程序来计算周期. • 可以产生Sequential, Non-sequential, Coprocessor 等周期信息. • 可以使用调试器来显示: • print $statistics (armsd / ADW / ADU / AXD),或者ViewDebugger Internals (ADW / ADU / AXD) • 对消逝的(增加的)周期计算的输出: • ViewDebugger Internals或者print $statistics_inc_w (ADW/ ADU), 或者 ViewDebugger InternalsAdd New Reference Point (AXD) • 你可以使用这些信息来分析子程序的调用问题.
周期计算 (2) AMBA (ASB) 只有地址周期 • 例子输出 (ARM7TDMI) Reference Point(s) Number of instructions Core Cycles Seq Cycles Non-Seq Cycles Internal Cycles Copro Cycles Total Cycles 例子输出 (ARM940T)
练习部分 2 这一部分里,我们可以看到由ARMulator产生的周期信息. 我们将比较两种不同的内存拷贝的性能,一种使用LDR/STR指令,令一种使用LDM/STM(IA) 指令.
议程 代码和数据大小 ARMulator 周期计算 • ARMulator 实时仿真 其它的 ARMulator 问题
实时仿真 • 为了得到时间统计表, ARMulator 需要以下信息: • 处理器的类型, 例如 ARM7TDMI • 内核的时钟频率 • 与处理器连接的内存的信息 (地址,宽度.速度) • 指定时钟频率: • 对于 armsd, 利用命令行选项 ‘-clock’, 例如armsd -clock 25MHz prog.axf • 对于AXD / ADW / ADU, 选择 OptionsConfigure Debugger, 接着 配置ARMulate目标环境速度 (in MHz).
ARMulator 配置 Processor Clock Speed Endianess Memory Map • 可以通过调试器 (Options Configure Debugger)来实现简单的配置 • 配置文件里的高级配置 • armulate.dsc • “固定的” 核的类型和功能 • 例如. TCM/Cache 大小 • default.ami • 全局核配置信息 • 例如. MCCFG 控制时钟设置,页表使用等. • peripherals.ami • 外部的配置 • 例如. MMU/MPU 配置, semihosting 默认值, 堆栈基地址等.
内存配置 (1) Read Write Start Address (Hex) Length of Area (Hex) Area name Area Width (Bytes) Access (R/RW/-) Timing (ns) non-seq / sequential • 如果没有指定映象文件: • ARMulator 将利用4Gb, 32-bit, 零等待状态, 读/写 内存映象. • 为了指定一个‘实际’的系统内存映象,可以使用一个映象文件. 00000000 00020000 CODE 2 R 150/100 150/100 10000000 00008000 DATA 4 RW 100/65 100/65
内存配置 (2) ARMulated Processor Endianess (Big / Little) ARMulated Clock Speed Area Location Area Width Access rights Number of wait states (various access types) • ARMulator仿真了一个基本的内存控制器. • 适当加入一些等待状态, 这依赖于内存速度和时钟频率. 启动的旗语说明(在其他事件中)例如: ARM7TDMI, BIU, Big endian, Semihosting, Debug Comms Channel, 25.0MHz, 4GB, Mapfile, Timer, Profiler, Tube, Millisecond [25000 cycles_per_millisecond], Pagetables, IntCtrl, Tracer, RDI Codesequences Memory map: 10000000..10007fff, 32-Bit, wr, wait states: RN=2/1 WN=2/1 RS=1 WS=1 RIS=2/1 WIS=2/1 00000000..0001ffff, 16-Bit, -r, wait states: RN=3/2 WN=Abt RS=2 WS=Abt RIS=3/2 WIS=3/2
观察仿真时间 • 当执行仿真时,调试器一直追踪着流逝的仿真时间. • 这可以通过以下方法来观察: • 通过应用程序 • 从汇编语言: 利用semihosting SWISYS_CLOCK • 从C / C++语言 : 利用库函数clock() • 通过调试器 • 利用调试器内部的变量$clock t1 = clock(); main_loop(); t2 = clock(); time_taken = t2 - t1;
练习部分3 这一部分主要讨论了ARMulator里的映象文件的使用和检查了是怎样影响代码的性能的. 我们将再次使用Dhrystone 2.1 代码.
议程 代码和数据大小 ARMulator 周期计算 ARMulator 实时仿真 • 其它 ARMulator 的问题
带有缓存内核的ARMulation(1) • 在没有缓存的内核上,指令和数据的执行时间是“可预见的” • 在有缓存的内核上,还有其它的一些因素也会影响指令和数据的执行时间: • 指令有没有缓存? • 数据地址有没有缓存? • 写缓冲器(WB)有没有被用完? • 内核是否支持 streaming ? • 是否有TLB错过(如果有MMU的话) ? • 你可以配置ARMulator来报告缓存,写缓冲器(WB)和TLB信息 • 详细细节可以参考 “Debug Target Guide”
带有缓存内核的ARMulation(2) • 在某些内核上,ARMulator 可能报告零N-cycle(non-seq) • 例如:带有AMBA 接口的内核(720T, 940T, 等) • ARMulator 只能显示AMBA周期类型 : • 地址 (A) • 连续的 (S) • 非连续的访问是有一个A-周期,紧接着是一个 S-周期 • “合并的 I-S” 周期
练习部分 4 这一部分将会看到缓存是怎样影响代码的性能的(利用 Dhrystone 例子).
参考资料 • 为了得到更详细的信息,请察看以下资料: • ADS 编译和库文件用户手册 • 第 2章 : C 和 C++ 编译器 • 第3章: ARM 编译器参考 • ADS Linker and Utilities Guide • 第2-6章: ARM 连接定位器 • ADS Debug Target Guide • 第2章: ARMulator 基本知识 • 第3章: ARMulator 模式 • 第4章: ARMulator参考 • ADS AXD and armsd Debuggers Guide • 第5章: AXD 调试器