Как изменить порядок векторных данных, используя встроенные функции ARM Neon? - PullRequest
10 голосов
/ 11 апреля 2010

Это особенно относится к кодированию ARM Neon SIMD. Я использую функции ARM Neon для определенного модуля в видеодекодере. У меня есть векторизованные данные следующим образом:

В неоновом регистре есть четыре 32-битных элемента - скажем, Q0 - размером 128 бит.

3B 3A 1B 1A

В другом неоновом регистре есть еще четыре 32-битных элемента, скажем, Q1, размер которого 128 бит.

3D 3C 1D 1C

Я хочу, чтобы окончательные данные были в порядке, как показано ниже:

1D 1C 1B 1A
3D 3C 3B 3A

Какие неоновые функции могут достичь желаемого порядка данных?

Ответы [ 4 ]

10 голосов
/ 17 апреля 2010

как насчет этого:

  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 просто компилируется за один или два хода (зависит от распределения регистров).

О - и порядок целых чисел в выходных данных может быть совершенно неправильным. Если это так, просто поменяйте местами аргументы vcombine_s32.

4 голосов
/ 12 мая 2010

Помните, что каждый регистр q состоит из двух регистров d, например, нижняя часть q0 - это d0, а верхняя часть - d1. Таким образом, на самом деле эта операция просто меняет d0 и d3 (или d1 и d2, это не совсем понятно из вашего представления данных). Есть даже инструкция подкачки, чтобы сделать это в одной инструкции!

Отказ от ответственности: я не знаю встроенных функций Neon (я непосредственно кодирую в ассемблере), хотя я был бы удивлен, если бы это не могло быть сделано с использованием встроенных функций.

3 голосов
/ 11 апреля 2010

Похоже, вы должны быть в состоянии использовать для этого инструкцию VTRN (например, vtrnq_u32).

2 голосов
/ 31 октября 2011

Пьер прав.

vswp d0, d3

, что будет делать.

@ Пьер: Я прочитал пост о NEON в вашем блоге несколько месяцев назад. Я был приятно удивлен, что есть кто-то вроде меня - пишущий оптимизированные вручную ассемблеры, как ARM, так и NEON. Рад тебя видеть.

...