1

以下のコードは画像のスケーリングに使用されましたが、パフォーマンスは良くありません。私はググって、コードを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;
    }
4

0 に答える 0