Как я могу переупорядочить векторные данные, используя внутренние вручную рук?

StackOverflow https://stackoverflow.com/questions/2616274

  •  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 в своем блоге несколько месяцев назад. Я был приятно удивлен, что у меня есть кто-то, как я - писать ручные оптимизированные коды сборки, обе руки и неона. Рад вас видеть.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top