Как я могу переупорядочить векторные данные, используя внутренние вручную рук?
-
26-09-2019 - |
Вопрос
Это специально связано с кодированием ARM Neon SIMD. Я использую UniNInsics ARM Neon для определенного модуля в видеокодере. У меня есть векторизованные данные следующим образом:
В неоновом регистре есть четыре 32-битных элемента - скажем, Q0 - который имеет размер 128 бит.
3B 3A 1B 1A
Есть еще четыре, 32-битные элементы в другом неоновом регистре, говорят Q1, который имеет размер 128 бит.
3D 3C 1D 1C
Я хочу, чтобы конечные данные были в порядке, как показано ниже:
1D 1C 1B 1A
3D 3C 3B 3A
Какие неоновые инструменты могут достичь желаемого заказа данных?
Решение
Как насчет чего-то вроде этого:
int32x4_t q0, q1;
/* split into 64 bit vectors */
int32x2_t q0_hi = vget_high_s32 (q0);
int32x2_t q1_hi = vget_high_s32 (q1);
int32x2_t q0_lo = vget_low_s32 (q0);
int32x2_t q1_lo = vget_low_s32 (q1);
/* recombine into 128 bit vectors */
q0 = vcombine_s32 (q0_lo, q1_lo);
q1 = vcombine_s32 (q0_hi, q1_hi);
Теоретически это должно составить только для двух инструкций по перемещению, потому что Vge_High и Vget_low просто Reinterpret 128 бит-реестров Q в качестве двух реестров 64 бита D. VCombine OTOH просто компилируется до одного или двух ходов (зависит от распределения регистра).
OH - и порядок целых чисел на выходе может быть совершенно неправильным образом. Если это так, просто поменяйте аргументы VCombine_S32.
Другие советы
Помните, что каждый регистр Q состоит из двух регистров D, например, низкая часть Q0 представляет собой D0 и высокую часть D1. Таким образом, на самом деле эта операция просто замена D0 и D3 (или D1 и D2, она не совсем понятна из вашей презентации данных). Есть даже инструкция подкачки, чтобы сделать это в одной инструкции!
Отказ от ответственности: Я не знаю неоновых вторжений (я непосредственно код в Собрании), хотя бы я был удивлен, если это не может быть сделано, используя внутренние лица.
Похоже, вы должны быть в состоянии использовать VTRN
инструкция (например, vtrnq_u32
) за это.
Пьер прав.
vswp d0, d3
что будет делать.
@Pierre: я прочитал сообщение о Neon в своем блоге несколько месяцев назад. Я был приятно удивлен, что у меня есть кто-то, как я - писать ручные оптимизированные коды сборки, обе руки и неона. Рад вас видеть.