Я написал эту очень наивную реализацию NEON для преобразования из RGBA в RGB. Это работает, но мне было интересно, есть ли что-нибудь еще, что я мог бы сделать для дальнейшего улучшения производительности.
Я попытался поиграть с размером предварительной выборки и немного развернуть цикл, но производительность не сильно изменилась. Кстати, есть ли какое-нибудь практическое правило, когда дело доходит до измерения предварительной выборки? В сети ничего полезного не нашел. Кроме того, в «Обзоре набора инструкций ARMv8» я вижу также предварительную выборку для хранилища, чем это полезно?
В настоящее время я получаю около 1,7 мс для преобразования изображения 1280x720 на iPhone5s.
// 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