Articulo de referencia

Conjunto de instrucciones XOP

El conjunto de instrucciones XOP ( eXtended Operations [ 1 ] ) , anunciado por AMD el 1 de mayo de 2009, es una extensión de las instrucciones del núcleo SSE de 128 bits en el c...

El conjunto de instrucciones XOP ( eXtended Operations [ 1 ] ) , anunciado por AMD el 1 de mayo de 2009, es una extensión de las instrucciones del núcleo SSE de 128 bits en el conjunto de instrucciones x86 y AMD64 para el núcleo del procesador Bulldozer , que se lanzó el 12 de octubre de 2011. [ 2 ] Sin embargo, AMD eliminó el soporte para XOP a partir de Zen (microarquitectura) en adelante. [ 3 ]

El conjunto de instrucciones XOP contiene varios tipos de instrucciones vectoriales, ya que originalmente se concibió como una importante actualización de SSE . La mayoría de las instrucciones son de enteros, pero también incluye instrucciones de permutación y extracción de fracciones de punto flotante. Consulte el índice para ver la lista de tipos de instrucciones.

Historia

XOP es un subconjunto revisado de lo que originalmente se concibió como SSE5 . Se modificó para que fuera similar a AVX , pero sin superponerse con él; las partes que se superponían con AVX se eliminaron o se trasladaron a estándares separados, como FMA4 ( multiplicación y acumulación de vectores de punto flotante ) y CVT16 ( conversión de punto flotante de precisión media implementada como F16C por Intel ). [ 1 ]

Todas las instrucciones SSE5 que eran equivalentes o similares a las instrucciones de los conjuntos de instrucciones AVX y FMA4 anunciados por Intel se han modificado para utilizar la codificación propuesta por Intel. Las instrucciones enteras sin equivalentes en AVX se clasificaron como la extensión XOP. [ 1 ] Las instrucciones XOP tienen un byte de código de operación 8F ( hexadecimal ), pero por lo demás, un esquema de codificación casi idéntico al de AVX con el prefijo VEX de 3 bytes.

Algunos comentaristas [ 4 ] han interpretado esto como evidencia de que Intel no ha permitido a AMD utilizar ninguna parte del amplio espacio de codificación VEX. AMD se ha visto obligada a usar códigos diferentes para evitar cualquier combinación de códigos que Intel pudiera estar utilizando en su proceso de desarrollo para otros fines. El esquema de codificación XOP es lo más similar posible al esquema VEX, sin riesgo de que los códigos de AMD se solapen con futuros códigos de Intel. Esta inferencia es especulativa, ya que no hay información pública disponible sobre las negociaciones entre ambas compañías al respecto.

El uso del byte 8F requiere que los m-bits (véase el esquema de codificación VEX ) tengan un valor mayor o igual a 8 para evitar la superposición con las instrucciones existentes. [ Nota 1 ] El byte C4 utilizado en el esquema VEX no tiene esta restricción. Esto podría impedir el uso de los m-bits para otros fines en el futuro en el esquema XOP, pero no en el esquema VEX. Otro posible problema es que los bits pp tienen el valor 00 en el esquema XOP, mientras que tienen el valor 01 en el esquema VEX para las instrucciones que no tienen un equivalente heredado. Esto podría complicar el uso de los bits pp para otros fines en el futuro.

Un problema de compatibilidad similar radica en la diferencia entre los conjuntos de instrucciones FMA3 y FMA4 . Intel propuso inicialmente FMA4 en la versión 3 de la especificación AVX/FMA para reemplazar el FMA de 3 operandos propuesto por AMD en SSE5. Tras la adopción de FMA4 por parte de AMD, Intel canceló el soporte para FMA4 y volvió a FMA3 en la versión 5 de la especificación AVX/FMA (véase el historial de FMA ). [ 1 ] [ 5 ] [ 6 ]

En marzo de 2015, AMD reveló explícitamente en la descripción del parche para el paquete GNU Binutils que Zen , su arquitectura x86-64 de tercera generación en su primera iteración (znver1 – Zen, versión 1), no admitirá las instrucciones TBM, FMA4, XOPy LWPdesarrolladas específicamente para la familia de microarquitecturas "Bulldozer". [ 7 ] [ 8 ]

Instrucciones para multiplicar y acumular vectores enteros

Estas son las versiones enteras del conjunto de instrucciones FMA . Todas son instrucciones de cuatro operandos, similares a FMA4 , y todas operan con números enteros con signo.

Suma horizontal de vectores enteros

Las instrucciones de suma horizontal suman valores adyacentes en el vector de entrada. El tamaño de salida en las instrucciones a continuación describe la amplitud de la suma horizontal realizada. Por ejemplo, la operación de byte a palabra horizontal suma dos bytes a la vez y devuelve el resultado como un vector de palabras, mientras que la operación de byte a palabra cuádruple suma ocho bytes a la vez y devuelve el resultado como un vector de palabras cuádruples. En SSSE3 se pueden encontrar seis instrucciones adicionales de suma y resta horizontales , pero operan con dos vectores de entrada y solo realizan dos operaciones.

Comparación de vectores enteros

Este conjunto de instrucciones de comparación de vectores toma un valor inmediato como argumento adicional. El valor inmediato controla el tipo de comparación que se realiza. Hay ocho comparaciones posibles para cada instrucción. Los vectores se comparan y todas las comparaciones que se evalúan como verdaderas establecen todos los bits correspondientes en el destino a 1, y las comparaciones falsas establecen todos los mismos bits a 0. Este resultado se puede usar directamente en la instrucción VPCMOV para un movimiento condicional vectorizado .

