2 votes

Accumuler efficacement les bits de signe dans le néon du bras

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 ?

Voici ce que j'ai trouvé :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X