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
__m256
warum 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