Миграция SSE2 на вооружение NEON intrinsincs - PullRequest
1 голос
/ 26 сентября 2011

У меня есть следующий код в SSE2 intrinsincs.Он обрабатывает входные данные из Kinect.

__m128i md = _mm_setr_epi16((r0<<3)  | (r1>>5), ((r1<<6)  | (r2>>2) ), ((r2<<9)  | (r3<<1) | (r4>>7) ), ((r4<<4)  | (r5>>4) ), ((r5<<7)  | (r6>>1) ),((r6<<10) | (r7<<2) | (r8>>6) ), ((r8<<5)  | (r9>>3) ), ((r9<<8)  | (r10)   ));
md = _mm_and_si128(md, mmask);
__m128i mz = _mm_load_si128((__m128i *) &depth_ref_z[i]);
__m128i mZ = _mm_load_si128((__m128i *) &depth_ref_Z[i]);
mz = _mm_cmpgt_epi16(md, mz);
mZ = _mm_cmpgt_epi16(mZ, md);
mz = _mm_and_si128(mz, mZ);
md = _mm_and_si128(mz, md);
_mm_store_si128((__m128i *) frame,md)
if(_mm_movemask_epi8(mz)){ ... }

Это в основном распаковывает 11 uint8_t (r0-r10) в 8 uint16_t в регистре SSE (mmask является константой и создается ранее).Затем он загружает еще два регистра с соответствующими элементами из двух массивов, которые служат границами.Он проверяет их и создает регистр, в котором обнуляются элементы, которые не соответствуют критериям.Затем он сохраняет их и переходит к дальнейшей обработке каждого элемента.Маска перемещения служит хорошей оптимизацией, когда ни один из элементов не проходит, и в этом случае обработка может быть пропущена.

Это хорошо работает, и теперь я хочу перенести его на NEON.Большая часть этого проста, кроме двух частей.Глядя на вывод ассемблера (gcc) из кода SSE2, я вижу, что вместо выполнения 8 ходов uint16_t в _mm_setr_epi16 он сдвигается и направляет их в uint32_t и, наконец, выполняет 4 хода.Это кажется эффективным, и поскольку компилятор позаботился об этом, я не изменил код.Должен ли я применить это вручную в случае НЕОН?Вместо 8 vsetq_lane_u16 сделать сдвиг и выполнить 4 vsetq_lane_u32?Будут ли у меня какие-либо проблемы с порядком байтов, и будет ли это стоить?

Последняя часть - маска перемещения, так как я не смог найти эквивалент.Кто-нибудь может подсказать что-нибудь?

1 Ответ

1 голос
/ 23 февраля 2012

Я бы предпочел начать с простого кода на C вместо SSE2; на этом низком уровне могут быть возможности оптимизации, которые нелегко увидеть

...