Как изменить порядок векторных данных с использованием встроенных ARM Neon?
Это специально связано с кодировкой ARM Neon SIMD. Я использую ARM Neon instrinsics для определенного модуля в видеодекодере. У меня есть векторизованные данные следующим образом:
В регистре Neon есть четыре 32-битных элемента - скажем, Q0 - размер 128 бит.
3B 3A 1B 1A
Есть еще четыре, 32-битные элементы в другом регистре Neon, скажем Q1, размер которого составляет 128 бит.
3D 3C 1D 1C
Я хочу, чтобы конечные данные были в порядке, как показано ниже:
1D 1C 1B 1A
3D 3C 3B 3A
Какие неоновые объекты могут достичь желаемого порядка данных?
Ответы
Ответ 1
как насчет следующего:
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);
В теории это должно скомпилировать только две команды перемещения, потому что vget_high и vget_low просто переинтерпретируют 128-битные Q-регистры как два 64-битных D-регистра. vcombine otoh просто компилируется на один или два хоста (зависит от распределения регистров).
Oh - и порядок целых чисел в выходе может быть совсем неправильным. Если это так, просто замените аргументы на vcombine_s32.
Ответ 2
Помните, что каждый регистр q состоит из двух d-регистров, например, нижняя часть q0 равна d0 и высокая часть d1. Таким образом, на самом деле, эта операция просто заменяет d0 и d3 (или d1 и d2, это не совсем ясно из вашего представления данных). Существует даже инструкция swap, чтобы сделать это в одной инструкции!
Отказ от ответственности: я не знаю Neon intrinsics (я напрямую код в сборке), хотя я был бы удивлен, если это невозможно сделать с помощью встроенных функций.
Ответ 3
Похоже, вы должны использовать для этого команду VTRN
(например, vtrnq_u32
).
Ответ 4
Пьер прав.
vswp d0, d3
который будет делать.
@Pierre:
Несколько месяцев назад я читал сообщение о NEON в своем блоге. Я был приятно удивлен, что есть кто-то вроде меня - написание ручных оптимизированных ассемблерных кодов, как ARM, так и NEON.
Рад вас видеть.