簡體   English   中英

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加載到中間變量中。 問題是,由此產生的悲傷為零。

我將GCC 4.9.2-std = c99 -pthread -O3 -lm -Wall -march = armv7-a -mfpu = neon-vfpv4 -mfloat-abi = hard選項一起使用。

您看到代碼有什么問題嗎? 謝謝。

您永遠不會將任何內容加載到q0中,因此vaba絕對差添加到未初始化的寄存器中。 看起來您好像沒有在聲明要修改的寄存器。

但是我不知道這是否是導致您出現問題的原因,因為我對內聯匯編不太方便。 但是,您可能不應該將內聯匯編用於這樣的事情。 如果使用內在函數,則編譯器具有更大的能力來優化代碼。 像這樣:

#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);

(請注意,此代碼僅適用於八個字節,因為您僅在代碼中保存了八個字節)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM