以下のコードは画像のスケーリングに使用されましたが、パフォーマンスは良くありません。私はググって、コードをNeon ASMに変換してパフォーマンスを向上させるためのアドバイスを見つけました。
inline void insetw32(char *pb_dst, char *pb_pFore, char *pb_pBack, char *pmix, int w)
{
register char bbm = (char)(pmix[0]<<24>>24);
for(int i = 0;i< w;i++)
{
*pb_dst++ = (((*pb_pFore++ - *pb_pBack++) * bbm)>>8) + *pb_pBack;
*pb_dst++ = (((*pb_pFore++ - *pb_pBack++) * bbm)>>8) + *pb_pBack;
*pb_dst++ = (((*pb_pFore++ - *pb_pBack++) * bbm)>>8) + *pb_pBack;
*pb_dst++ = (((*pb_pFore++ - *pb_pBack++) * bbm)>>8) + *pb_pBack;
}
}
コードを NEON で翻訳しようとしました。パフォーマンスは C 言語より 2 倍高速ですが、MMX を使用した同じコードは x86 プラットフォームで 4 倍速くなります。それを改善する他の良い方法はありますか? または、NEON コードに誤りがありますか?
uint8x8_t fac1 = vdup_n_u8(bbm);
int16x8_t fac = vmovl_u8(fac1);
w /= 2; // 8/ 4
while (w--)
{
int8x8_t temp8;
int16x8_t temp16;
uint8x8_t rgbaFore = vld1_u8(pb_pFore);
uint8x8_t rgbaBack = vld1_u8(pb_pBack);
uint8x8_t rgbaDst = vld1_u8(pb_dst);
int16x8_t fore = vmovl_u8(rgbaFore);
int16x8_t back = vmovl_u8(rgbaBack);
temp16 = vsubq_s16(fore, back);
temp16 = vmulq_s16(temp16, fac);
temp8 = vshrn_n_s16(temp16, 8);
temp8 = vadd_u8(temp8, rgbaBack);
vst1_u8(pb_dst, temp8);
pb_dst += 8;
pb_pFore += 8;
pb_pBack += 8;
}