Ich versuche, dieses Stück Code neu zu schreiben SIMD mit:Wie kann ich mithilfe von SIMD eine 8-Bit-Maske zu einer 16-Bit-Maske erweitern?
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;
Ich dachte _mm256_cmpeq_epi8
der Verwendung einer Maske Vektor zu erzeugen, danach habe ich _mm256_and_si256
und _mm256_andnot_si256
verwenden können, um den Wert Wahl durchzuführen.
Das Problem ist b [i] ist 8-Bit-Ganzzahl, während v 16-Bit ist.
Wenn der Maskenvektor wie {0xff, 0x00, 0xff, 0x00...}
ist, muss er auf {0xffff, 0x0000, 0xffff, 0x0000...}
erweitert werden, um den 16-Bit-Wert auszuwählen.
Wie kann ich das tun? (Sorry für mein Englisch)
edit:
ich die Lösung mit der Inspiration von this question gefunden.
Die _mm256_shuffle_epi256
kann nur innerhalb von 128-Bit-Lane ausführen. Also brach ich die _mm256i Maske in 2 _mm128i Register. Dann habe ich mit _mm256_broadcastsi128_si256
und _mm256_shuffle_epi256
das Ergebnis bekommen.