stringtranslate.com

Instrucción de permutación

Las instrucciones de permutación (y reproducción aleatoria), que forman parte de la manipulación de bits y 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 reunión y dispersión, respectivamente. La variante de recolección es la siguiente:

para  i  =  0  a  longitud - 1  destino [ i ]  =  src [ índices [ i ]]

donde la variante de dispersión es:

para  i  =  0  a  longitud - 1  destino [ índices [ i ]]  =  src [ i ]

Tenga en cuenta que, a diferencia de la recopilación-dispersión basada en memoria, los tres de dest, srcy indicesson registros (o partes de registros en el caso de 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, donde la variante de "reunión" recopila datos de los elementos de origen indexados.

Dado que los índices pueden repetirse en ambas variantes, el resultado resultante no es una permutación matemática estricta porque pueden ocurrir duplicados en el resultado.

También se utiliza un caso especial de permutación en el " swizzling " de GPU (nuevamente, no es estrictamente una permutación) que realiza una reordenación sobre la marcha de datos de subvectores para alinear o duplicar elementos con el carril SIMD apropiado .

Apariciones de instrucciones de permutación

Las instrucciones de permutación ocurren tanto en procesadores escalares como en motores de procesamiento vectorial y GPU . En los conjuntos de instrucciones vectoriales, normalmente se denominan operaciones "Registrar recopilación/dispersión", como en los vectores RISC-V , [2] y toman vectores como entrada tanto para los elementos fuente como para la matriz fuente, y generan 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 luego como fuentes de matriz. Los resultados (pequeños, parciales) luego 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(depósito de bits) en bitmanip RISC-V; [3] en Power ISA se le conoce bpermdy se ha incluido durante varias décadas, y todavía se encuentra en la especificación Power ISA v.3.0 B. [4]

Además, en algunos ISA no vectoriales, debido a que a veces no hay suficiente espacio en el registro de entrada de un origen para especificar la matriz de origen de permutación en su totalidad (particularmente si la operación implica permutación a nivel de bits), se incluirán instrucciones de reordenamiento parcial. Los 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 agregue el shufflevector[6] intrínseco y GCC agregue el __builtin_shuffleintrínseco. [7] El intrínseco de GCC coincide con la funcionalidad del intrínseco aleatorio de OpenCL . [8] Tenga en cuenta que todos estos, matemáticamente, no son permutaciones porque pueden ocurrir duplicados en la salida.

Ver también

Referencias

  1. ^ Volúmenes combinados del manual del desarrollador de software de arquitecturas Intel® 64 e IA-32: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D y 4 (PDF) . Intel. Junio ​​de 2021. pág. 5-356 vol. 2C.
  2. ^ Extensión de vector "RISC-V" V "- 16.4. Instrucciones de recopilación de registros de vectores". 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. 2017-03-27 . Consultado el 11 de agosto de 2019 .
  5. ^ ARM HPC, resumen de la extensión SVE2, p32
  6. ^ "Documentación de LLVM 13: vector aleatorio". Manual de referencia del lenguaje LLVM . Consultado el 10 de julio de 2021 .
  7. ^ "Extensiones vectoriales (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 de OpenCL: aleatorio, aleatorio2". El grupo Khronos Inc. Consultado el 10 de julio de 2021 .

enlaces externos