Hay bibliotecas para esto, en algunos casos. Y, notablemente, hay trucos que puede jugar con datos vectorizados (por ejemplo, cuatro elementos de 32 bits en un vector de 128 bits, pero esto también se aplica a cuatro bytes de 8 bits en un registro de 32 bits) para ir más rápido que el individuo acceso a los elementos.
Para una transposición, la idea estándar es que utilice instrucciones "shuffle", que le permiten crear un nuevo vector de datos a partir de dos vectores existentes, en cualquier orden. Usted trabaja con bloques 4x4 de la matriz de entrada. Así, empezando, tiene:
v0 = 1 2 3 4
v1 = 5 6 7 8
v2 = 9 A B C
v3 = D E F 0
A continuación, se aplican las instrucciones de reproducción aleatoria a los dos primeros vectores (entrelazado sus elementos extraños, A0B0 c0d0 -> ABCD, y el entrelazado sus incluso elementos, 0A0B 0C0D -> ABCD) , y para los dos últimos, para crear un nuevo conjunto de vectores con cada bloque de 2x2 transpuesta:
1 5 3 7
2 6 4 8
9 D B F
A E C 0
Por último, se aplican las instrucciones de reproducción aleatoria a la extraña pareja y la aún par (la combinación de sus primeros pares de elementos, AB00 CD00 -> ABCD, y sus últimos pares, 00AB 00CD -> ABCD), para obtener:
1 5 9 D
2 6 A E
3 7 B F
4 8 C 0
¡Y allí, 16 elementos transpuestos en ocho instrucciones!
Ahora, para bytes de 8 bits en registros de 32 bits, ARM no tiene exactamente instrucciones de mezcla, pero puede sintetizar lo que necesita con turnos y una instrucción SEL (seleccionar), y el segundo conjunto de combinaciones puede hacer en una instrucción con las instrucciones PKHBT (paquete halfword bottom top) y PKHTB (pack halfword top bottom).
Finalmente, si está utilizando un procesador ARM grande con vectorizaciones de NEON, puede hacer algo como esto con vectores de 16 elementos en bloques de 16x16.
¿Podría ser tarea? ;-) – mjv
Eso no es en realidad una transposición de matriz habitual: los mapas de transposición '(fila, col)' a '(col, fila)'. – caf
Pidió ayuda un poquito para saber qué es lo que está incrustándolo. la calcinación con acceso a una GPU podría simplemente usar sus operaciones de productos de puntos fácilmente, por ejemplo. – Pod