Como faço para reordenar dados vetoriais usando o Intrinsics de néon do ARM?
-
26-09-2019 - |
Pergunta
Isso está especificamente relacionado à codificação do ARM Neon SIMD. Estou usando o ARM Neon Instrinsics para determinado módulo em um decodificador de vídeo. Eu tenho dados vetorizados da seguinte maneira:
Existem quatro elementos de 32 bits em um registro de néon - digamos, Q0 - que é de tamanho 128 bits.
3B 3A 1B 1A
Existem outros elementos de quatro, 32 bits em outro registro de neon, digamos Q1, que é do tamanho de 128 bits.
3D 3C 1D 1C
Eu quero que os dados finais estejam em ordem, como mostrado abaixo:
1D 1C 1B 1A
3D 3C 3B 3A
O que o Neon Instrinsics pode alcançar a ordem de dados desejada?
Solução
Que tal algo como isso:
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);
Em teoria, isso deve compilar apenas duas instruções de mover, porque o VGET_HIGH e o VGET_LOW apenas reinterpretam os registros Q de 128 bits como dois registros de 64 bits D. O VCombine OTOH apenas compila com um ou dois movimentos (depende da alocação de registro).
Oh - e a ordem dos números inteiros na saída pode ser exatamente a maneira errada. Nesse caso, basta trocar os argumentos para VCombine_S32.
Outras dicas
Lembre -se de que cada registro Q é composto por dois registros D, por exemplo, a parte baixa do Q0 é D0 e a alta parte D1. Portanto, essa operação está apenas trocando D0 e D3 (ou D1 e D2, ela não está totalmente clara na apresentação de dados). Existe até uma instrução de troca para fazê -lo em uma instrução!
Isenção de responsabilidade: não conheço a Intrinsics Neon (codio diretamente a Assembly), embora fique surpreso se isso não pudesse ser feito usando o Intrinsics.
Parece que você deve poder usar o VTRN
Instrução (por exemplo vtrnq_u32
) por esta.
Pierre está certo.
VSWP D0, D3
que vai fazer.
@Pierre: Eu li o post sobre Neon em seu blog há vários meses. Fiquei agradavelmente surpreso que houvesse alguém como eu - escrevendo códigos de montagem otimizados à mão, tanto braço quanto neon. É bom te ver.