Pregunta

Esto está específicamente relacionado con ARM Neon SIMD codificación. Estoy usando instrinsics ARM de neón por un módulo determinado en un decodificador de vídeo. Tengo un conjunto de datos vectorizada de la siguiente manera:

Hay cuatro elementos de 32 bits en un registro de neón - por ejemplo, Q0 - que es de un tamaño de 128 bits.

3B 3A 1B 1A

Hay otros cuatro, elementos 32 bits en otro ejemplo Q1 registro de neón, que es de un tamaño de 128 bits.

3D 3C 1D 1C

Quiero los datos finales a estar en orden, como se muestra a continuación:

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

Lo que instrinsics neón puede lograr el fin deseado de datos?

¿Fue útil?

Solución

¿qué tal algo como esto:

  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 teoría, esto debería compilar a sólo dos instrucciones de movimiento debido a que el vget_high y vget_low simplemente reinterpretan los registros Q 128 bits como dos registros de 64 bits D. vcombine Otoh compila sólo a uno o dos movimientos (depende de la asignación de registros).

Oh - y el orden de los números enteros en la salida podría ser exactamente al revés. Si es así simplemente intercambiar los argumentos a vcombine_s32.

Otros consejos

Recuerde cada registro q se compone de dos registros D, por ejemplo la parte baja de q0 es d0 y el alto d1 parte. Así que, de hecho, esta operación se acaba intercambiando D0 y D3 (o D1 y D2, no está del todo claro a partir de la presentación de datos). Incluso hay una instrucción de intercambio de hacerlo en una sola instrucción!

exención de responsabilidad:. No sé intrínsecos de neón (I Código directamente en el montaje), aunque me sorprendería si esto no se podía hacer uso de las características intrínsecas

Parece que debería ser capaz de utilizar la instrucción VTRN (por ejemplo vtrnq_u32) para esto.

Pierre es correcta.

VSWP d0, d3

que va a hacer.

@Pierre: He leído el post acerca de neón en tu blog hace varios meses. Me sorprendió gratamente que había alguien como yo - escritura a mano optimizados ensamblaje códigos, la ARM y neón. Es bueno verte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top