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