Ich arbeite an einer Datenstruktur, wo ich ein Array von 16 Uint64 habe. Sie sind wie diese in dem Speicher angelegt (die jeweils unter einer einzigen int64 darstellt):Optimaler SIMD-Algorithmus zum Drehen oder Transponieren eines Arrays
A0 A1 A2 A3 B0 B1 B2 B3 C0 C1 C2 C3 D0 D1 D2 D3
Das gewünschte Ergebnis ist die Matrix in dieser transponieren:
A0 B0 C0 D0 A1 B1 C1 D1 A2 B2 C2 D2 A3 B3 C3 D3
Die Drehung der Anordnung 90 Grad ist auch eine akzeptable Lösung für die Zukunft Schleife:
D0 C0 B0 A0 D1 C1 B1 A1 D2 C2 B2 A2 D3 C3 B3 A3
ich brauche dies, um auf dem Pfeil schnell zu einem späteren Zeitpunkt (Traverse es die Reihe nach mit einer anderen SIMD Reise, 4 zu einem Zeitpunkt) zu betreiben.
Bisher habe ich versucht, die Daten zu "mixen", indem ich einen 4 x 64 Bit Vektor von A's hochlade, die Elemente maskierte und mischte und sie mit B's orderte und dann für C's wiederholte ... Leider sind dies 5 x 4 SIMD-Befehle pro Segment von 4 Elementen in dem Array (ein Laden, eine Maske, ein Shuffle, ein oder mit dem nächsten Element und schließlich ein Speicher). Es scheint, ich sollte es besser machen können.
Ich habe AVX2 verfügbar und ich kompiliere mit clang.
'C1 C1' ist das ein Tippfehler? Bitte zeigen Sie die korrekte Ausgabe an. – 2501
Sorry, Tippfehler ... Ja, ich möchte die Matrix transponieren (um 90 Grad drehen) –
Lassen Sie mich sehen, ob ich Ihre Frage verstehe. Sie möchten eine 4x4-Matrix von uint64 transponieren? –