[英]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.