Movimiento condicional vectorial

VPCMOVfunciona como una variante bit a bit de las instrucciones de mezcla en SSE4 . Al igual que la instrucción AVX VPBLENDVB, es una instrucción de cuatro operandos con tres operandos de origen y un destino. Para cada bit en el tercer operando (que actúa como selector), 1 selecciona el mismo bit en el primer origen, y 0 selecciona el mismo en el segundo origen. Cuando se usa junto con las instrucciones de comparación de vectores XOP anteriores, esto se puede usar para implementar un movimiento ternario vectorizado, o si la segunda entrada es igual que el destino, un movimiento condicional ( CMOV).

Instrucciones para desplazamiento y rotación de vectores enteros

Las instrucciones de desplazamiento aquí difieren de las de SSE2 en que pueden desplazar cada unidad con una cantidad diferente usando un registro vectorial interpretado como enteros con signo empaquetados. El signo indica la dirección del desplazamiento o rotación, con valores positivos causando un desplazamiento a la izquierda y negativos un desplazamiento a la derecha [ 10 ]. Intel ha especificado un conjunto diferente e incompatible de instrucciones de desplazamiento de vector variable en AVX2. [ 11 ].

Permutación vectorial

VPPERMEs una instrucción única que combina las instrucciones SSSE3 PALIGNR y PSHUFB, y añade más a ambas. Algunos la comparan con la instrucción AltivecVPERM . [ 12 ] Recibe tres registros como entrada: los dos primeros son registros fuente y el tercero, el registro selector. Cada byte del selector elige uno de los bytes de uno de los dos registros de entrada para la salida. El selector también puede aplicar efectos a los bytes seleccionados, como establecerlos a 0, invertir el orden de los bits y repetir el bit más significativo. Además, todos los efectos de la entrada pueden invertirse.

Las instrucciones VPERMIL2PDy VPERMIL2PSson dos versiones fuente de las instrucciones VPERMILPDy en AVX , lo que significa que pueden seleccionar la salida de cualquiera de los campos en las dos entradas.VPERMILPSVPPERM

Extracción de fracciones de punto flotante

Estas instrucciones extraen la parte fraccionaria de los números de coma flotante, es decir, la parte que se perdería al convertirla a entero.

CPUs con XOP

Véase también

Notas

  1. El valor de byte 0x8F es un código de operación existente para una instrucción POP. Esta instrucción utiliza el byte ModR/M, que sigue al código de operación, pero no utiliza el campo "reg" (registro), que son los bits 3-5. Algunos códigos de operación que no utilizan "reg" multiplexan instrucciones utilizando estos bits para indicar ocho instrucciones diferentes (0x80-0x83 y 0xD0-0xDF, entre otros); 0x8F no lo hace. Esto significa que, para una instrucción POP estándar, los bits 3-5 siempre deben ser cero. Dado que los m-bits son los bits 0-4, requerir un valor de 8 o superior establece el bit 3 del byte que sigue a 0x8F.

Referencias

  1. 1 2 3 4 Dave Christie (07/05/2009), Logrando un equilibrio , Blogs de desarrolladores de AMD, archivado del original el 04/11/2013 , recuperado el 04/11/2013
  2. 1 2 Manual del programador de la arquitectura AMD64 Volumen 6: Instrucciones XOP, FMA4 y CVT16 de 128 y 256 bits (PDF) , AMD , 1 de mayo de 2009
  3. Michael Larabel (3 de marzo de 2017). "El impacto de la optimización del compilador GCC Zen en el rendimiento de AMD Ryzen" . Phoronix . Pero dado que Zen es un diseño completamente nuevo, existen algunas extensiones del conjunto de instrucciones presentes en los procesadores Bulldozer que no se encuentran en Zen/znver1. Entre las que ya no están presentes se incluyen FMA4 y XOP.
  4. Agner Fog (5 de diciembre de 2009), Detener la guerra de conjuntos de instrucciones
  5. Referencia de programación AVX de Intel , marzo de 2008, archivado del original (PDF) el 7 de agosto de 2011 , consultado el 17 de enero de 2012.
  6. Referencia de programación de extensiones vectoriales avanzadas de Intel , enero de 2009, archivado del original el 29 de febrero de 2012 , consultado el 17 de enero de 2012.
  7. Ganesh Gopalasubramanian (10 de marzo de 2015). " [ PATCH ] agregar procesador znver1" . binutils@sourceware.org (Lista de correo).
  8. Amit Pawar (7 de agosto de 2015). " [ PARCHE ] Eliminar CpuFMA4 de las banderas de CPU de Znver1" . binutils@sourceware.org (Lista de correo).
  9. 1 2 3 4 5 6 7 "Manual del programador de la arquitectura AMD64, volumen 4: instrucciones para medios de 128 bits y 256 bits" (PDF) . AMD . Consultado el 13 de enero de 2014 .
  10. "Nuevas instrucciones para "Bulldozer" y "Piledriver"" (PDF) . AMD . Consultado el 13 de enero de 2014 .
  11. "Intel Architecture Instruction Set Extensions Programming Reference" . Intel . Archivado del original (PDF) el 1 de febrero de 2014. Consultado el 29 de enero de 2014 .
  12. "Optimizaciones de Buldozer x264" . Archivado del original el 15/01/2014 . Consultado el 13/01/2014 .
  13. Dave Christie (7 de mayo de 2009), Logrando un equilibrio , Blogs de desarrolladores de AMD , consultado el 17 de enero de 2012.{{citation}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  14. Nuevas instrucciones para "Bulldozer" y "Piledriver" (PDF) , AMD, octubre de 2012