【发布时间】: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