Sto lavorando su una struttura dati in cui ho una matrice di 16 uint64. Essi sono disposti come questo in memoria (ciascuno di seguito rappresenta una singola int64):Algoritmo SIMD ottimale per ruotare o trasporre una matrice
A0 A1 A2 A3 B0 B1 B2 B3 C0 C1 C2 C3 D0 D1 D2 D3
Il risultato desiderato è quello di trasporre la matrice in questo:
A0 B0 C0 D0 A1 B1 C1 D1 A2 B2 C2 D2 A3 B3 C3 D3
La rotazione della matrice 90 gradi è anche una soluzione accettabile per il ciclo futuro:
D0 C0 B0 A0 D1 C1 B1 A1 D2 C2 B2 A2 D3 C3 B3 A3
ho bisogno di questo per operare sulla freccia veloce a un punto successivo (lo attraversano in successione con un altro viaggio SIMD, 4 alla volta).
Finora, ho provato a "fondere" i dati caricando un vettore di 4 x 64 bit di A, mascherando e mischiando gli elementi OR e facendolo con B's etc e quindi ripetendolo per C's ... Sfortunatamente, questo è 5 x 4 istruzioni SIMD per segmento di 4 elementi nell'array (un carico, una maschera, uno shuffle, uno o con l'elemento successivo e infine un negozio). Sembra che dovrei essere in grado di fare meglio.
Ho AVX2 disponibile e io una compilazione con clang.
'C1 C1' è un refuso? Si prega di mostrare l'output corretto. – 2501
Spiacente, errore ... Sì, voglio trasporre la matrice (ruotarla di 90 gradi) –
Fammi vedere se capisco la tua domanda. Vuoi trasporre una matrice 4x4 di uint64? –