Question

Ceci est lié spécifiquement à ARM codage Neon SIMD. J'utilise ARM Neon instrinsics pour certains modules dans un décodeur vidéo. J'ai données vectorisés comme suit:

Il y a quatre éléments 32 bits dans un registre de Neon - dire, Q0 - ce qui est de la taille de 128 bits.

3B 3A 1B 1A

Il y a quatre autres, 32 éléments binaires dans un autre registre de Neon dire Q1 qui est de taille 128 bits.

3D 3C 1D 1C

Je veux que les données finales soient en ordre, comme indiqué ci-dessous:

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

Qu'est-ce que Neon instrinsics peut atteindre l'ordre de données désiré?

Était-ce utile?

La solution

Que diriez-vous quelque chose comme ceci:

  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);

En théorie, cela devrait compiler à seulement deux instructions de mouvement parce que la vget_high et vget_low juste réinterprètent les registres Q 128 bits comme deux 64 registres bit D. vcombine OTOH juste compile une ou deux coups (dépend de l'allocation de registres).

Oh - et l'ordre des entiers dans la sortie pourrait être exactement dans le mauvais sens. Si oui échanger simplement les arguments vcombine_s32.

Autres conseils

Rappelez-vous chaque registre de q est constitué de deux registres d, par exemple la partie basse de q0 est d0 et d1 la partie haute. Donc, en fait, cette opération est simplement swapping d0 et d3 (ou d1 et d2, il est pas tout à fait claire de votre présentation de données). Il y a même une instruction d'échange de le faire dans une instruction!

Disclaimer: Je ne sais pas Neon (intrinsics I code directement dans l'assemblage), mais je serais surpris si cela ne pouvait être fait en utilisant intrinsics

.

Il semble que vous devriez être en mesure d'utiliser l'instruction VTRN (par exemple vtrnq_u32) pour cela.

Pierre est juste.

vswp d0, d3

qui va faire.

@Pierre: J'ai lu le post sur NEON sur votre blog il y a plusieurs mois. J'ai été agréablement surpris qu'il y avait quelqu'un comme moi - écrire des codes d'assemblage optimisés à la main, à la fois ARM et NEON. Ravi de vous voir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top