2013-12-18 3 views
0

Я написал эту очень наивную реализацию NEON для преобразования из RGBA в RGB. Это работает, но мне было интересно, есть ли что-нибудь еще, что я мог бы сделать для дальнейшего улучшения производительности.Оптимизация сборки RGBA-> RGB arm64

Я пробовал играть с размером предварительной выборки и разворачивать петлю немного больше, но характеристики не сильно изменились. Кстати, есть ли какое-либо эмпирическое правило, когда дело доходит до измерения предварительной выборки? Я не мог найти ничего полезного в сети. Кроме того, в «Обзор набора инструкций ARMv8» я вижу, что есть также предварительная выборка для магазина, как это полезно?

В настоящее время я получаю около 1,7 мс для преобразования изображения 1280х720 на iPhone5.

// 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 

ответ

5

Первый (так я предполагаю, что вы ориентируетесь IOS), vImage (часть Accelerate.framework) обеспечивает для вас это преобразование, так как vImageConvert_RGBA8888toRGB888. Это имеет то преимущество, что доступно для всех систем iOS и OS X, поэтому вам не нужно писать отдельные реализации для arm64, armv7s, armv7, i386, x86_64.

Теперь, возможно, вы пишете это преобразование как упражнение самостоятельно, а не потому, что просто не знаете, что он уже доступен. В этом случае:

  • Избегайте использования ld[34] или st[34]. Они удобны, но в целом медленнее, чем использование ld1 и перестановка.
  • Для обычных шаблонов доступа к данным, как это, ручная предварительная выборка не требуется.
  • нагрузка четыре 16b RGBA векторов с ld1.16b, выделить три 16b RGB векторов из них с тремя tbl.16b инструкциями и хранить их с st1.16b
  • Альтернативны, попробуйте использовать без временных нагрузок и магазины (ldnp/stnp), в качестве изображения размер слишком большой, чтобы поместиться в кешках.

Наконец, чтобы ответить на ваш вопрос: подсказка для препринтов для магазинов в первую очередь полезна, поскольку некоторые реализации могут иметь значительный лад для частичной записи строки, которая пропускает кеш. Особенно простые реализации могут иметь стойло для любой записи, которая пропускает кеш.

+0

Тестирование на iPad Mini Retina (процессор Apple A7), похоже, указывает на невременную подсказку для хранения, которая не влияет на производительность. – BitBank

+0

@BitBank: условия, при которых невременные магазины приносят пользу, несколько сложны для характеристики. Важно помнить, что одним из их самых больших преимуществ является то, что они не выделяют во внутренний кеш, а это означает, что их влияние иногда наблюдается только в коде, который окружает цикл, который был изменен для их использования. Мое руководство действительно «пробует их, измеряет всю производительность программы, и если они дают улучшение, используйте их». –

+0

Я пришел к такому выводу, проверив функцию, которая записывает в буфер изображения больше, чем кэш L2. Данные записываются и не упоминаются снова до конца. Это казалось идеальным вариантом, чтобы попробовать «потоковой» вариант инструкции магазина. Мне нужно проверить это на Nvidia K1 Denver, чтобы узнать, отличается ли поведение от Apple A7. Скоро обновится ... – BitBank

2

См. Также vImageFlatten_RGBA8888toRGB888, если вы хотите, чтобы что-то интересное сделало с альфа-каналом, кроме того, чтобы вытащить его через плечо.