Wie dreht man eine SSE - /AVX-Vektor
Ich ausführen muss, um ein drehen der Betrieb mit möglichst wenig Taktzyklen wie möglich.
Im ersten Fall nehmen wir an __m128i
als source-und dest-Typ:
Quelle: || A0 || A1 || A2 || A3 ||
dest: || A1 || A2 || A3 || A0 ||
dest = (__m128i)_mm_shuffle_epi32((__m128i)source, _MM_SHUFFLE(0,3,2,1));
Nun möchte ich das gleiche tun mit AVX-Interna.
Nehmen wir also an, dieses mal __m256i
als source-und dest-Typ:
Quelle: || A0 || A1 || A2 || A3 || A4 || A5 || A6 || A7 ||
dest: || A1 || A2 || A3 || A4 || A5 || A6 || A7 || A0 ||
Den AVX-Interna fehlt den meisten der entsprechenden SSE-integer-Operationen.
Vielleicht gibt es doch eine Möglichkeit gehen, den gewünschten Ausgang arbeiten mit den floating-point-version.
Habe ich versucht mit:
dest = (__m256i)_mm256_shuffle_ps((__m256)source, (__m256)source, _MM_SHUFFLE(0,3,2,1));
aber was ich bekomme ist:
|| A0 || A2 || A3 || A4 || A5 || A6 || A7 || A1 ||
Jede Idee, wie dieses Problem zu lösen in ein effizient Weise? (ohne zu mischen, SSE-und AVX-Betrieb und ohne "manuell" invertieren A0
und A1
Vielen Dank im Voraus!
- Habe nicht viel Erfahrung mit SSE und AVX, aber in der zweiten code-Zeile, wenn dest-Typ ist
__m256
, warum sind Sie Gießen zu__m128i
? - Natürlich war es __m256i, danke!
- Tat, das problem zu beheben?
- Nein, ich ging einfach Los mit cut&paste..
- Scheint, wie alle die nützliche Hinweise sind in AVX2 (warum haben Sie nicht Version, einer der ersten?)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Lösung:
blendps
setzt die beiden Hälften desimm8
für die zwei Fahrspuren.)Habe ich noch nicht geprüft, wie die Dinge sind mit AVX, aber zumindest für SSE, haben Sie halten
_mm_align*
?Zum Beispiel, dies wird ein byte-Vektor durch 2 bytes:
Dies kann eine einzelne Anweisung. Auch solche Operationen sind lat-1 /tp-1, d.h. schnell.
AVX ist wahrscheinlich ein bisschen ein Problem mit diesem Ansatz ist eine Anpassung möglicherweise nicht nützlich sein.