Raspberry Pi 2 NEON 内联汇编指令不起作用

Raspberry Pi 2 NEON inline assembly instruction not working

我试图让我的旧代码 运行 更快,正如我发现的那样,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 变量与 sad_intermediary 求和。

主要目标是计算绝对差的和,所以我从big_pic加载16 B到q1寄存器,从small_pic加载16 B到q2寄存器,计算SAD到q0,然后将 q0 的低 8 B 加载到中间变量中。问题是,结果 sad 为零。

我使用 GCC 4.9.2-std=c99 -pthread -O3 -lm -Wall -march=armv7-a -mfpu=neon- vfpv4 -mfloat-abi=hard 选项。

您是否发现代码有任何问题?谢谢

您永远不会将任何内容加载到 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);

(请注意,此代码仅适用于八个字节,因为您在代码中只保存了八个字节)