1 / 23

性能分析

性能分析. 议程. 代码和数据的大小 ARMulator 周期计算 ARMulator 实时仿真 其他 ARMulator 的问题. 编译器的优化级别. C/C++ 编译器的优化级别是可以选择的. -O0 (debug 版的默认值 , -g ) 除了一些简单的代码转换之外,关闭了大部分的优化 有最好的调试信息,是没有优化的代码. -O1 大部分的优化 . 带有满意的调试信息,同时有好的代码密度. -O2 ( 默认 ) 全部优化 . 有限的调试信息,但有最好的代码密度.

Download Presentation

性能分析

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 性能分析

  2. 议程 • 代码和数据的大小 ARMulator 周期计算 ARMulator 实时仿真 其他 ARMulator 的问题

  3. 编译器的优化级别 • C/C++ 编译器的优化级别是可以选择的. -O0(debug版的默认值, -g) • 除了一些简单的代码转换之外,关闭了大部分的优化 • 有最好的调试信息,是没有优化的代码. -O1 • 大部分的优化. • 带有满意的调试信息,同时有好的代码密度. -O2 (默认) • 全部优化. • 有限的调试信息,但有最好的代码密度. • 代码密度和执行速度的平衡可以使用选项-Ospace (默认) 或 –Otime来选择. • 利用-g选项来包括源代码调试信息.

  4. 应用代码和数据的大小 • 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

  5. 其他大小的考虑 • 连接器的输出表明了应用最小的ROM和RAM的需求. • 栈和堆需要额外的RAM空间. • 把栈放在零等待状态-32 位的片上内存将比在8位或16位上的片外内存性能更高. • 你也可以把代码从ROM里拷贝到RAM里运行,这样将增加RAM空间. • ELF文件的代码/数据的大小可以使用以下选项得到: fromelf -z. • 库文件的代码/数据的大小可以使用以下选项得到: armar -sizes.

  6. 练习 1 在这个练习部分,我们将看到,C编译器的不同优化级别对于一些简单的应用代码的影响. (the Dhrystone 2.1 benchmark) 这些信息是连接时用-info totals 选项时得到的.

  7. 议程 代码和数据大小 • ARMulator 周期计算 ARMulator 实时仿真 其他 ARMulator 问题

  8. 周期计算 (1) • ARMulator 可以通过执行应用程序来计算周期. • 可以产生Sequential, Non-sequential, Coprocessor 等周期信息. • 可以使用调试器来显示: • print $statistics (armsd / ADW / ADU / AXD),或者ViewDebugger Internals (ADW / ADU / AXD) • 对消逝的(增加的)周期计算的输出: • ViewDebugger Internals或者print $statistics_inc_w (ADW/ ADU), 或者 ViewDebugger InternalsAdd New Reference Point (AXD) • 你可以使用这些信息来分析子程序的调用问题.

  9. 周期计算 (2) AMBA (ASB) 只有地址周期 • 例子输出 (ARM7TDMI) Reference Point(s) Number of instructions Core Cycles Seq Cycles Non-Seq Cycles Internal Cycles Copro Cycles Total Cycles 例子输出 (ARM940T)

  10. 练习部分 2 这一部分里,我们可以看到由ARMulator产生的周期信息. 我们将比较两种不同的内存拷贝的性能,一种使用LDR/STR指令,令一种使用LDM/STM(IA) 指令.

  11. 议程 代码和数据大小 ARMulator 周期计算 • ARMulator 实时仿真 其它的 ARMulator 问题

  12. 实时仿真 • 为了得到时间统计表, ARMulator 需要以下信息: • 处理器的类型, 例如 ARM7TDMI • 内核的时钟频率 • 与处理器连接的内存的信息 (地址,宽度.速度) • 指定时钟频率: • 对于 armsd, 利用命令行选项 ‘-clock’, 例如armsd -clock 25MHz prog.axf • 对于AXD / ADW / ADU, 选择 OptionsConfigure Debugger, 接着 配置ARMulate目标环境速度 (in MHz).

  13. ARMulator 配置 Processor Clock Speed Endianess Memory Map • 可以通过调试器 (Options  Configure Debugger)来实现简单的配置 • 配置文件里的高级配置 • armulate.dsc • “固定的” 核的类型和功能 • 例如. TCM/Cache 大小 • default.ami • 全局核配置信息 • 例如. MCCFG 控制时钟设置,页表使用等. • peripherals.ami • 外部的配置 • 例如. MMU/MPU 配置, semihosting 默认值, 堆栈基地址等.

  14. 内存配置 (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

  15. 内存配置 (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

  16. 观察仿真时间 • 当执行仿真时,调试器一直追踪着流逝的仿真时间. • 这可以通过以下方法来观察: • 通过应用程序 • 从汇编语言: 利用semihosting SWISYS_CLOCK • 从C / C++语言 : 利用库函数clock() • 通过调试器 • 利用调试器内部的变量$clock t1 = clock(); main_loop(); t2 = clock(); time_taken = t2 - t1;

  17. 练习部分3 这一部分主要讨论了ARMulator里的映象文件的使用和检查了是怎样影响代码的性能的. 我们将再次使用Dhrystone 2.1 代码.

  18. 议程 代码和数据大小 ARMulator 周期计算 ARMulator 实时仿真 • 其它 ARMulator 的问题

  19. 带有缓存内核的ARMulation(1) • 在没有缓存的内核上,指令和数据的执行时间是“可预见的” • 在有缓存的内核上,还有其它的一些因素也会影响指令和数据的执行时间: • 指令有没有缓存? • 数据地址有没有缓存? • 写缓冲器(WB)有没有被用完? • 内核是否支持 streaming ? • 是否有TLB错过(如果有MMU的话) ? • 你可以配置ARMulator来报告缓存,写缓冲器(WB)和TLB信息 • 详细细节可以参考 “Debug Target Guide”

  20. 带有缓存内核的ARMulation(2) • 在某些内核上,ARMulator 可能报告零N-cycle(non-seq) • 例如:带有AMBA 接口的内核(720T, 940T, 等) • ARMulator 只能显示AMBA周期类型 : • 地址 (A) • 连续的 (S) • 非连续的访问是有一个A-周期,紧接着是一个 S-周期 • “合并的 I-S” 周期

  21. 练习部分 4 这一部分将会看到缓存是怎样影响代码的性能的(利用 Dhrystone 例子).

  22. 参考资料 • 为了得到更详细的信息,请察看以下资料: • 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 调试器

More Related