So drehen Sie einen SSE/AVX-Vektor

Lesezeit: 2 Minuten

Benutzer-Avatar
Benutzer1584773

Ich muss eine Rotationsoperation mit so wenig Taktzyklen wie möglich durchführen. Nehmen wir im ersten Fall an __m128i als Quell- und Zieltyp:

source: || A0 || A1 || A2 || A3 ||
  dest: || A1 || A2 || A3 || A0 ||
dest = (__m128i)_mm_shuffle_epi32((__m128i)source, _MM_SHUFFLE(0,3,2,1));

Jetzt möchte ich dasselbe mit AVX Intrinsic machen. Also nehmen wir diesmal an __m256i als Quell- und Zieltyp:

source: || A0 || A1 || A2 || A3 || A4 || A5 || A6 || A7 ||
  dest: || A1 || A2 || A3 || A4 || A5 || A6 || A7 || A0 ||

Den AVX-Intrinsics fehlen die meisten der entsprechenden SSE-Integer-Operationen. Vielleicht gibt es einen Weg, die gewünschte Ausgabe mit der Gleitkommaversion zum Laufen zu bringen.

Ich habe es 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 ||

Irgendeine Idee, wie man das effizient lösen kann? (ohne SSE- und AVX-Betrieb zu mischen und ohne “manuelles” Invertieren A0 und A1

Danke im Voraus!

  • Habe nicht viel Erfahrung mit SSE und AVX, aber in der zweiten Codezeile, wenn Zieltyp ist __m256warum wirfst du zu __m128i?

    – dario_ramos

    10. August 2012 um 18:05 Uhr

  • Natürlich war es __m256i, danke!

    – Benutzer1584773

    10. August 2012 um 18:14 Uhr

  • Nein, ich habe nur beim Ausschneiden und Einfügen einen Fehler gemacht.

    – Benutzer1584773

    11. August 2012 um 1:03 Uhr

  • Scheint, als seien alle nützlichen Anweisungen in AVX2 enthalten (warum haben sie diese nicht veröffentlicht Erste?)

    – Harald

    11. August 2012 um 9:01 Uhr

  • Irgendeine Chance auf eine Erklärung der 2 Sofortige, die Sie in der zweiten Zeile passieren? (1 und 136) Ich habe die Dokumentation gelesen, verstehe aber immer noch nicht, warum diese bestimmten Werte das sind, was Sie dafür wollen.

    – Orvid König

    14. Mai 2014 um 19:44 Uhr

  • @OrvidKing: permute2f128(tmp,tmp,1) tauscht die obere und untere 128b-Spur. 136 = 0x88 = nimm das hohe Element von einem Vektor, andere Elemente von dem anderen (also 0x8 in jeder Spur, weil blendps verwendet die beiden Hälften der imm8 für die zwei Fahrspuren.)

    – Peter Cordes

    10. September 2015 um 7:15 Uhr

1197050cookie-checkSo drehen Sie einen SSE/AVX-Vektor

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy