使用ARM循环计数发布进程`objdump --disassemble`

时间:2013-02-18 17:55:43

标签: gcc open-source arm objdump

是否有一个脚本可用于后期处理某些objdump --disassemble输出以使用循环计数进行注释?特别是对于ARM系列。 大多数情况下,这只是与计数表查找的模式匹配。我想可能需要五个内存周期的+5M注释。 Perl,python,bash,C等都可以。我认为这可以通用,但我对 ARM 感兴趣,它具有正交指令集。这是68HC11做同样事情的线程。该脚本需要一个CPU 模型选项来选择适当的循环计数;我认为这些计数已经存在于gcc机器描述中。

我认为没有objdump开关,但RTFM会很棒。

编辑为了澄清,最佳案例内存子系统等假设就像从缓存执行代码时的情况一样。根据某些运行的机器,目标不是100%准确的循环计数。可以得到合理的估计,否则编译器设计是不可能的。

正如DWelch指出的那样,使用深度流水线架构(如最新的Cortex芯片)无法实现简单的运行总计。 objdump后期处理必须查看周围的操作码。一个gcc插件更有可能实现这一点,因为这是新的(4.5+),我不认为存在这样的事情。 ARM926的脚本当然是可行的并且相当简单。

内存延迟无关紧要。内存控制器就像另一个CPU。当CPU正在进行算术运算等时,它正在做它的业务。良好/良好调整的算法将parallel内存访问计算。通过计算加载/存储和周期,您可以确定在使用计时器进行主动配置时实现了多少并行性。由于寄存器之间的互锁,流水线很重要,但basic blocks的循环计数可以可靠地计算并用于现代ARM处理器;对于简单的脚本来说,这太复杂了。

2 个答案:

答案 0 :(得分:2)

循环计数不是可以通过在现代高端ARM上单独查看指令来评估的。有很多运行时状态会影响指令的实际退休率。它需要的数据是否存在于缓存中?指令是否与先前的指令结果有任何依赖关系?如果是这样,转发单元会删除哪些延迟?加载/存储缓冲区有多满?它涉及什么样的内存映射?该指令需要多长时间的处理器流水线?流中是否有同步指令?有猜测提出了一些依赖的数据吗?寄存器重命名器的状态是什么?条件指令是否填满了管道,或者解码器是否足够智能以完全跳过它们?核心时钟与总线和内存时钟之间的比率是多少?分支预测表的大小是多少?

如果没有完整的处理器模拟,您可以得到猜测。这些数字对你来说是否有意义取决于你想要用它们完成的任务。

答案 1 :(得分:2)

有一个estimates cycle counts on Cortex-A8的在线工具。但是,这个CPU已经很老了,针对它优化的程序在新的CPU上可能不是最理想的。

AFAIK ARM还提供Cortex-A9和Cortex-A5 cycle-accurate emulators in their RVDS software,但它非常昂贵。