J'ai une boucle qui effectue quelques calculs et stocke ensuite les bits de signe dans un vecteur :
uint16x8_t rotate(const uint16_t* x);
void compute(const uint16_t* src, uint16_t* dst)
{
uint16x8_t sign0 = vmovq_n_u16(0);
uint16x8_t sign1 = vmovq_n_u16(0);
for (int i=0; i<16; ++i)
{
uint16x8_t r0 = rotate(src++);
uint16x8_t r1 = rotate(src++);
// pseudo code:
sign0 |= (r0 >> 15) << i;
sign1 |= (r1 >> 15) << i;
}
vst1q_u16(dst+1, sign0);
vst1q_u16(dst+8, sign1);
}
Quelle est la meilleure façon d'accumuler les bits de signe dans le néon qui suit ce pseudo-code ?
r0 = vshrq_n_u16(r0, 15);
r1 = vshrq_n_u16(r1, 15);
sign0 = vsraq_n_u16(vshlq_n_u16(r0, 15), sign0, 1);
sign1 = vsraq_n_u16(vshlq_n_u16(r1, 15), sign1, 1);
Notez également que le "pseudo-code" fonctionne réellement et génère à peu près le même code en termes de performances. Que peut-on améliorer ici ? Notez que dans le code réel il n'y a pas d'appels de fonction dans la boucle, j'ai réduit le code réel pour le rendre plus simple à comprendre. Un autre point : dans neon, vous ne pouvez pas utiliser une variable pour le décalage de vecteur (par ex. i
ne peut pas être utilisé pour spécifier le nombre d'équipes).