我编写了这个非常简单的 NEON 实现来从 RGBA 转换为 RGB。它有效,但我想知道是否还有其他方法可以进一步提高性能。
我尝试使用预取大小并进一步展开循环,但性能并没有太大变化。顺便说一句,在预取维度方面是否有任何经验法则?我在网上找不到任何有用的东西。此外,在“ARMv8 指令集概述”中,我看到还有一个用于存储的预取,这有什么用?
目前我在 iPhone5s 上转换 1280x720 图像需要大约 1.7 毫秒。
// unsigned int * rgba2rgb_neon(unsigned int * pDst, unsigned int * pSrc, unsigned int count);
_rgba2rgb_neon:
cmp w2, #0x7
b.gt loop
mov w0, #0
ret
loop:
prfm pldl1strm, [w1, #64]
ld4.8b {v0, v1, v2, v3}, [w1], #32
ld4.8b {v4, v5, v6, v7}, [w1], #32
prfm pldl1strm, [w1, #64]
st3.8b {v0, v1, v2}, [w0], #24
st3.8b {v4, v5, v6}, [w0], #24
subs w2, w2, #16
b.gt loop
done:
ret