使用Neon iOS改进C代码

使用Neon iOS改进C代码,ios,performance,simd,neon,Ios,Performance,Simd,Neon,下面的代码用于缩放图像,但性能不好。我在谷歌上搜索并找到了一些建议,可以将代码转换为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++) {

下面的代码用于缩放图像,但性能不好。我在谷歌上搜索并找到了一些建议,可以将代码转换为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;
    }
}

虽然没有太多证据表明OP在这方面投入了太多的精力,但我认为这仍然是一个潜在的有趣的问题——投票重新打开;几乎可以肯定,其中一个可用的API适合您的需要。查看CoreGraphics、vImage和CoreImage。您还可以看看Brad Larson的GPUImage框架。使用vsubl_u8()内在函数从循环中删除2条指令(vmovl_u8)。您可以在一次拍摄中进行减法和加宽。
        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;
    }