stringtranslate.com

Instrucción de permutación

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, srcy indicesson 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 .

Ocurrencias de instrucciones de permutación

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 bpermdy 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 VSHUFF32x4AVX -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_shuffleintrí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.

Véase también

Referencias

  1. ^ Manual del desarrollador de software de arquitecturas Intel® 64 e IA-32 volúmenes combinados: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D y 4 (PDF) . Intel. Junio ​​de 2021. p. 5-356 Vol. 2C.
  2. ^ "Extensión vectorial RISC-V "V" – 16.4. Instrucciones de recopilación de registros vectoriales". GitHub – riscv/riscv-v-spec . Consultado el 10 de julio de 2021 .
  3. ^ "riscv/riscv-bitmanip". GitHub . Consultado el 10 de julio de 2021 .
  4. ^ "Power ISA versión 3.0 B". Power.org. 27 de marzo de 2017. Consultado el 11 de agosto de 2019 .
  5. ^ Resumen de la extensión ARM HPC, SVE2, pág. 32
  6. ^ "Documentación de LLVM 13: shufflevector". Manual de referencia del lenguaje LLVM . Consultado el 10 de julio de 2021 .
  7. ^ "Extensiones de vectores (utilizando la colección de compiladores GNU (GCC))". GCC, la colección de compiladores GNU - Proyecto GNU - Free Software Foundation (FSF) . Consultado el 10 de julio de 2021 .
  8. ^ "Especificación OpenCL: shuffle, shuffle2". The Khronos Group Inc. Consultado el 10 de julio de 2021 .

Enlaces externos