Las instrucciones de permutación (y mezcla), parte de la manipulación de bits así como del procesamiento de vectores , copian contenidos inalterados de una matriz de origen a una matriz de destino, donde los índices se especifican mediante una segunda matriz de origen. [1] El tamaño (ancho de bits) de los elementos de origen no está restringido, pero sigue siendo el mismo que el tamaño de destino.
Existen dos variantes de permutación importantes, conocidas como gather y scatter, respectivamente. La variante gather es la siguiente:
para i = 0 hasta longitud - 1 dest [ i ] = src [ índices [ i ]]
donde la variante de dispersión es:
para i = 0 hasta longitud - 1 dest [ índices [ i ]] = src [ i ]
Tenga en cuenta que, a diferencia de la recopilación-dispersión basada en memoria, los tres dest
, src
y indices
son registros (o partes de registros en el caso de la permutación a nivel de bits), no ubicaciones de memoria.
Se puede ver que la variante de dispersión "dispersa" los elementos de origen hacia el destino, mientras que la variante de recopilación recopila datos de los elementos de origen indexados.
Dado que los índices pueden repetirse en ambas variantes, el resultado no es una permutación matemática estricta porque pueden aparecer duplicados en el resultado.
También se utiliza un caso especial de permutación en el " swizzling " de GPU (de nuevo, no es estrictamente una permutación) que realiza una reordenación sobre la marcha de los datos del subvector para alinear o duplicar elementos con el carril SIMD apropiado .
Las instrucciones de permutación se dan tanto en procesadores escalares como en motores de procesamiento vectorial y GPU . En los conjuntos de instrucciones vectoriales, se las suele denominar operaciones de "recopilación/dispersión de registros", como en los vectores RISC-V [2], y toman vectores como entrada tanto para los elementos de origen como para la matriz de origen, y dan como salida otro vector.
En los conjuntos de instrucciones escalares, los registros escalares se dividen en secciones más pequeñas (desempaquetadas, estilo SIMD ) donde los fragmentos se utilizan como fuentes de matriz. Los resultados (pequeños, parciales) se concatenan (empaquetan) nuevamente en el registro escalar como resultado.
Algunas ISA, particularmente para aplicaciones criptográficas , incluso tienen operaciones de permutación a nivel de bits , como bdep
(bit deposit) en RISC-V bitmanip; [3] en Power ISA se lo conoce como bpermd
y ha estado incluido durante varias décadas, y todavía está en la especificación Power ISA v.3.0 B. [4]
También en algunas ISA no vectoriales, debido a que a veces no hay suficiente espacio en el registro de entrada de origen para especificar la matriz de origen de permutación en su totalidad (en particular si la operación implica una permutación a nivel de bits), se incluirán instrucciones de reordenamiento parcial. Algunos ejemplos incluyen VSHUFF32x4
AVX -512 .
Las operaciones de permutación en diferentes formas son sorprendentemente comunes y ocurren en AltiVec , Power ISA , PowerPC G4 , AVX-512 , SVE2 , [5] procesadores vectoriales y GPU . Son lo suficientemente importantes como para que LLVM agregara el intrínseco shufflevector
[6] y GCC agregara el __builtin_shuffle
intrínseco. [7] El intrínseco de GCC coincide con la funcionalidad de los intrínsecos aleatorios de OpenCL . [8] Tenga en cuenta que todos estos, matemáticamente, no son permutaciones porque pueden ocurrir duplicados en la salida.