3

我正在对 Windows 移动设备上的代码性能进行一些基准测试,并注意到某些算法在某些主机上的性能明显更好,而在另一些主机上则明显更差。当然,考虑到时钟速度的差异。

供参考的统计数据(所有结果均由同一个二进制文件生成,由面向 ARMv4 的 Visual Studio 2005 编译):

英特尔 XScale PXA270

  • 算法 A:22642 毫秒
  • 算法 B:29271 毫秒

ARM1136EJ-S 内核(嵌入在 MSM7201A 芯片中)

  • 算法 A:24874 毫秒
  • 算法 B:29504 毫秒

ARM926EJ-S 内核(嵌入在 OMAP 850 芯片中)

  • 算法 A:70215 毫秒
  • 算法 B:31652 毫秒(!)

我检查了浮点作为可能的原因,虽然算法 B 确实使用了浮点代码,但它没有从内部循环中使用它,而且似乎没有一个内核具有 FPU。

所以我的问题是,什么机制可能导致这种差异,最好是关于如何修复/避免有问题的瓶颈的建议。

提前致谢。

4

4 回答 4

2

一个可能的原因是 926 的流水线较短(5 个周期与 1136 的 8 个周期,iirc),因此分支错误预测在 926 上的成本较低。

也就是说,这些处理器之间存在很多架构差异,无法确定为什么您会在不了解您实际执行的指令的情况下看到这种效果。

于 2009-10-07T00:21:29.130 回答
2

时钟速度只是一个因素。总线宽度和延迟是很大的因素,如果不是更大的因素的话。缓存是一个因素。如果从媒体而不是内存运行程序,则运行该程序的媒体的速度。

该测试是在测试中的任何时候都使用任何共享库还是全部是内部代码?在因平台而异的媒体上获取共享库(即使是同一张 sd 卡)。

这是为每个平台单独编译的相同算法还是相同的二进制文件?您也可以并且将会看到一些编译器引起的变化。通过改变编译器设置,同一平台上的同一编译器可以轻松实现 50% 的快和慢。如果可能,您希望执行相同的二进制文件,并确保在被测循环中未使用任何共享库。如果不是同一个二进制文件,则为每个平台反汇编被测循环,并确保除了寄存器选择之外没有其他变化。

于 2009-10-06T17:05:51.147 回答
1

从您提供的数据来看,很难指出确切的问题,但我们可以分享一些先前的经验

  • 缓存设置(检查所有处理器是否具有相同的缓存设置)
  • 您需要同时检查 D-Cache 和 I-Cache

为了分析,

进一步分解你的代码,不仅仅是算法,而是块级别,并尝试理解导致瓶颈的块。找到导致瓶颈的块后,尝试反汇编块的源代码,并检查汇编。它可能会有所帮助。

于 2009-10-07T05:02:33.797 回答
0

看起来问题出在缓存设置或与内存相关的东西上(可能是 I-Cache“溢出”)。管道停顿、分支错误预测通常会产生不太显着的差异。

您可以尝试计算在每个算法中执行的一些基本操作,例如:

  1. “简单”算术/按位运算 (+-|^&) 的数量并按常数移位
  2. 变量的班次数
  3. 乘法数
  4. “硬”算术运算的数量(除法,浮点运算)
  5. 对齐内存读取次数(32 位)
  6. 字节内存读取数(8 位)(比 32 位慢)
  7. 对齐内存写入次数(32 位)
  8. 字节存储器写入数(8 位)
  9. 分行数
  10. 其他的,不记得了:)

你会得到信息,事情变得更慢 926。在此之后,您可以检查可疑块,或多或少地使用它们。你会得到答案。

此外,最好在 VS 中启用汇编列表生成并将其(但不是您的高级源代码)用作研究的基础。

ps:也许问题出在操作系统/软件/固件上?您是否在干净的系统上进行了测试?所有设备上的操作系统都相同吗?

于 2009-10-07T21:41:50.363 回答