Je suis en train de réécrire ce morceau de code à l'aide SIMD:En utilisant SIMD, comment puis-je étendre un masque de 8 bits à un masque de 16 bits?
int16_t v;
int32_t a[16];
int8_t b[32];
...
((int16_t *)a[i])[0] = b[i]==1? -v:v;
((int16_t *)a[i])[1] = b[i]==1? -v:v;
Je pensais à l'aide _mm256_cmpeq_epi8
pour générer un vecteur de masque, après que je peux utiliser _mm256_and_si256
et _mm256_andnot_si256
pour effectuer le choix de valeur.
Le problème est que b [i] est un entier de 8 bits alors que v est de 16 bits.
Si le vecteur de masque est comme {0xff, 0x00, 0xff, 0x00...}
, il doit être étendu à {0xffff, 0x0000, 0xffff, 0x0000...}
pour effectuer le choix de la valeur de 16 bits.
Comment puis-je faire cela? (Désolé pour mon anglais)
modifier:
J'ai trouvé la solution avec l'inspiration de this question.
Le _mm256_shuffle_epi256
ne peut fonctionner que sur une bande de 128 bits. J'ai donc cassé le masque _mm256i en 2 registres _mm128i. Ensuite, avec _mm256_broadcastsi128_si256
et _mm256_shuffle_epi256
j'ai obtenu le résultat.