【问题标题】:Raspberry Pi 1 B vs. Raspberry Pi 2 B ASM speed differenceRaspberry Pi 1 B 与 Raspberry Pi 2 B ASM 速度差异
【发布时间】:2016-02-11 09:13:48
【问题描述】:

我有以下代码:

for (short l = j; l < j + input->w_small; l = l + 4){
  add_b = k * input->w_big + l;
  add_s = (k - i) * input->w_small + l - j;

  __asm__ __volatile__(
      "ldr %%r1, [%1];"
      "ldr %%r2, [%2];"
      "usada8 %0, %%r1, %%r2, %0;"
      :"+r" (sad)
      : "r" (input->pic_big + add_b), "r" (input->pic_small + add_s)
      : "r1", "r2"
      );
}

这是图像处理算法的一部分。该应用程序在 RPi 1 B 上运行 29.24 秒,在 RPi 2 B 上运行 7.65 秒,从而实现了 3.82 倍的加速。问题是,为什么?我知道,模型之间存在架构变化,但我没有找到任何关于 USADA8 的参考资料,它应该在 ARMv7 上明显更快。有任何想法吗?

P.S.:不要误会我的意思,我对结果非常满意,只是好奇:)

【问题讨论】:

  • 那些时间真的是只是这个循环(即基于之前和之后的测量值),还是它们也包含其他代码 - 有很多潜力在固有硬件差异之上的代码生成差异,尤其是对于任何纯 C 循环或支持多线程的库代码。
  • 好点。不,时间是针对整个代码的,但这是最耗时的部分。
  • 如果删除 usada8 会发生什么?或尝试其他速度测试?正如上面和下面已经提到的,armv7 vs armv6,这可能是整个答案。时钟速度不同。缓存大小。您是否为每个系统重新编译或使用相同的二进制文件,也许编译器也做了不同的事情。您可以运行裸机并让操作系统不碍事,弄乱 config.txt 并以相同的时钟速率运行,禁用缓存等。

标签: assembly arm raspberry-pi raspberry-pi2


【解决方案1】:

可能有很多原因,但主要的可能是(根据this):

  • 核心频率不一样(2B型900MHz和700MHz 对于模型 1B)
  • 2B 的 L1 缓存是模型 1B 中 L1 缓存大小的两倍(16kB 与 32kB)。我怀疑 L2 缓存和一般来说缓存层次结构也不同。
  • 您可能对两者都有不同的config(您可以调整各种事物的频率)

【讨论】:

  • From a bit of web-scouring,2836 显然使用了 Cortex-A7 集成 L2 缓存,有 512KB,而 2835 只有 ARM11 的 L1 和共享的 128KB 外部系统缓存(据说是独占的) 2836 上的 GPU)。这一点,以及 Cortex-A7 还具有一个步幅检测自动数据预取器这一事实,可能会对像这样的数组遍历代码产生巨大的影响。