我试图让我的旧代码运行得更快,因为我发现,RPi 2处理器支持NEON指令。所以我写了这段代码:
__asm__ __volatile__(
"vld1.8 {%%d2, %%d3}, [%1];"
"vld1.8 {%%d4, %%d5}, [%2];"
"vaba.u8 %%q0, %%q1, %%q2;"
"vst1.64 %%d0, [%0];"
: "=r" (address_sad_intermediary)
: "r" (address_big_pic), "r" (address_small_pic)
:
);
然后在C中,主要的悲伤变量与sad_intermediary相加。
主要目标是计算绝对差值之和,因此我将big_pic中的16 B加载到q1寄存器中,将16 B从small_pic加载到q2寄存器中,将SAD计算为q0,然后将较低的8 B从q0加载到中介变量。问题是,由此产生的悲伤是零。
我使用 GCC 4.9.2 与 -std = c99 -pthread -O3 -lm -Wall -march = armv7-a -mfpu = neon-vfpv4 -mfloat-abi = hard 选项。
你看到代码有什么问题吗?感谢。
答案 0 :(得分:1)
你永远不会将任何东西加载到q0中,所以vaba
正在为未初始化的寄存器添加绝对差值。看起来你还没有声明你正在修改哪些寄存器。
但我不知道这是否是你问题的原因,因为我对内联汇编不太方便。不过,你可能不应该使用内联汇编来做这样的事情。如果使用intrinsics,则编译器具有更强的优化代码的能力。像这样:
#include <arm_neon.h>
...
uint8x8_t s = vld1_u8(address_sad_intermediary);
s = vaba_u8(s, vld1_u8(address_big_pic), vld1_u8(address_small_pic));
vst1_u8(address_sad_intermediary, s);
(请注意,此代码仅适用于8个字节,因为您只在代码中保存了8个字节)