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?)
InformationsquelleAutor user1584773 | 2012-08-10
Schreibe einen Kommentar