如何在 SSE 中去交织图像通道
how to deinterleave image channel in SSE
有什么方法可以在 neon 中对 32bpp 图像通道进行去交错处理,类似于以下代码。
//Read all r,g,b,a pixels into 4 registers
uint8x8x4_t SrcPixels8x8x4= vld4_u8(inPixel32);
ChannelR1_32x4 = vmovl_u16(vget_low_u16(vmovl_u8(SrcPixels8x8x4.val[0]))),
channelR2_32x4 = vmovl_u16(vget_high_u16(vmovl_u8(SrcPixels8x8x4.val[0]))), vGaussElement_32x4_high);
基本上我希望所有颜色通道都在单独的向量中,每个向量都有 4 个 32 位元素来做一些计算,但我对 SSE 不是很熟悉并且在 SSE 中找不到这样的指令或者如果有人可以提供更好的方法要做到这一点?非常感谢任何帮助
由于 8 位值是无符号的,您可以通过移位和掩码来完成此操作,就像您对标量代码所做的那样,例如
__m128i vrgba;
__m128i vr = _mm_and_si128(vrgba, _mm_set1_epi32(0xff));
__m128i vg = _mm_and_si128(_mm_srli_epi32(vrgba, 8), _mm_set1_epi32(0xff));
__m128i vb = _mm_and_si128(_mm_srli_epi32(vrgba, 16), _mm_set1_epi32(0xff));
__m128i va = _mm_srli_epi32(vrgba, 24);
请注意,我假设您的 RGBA 元素在 LS 8 位中具有 R 分量,在 MS 8 位中具有 A 分量,但如果它们是相反的字节顺序,您只需更改 vr
/vg
/vb
/va
向量。
有什么方法可以在 neon 中对 32bpp 图像通道进行去交错处理,类似于以下代码。
//Read all r,g,b,a pixels into 4 registers
uint8x8x4_t SrcPixels8x8x4= vld4_u8(inPixel32);
ChannelR1_32x4 = vmovl_u16(vget_low_u16(vmovl_u8(SrcPixels8x8x4.val[0]))),
channelR2_32x4 = vmovl_u16(vget_high_u16(vmovl_u8(SrcPixels8x8x4.val[0]))), vGaussElement_32x4_high);
基本上我希望所有颜色通道都在单独的向量中,每个向量都有 4 个 32 位元素来做一些计算,但我对 SSE 不是很熟悉并且在 SSE 中找不到这样的指令或者如果有人可以提供更好的方法要做到这一点?非常感谢任何帮助
由于 8 位值是无符号的,您可以通过移位和掩码来完成此操作,就像您对标量代码所做的那样,例如
__m128i vrgba;
__m128i vr = _mm_and_si128(vrgba, _mm_set1_epi32(0xff));
__m128i vg = _mm_and_si128(_mm_srli_epi32(vrgba, 8), _mm_set1_epi32(0xff));
__m128i vb = _mm_and_si128(_mm_srli_epi32(vrgba, 16), _mm_set1_epi32(0xff));
__m128i va = _mm_srli_epi32(vrgba, 24);
请注意,我假设您的 RGBA 元素在 LS 8 位中具有 R 分量,在 MS 8 位中具有 A 分量,但如果它们是相反的字节顺序,您只需更改 vr
/vg
/vb
/va
向量。