Optimization 针对ARM的优化:为什么不同的CPU对不同的算法有不同的影响(而且影响很大)

Optimization 针对ARM的优化:为什么不同的CPU对不同的算法有不同的影响(而且影响很大),optimization,arm,Optimization,Arm,我在为Windows mobile设备上的代码性能做一些基准测试,并注意到一些算法在某些主机上表现得明显更好,而在其他主机上表现得更差。当然,考虑到时钟速度的差异 供参考的统计信息(所有结果均由Visual Studio 2005针对ARMv4编译的相同二进制文件生成): 英特尔XScale PXA270 算法A:22642毫秒 算法B:29271毫秒 ARM1136EJ-S内核(嵌入MSM7201A芯片) 算法A:24874毫秒 算法B:29504毫秒 ARM926EJ-S内核(嵌入O

我在为Windows mobile设备上的代码性能做一些基准测试,并注意到一些算法在某些主机上表现得明显更好,而在其他主机上表现得更差。当然,考虑到时钟速度的差异

供参考的统计信息(所有结果均由Visual Studio 2005针对ARMv4编译的相同二进制文件生成):

英特尔XScale PXA270

  • 算法A:22642毫秒
  • 算法B:29271毫秒
ARM1136EJ-S内核(嵌入MSM7201A芯片)

  • 算法A:24874毫秒
  • 算法B:29504毫秒
ARM926EJ-S内核(嵌入OMAP 850芯片)

  • 算法A:70215毫秒
  • 算法B:31652毫秒(!)
我将浮点作为一个可能的原因进行了检查,虽然算法B使用浮点代码,但它不从内部循环使用它,而且似乎没有一个内核具有FPU

因此,我的问题是,是什么机制导致了这种差异,最好是就如何修复/避免问题中的瓶颈提出建议


提前感谢。

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

这个测试在测试中的任何时候都使用任何共享库,还是全部使用内部代码?在不同平台(即使是同一张sd卡)的介质上获取共享库


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

一个可能的原因是926的管道较短(1136、iirc为5个周期,而1136、iirc为8个周期),因此926的分支预测失误成本较低


也就是说,这些处理器之间存在着许多架构上的差异,很难说清楚为什么您在不了解实际执行的指令的情况下看到这种效果。

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

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


进一步分解代码,不仅仅是作为算法,而是在块级别,并尝试理解导致瓶颈的块。找到导致瓶颈的块后,尝试反汇编该块的源代码,并检查程序集。这可能会有帮助。

看起来问题出在缓存设置或与内存相关的内容中(可能是I-cache“溢出”)。 管道暂停、分支未命中预测通常给出的差异不太显著

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

  • “简单”算术/位运算(+-|^&)和按常数移位的次数
  • 按变量列出的班次数
  • 乘法次数
  • “硬”算术运算数(除法、浮点运算)
  • 对齐内存读取数(32位)
  • 字节内存读取数(8位)(比32位慢)
  • 对齐内存写入数(32位)
  • 字节内存写入数(8位)
  • 分支机构数量
  • 还有一件事,不记得了:)
  • 你会得到信息,事情会变得更慢。在此之后,您可以检查可疑的块,使它们的使用更加频繁或更少。你会得到答案的

    此外,在VS中启用程序集列表生成并使用它(而不是您的高级源代码)作为研究的基础要好得多


    p、 可能是操作系统/软件/固件的问题?你在清洁系统上测试了吗?操作系统在所有设备上都是一样的?

    听起来第三个处理器对我来说太慢了……我只是猜测,但性能差可能是由于内存布局不同而导致的错误冲突。只是一个较慢的处理器无法解释为什么原来快了50%的算法现在慢了50%。。。通过将内部阵列的维度从2048更改为2048+12以避免缓存关联性问题(感谢starblue的提示),我确实在最坏的情况下减少了8秒,但它并没有涵盖所有问题,因为现在的比率是62秒对31秒。我不认为cpu是问题所在,我运行了一个预测基准测试(I++的测试位16与LSFR的测试位16),它确实表明1136与926相比有很大的损失,926对应于实现(每个项目有大量嵌套的ifs,而有限状态机大部分时间都处于相同的状态)