2

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

我不认为有一个objdump开关,但 RTFM 会很棒。

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

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

内存延迟无关紧要。内存控制器就像另一个CPU。它在 CPU 做算术等时做它的业务。一个好的/调整好的算法将使内存访问与计算并行。通过计算加载/存储和周期,您可以确定当您使用计时器主动分析时完成了多少并行度。由于寄存器之间的互锁,流水线很重要,但即使在现代 ARM 处理器上也可以可靠地计算和使用基本块的周期计数;这对于一个简单的脚本来说太复杂了。

4

2 回答 2

2

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

如果没有完整的处理器模拟,您所能得到的只是猜测。这些数字对你是否有意义取决于你试图用它们完成什么。

于 2013-02-18T19:22:19.173 回答
2

有一个在线工具可以估计 Cortex-A8 上的循环计数。然而,这个 CPU 已经很老了,针对它优化的程序在较新的 CPU 上可能不是最理想的。

AFAIK ARM 还在其 RVDS 软件中提供了 Cortex-A9 和 Cortex-A5周期精确仿真器,但价格相当昂贵。

于 2013-02-18T20:26:35.150 回答