stringtranslate.com

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 centrales SSE de 128 bits en el conjunto de instrucciones x86 y AMD64 para el núcleo del procesador Bulldozer , que se lanzó en octubre. 12, 2011. [2] Sin embargo, AMD eliminó el soporte para XOP desde Zen (microarquitectura) en adelante. [3]

El conjunto de instrucciones XOP contiene varios tipos diferentes de instrucciones vectoriales, ya que originalmente fue pensado como una actualización importante de SSE . La mayoría de las instrucciones son instrucciones de números enteros, pero también contienen instrucciones de permutación de punto flotante y extracción de fracciones de punto flotante. Consulte el índice para obtener una lista de tipos de instrucciones.

Historia

XOP es un subconjunto revisado de lo que originalmente se pretendía como SSE5 . Se cambió para que fuera similar pero sin superponerse con AVX , las partes que se superponían con AVX se eliminaron o se trasladaron a estándares separados como FMA4 ( multiplicación-acumulación de vectores de punto flotante ) y CVT16 ( conversión de punto flotante de media precisión 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 de números enteros 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.

Los comentaristas [4] han visto esto como evidencia de que Intel no ha permitido a AMD usar ninguna parte del gran espacio de codificación VEX. AMD se ha visto obligada a utilizar códigos diferentes para evitar el uso de cualquier combinación de códigos que Intel podría estar utilizando en su proceso de desarrollo para otra cosa. El esquema de codificación XOP es lo más parecido técnicamente posible al esquema VEX sin correr el riesgo de que los códigos AMD se superpongan con futuros códigos Intel. Esta inferencia es especulativa, ya que no hay información pública disponible sobre las negociaciones entre las dos empresas sobre este tema.

El uso del byte 8F requiere que los m-bits (ver esquema de codificación VEX ) tengan un valor mayor o igual a 8 para evitar superposiciones con instrucciones existentes. [Nota 1] El byte C4 utilizado en el esquema VEX no tiene tal restricción. Esto puede 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 tengan el valor 00 en el esquema XOP, mientras que tienen el valor 01 en el esquema VEX para instrucciones que no tienen equivalente heredado. Esto puede complicar el uso de los bits pp para otros fines en el futuro.

Un problema de compatibilidad similar es 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. Después de que AMD adoptó FMA4, Intel canceló el soporte de FMA4 y volvió a FMA3 en la versión 5 de la especificación AVX/FMA (consulte 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 soportará TBM, FMA4y las instrucciones desarrolladas XOP. LWPespecíficamente para la familia de microarquitecturas "Bulldozer". [7] [8]

Instrucciones de multiplicación y acumulación de vectores enteros

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

Suma horizontal de vectores enteros

Las instrucciones de suma horizontal agregan valores adyacentes en el vector de entrada entre sí. El tamaño de salida en las instrucciones siguientes describe el ancho de la suma horizontal realizada. Por ejemplo, byte horizontal a palabra agrega dos bytes a la vez y devuelve el resultado como vector de palabras, pero byte a palabra cuádruple suma ocho bytes a la vez y devuelve el resultado como vector de cuatro palabras. En SSSE3 se pueden encontrar seis instrucciones horizontales adicionales de suma y resta , pero operan en dos vectores de entrada y solo realizan dos y dos operaciones.

Comparación de vectores enteros

Este conjunto de instrucciones de comparación de vectores toma un inmediato como argumento adicional. Lo inmediato controla qué tipo de comparación 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 en 1, y las comparaciones falsas establecen todos los mismos bits en 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 la primera fuente y 0 selecciona el mismo bit en la segunda fuente. 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 la misma que el destino, un movimiento condicional ( CMOV).

Instrucciones de desplazamiento y rotación de vectores enteros

Las instrucciones de desplazamiento aquí difieren de las de SSE2 en que pueden desplazar cada unidad en una cantidad diferente utilizando un registro vectorial interpretado como enteros empaquetados con signo. El signo indica la dirección de desplazamiento o rotación, con valores positivos que provocan un desplazamiento a la izquierda y un desplazamiento negativo 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 la instrucción SSSE3 PALIGNR y PSHUFB y agrega más a ambas. Algunos lo comparan con la instrucción AltivecVPERM . [12] Toma tres registros como entrada, los dos primeros son registros fuente y el tercero el registro selector. Cada byte en el selector selecciona uno de los bytes en uno de los dos registros de entrada para la salida. El selector también puede aplicar efectos en los bytes seleccionados, como establecerlo en 0, invertir el orden de los bits y repetir el bit más significativo. Además, todos los efectos o la entrada se pueden invertir.

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

Extracción de fracciones de punto flotante

Estas instrucciones extraen la parte fraccionaria del punto flotante, es decir, la parte que se perdería en la conversión a entero.

CPU con XOP

Ver 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 instrucciones multiplex "reg" utilizando estos bits para indicar ocho instrucciones diferentes (0x80-0x83 y 0xD0-0xDF, entre otras); 0x8F no. Esto significa que, para una instrucción POP estándar, los bits 3 a 5 siempre deben ser cero. Dado que los bits m son bits 0-4, al requerir un valor 8 o superior se establece el bit 3 del byte siguiente a 0x8F.

Referencias

  1. ^ abcd Dave Christie (7 de mayo de 2009), Lograr un equilibrio, blogs de desarrolladores de AMD, archivado desde el original el 4 de noviembre de 2013 , consultado el 4 de noviembre de 2013
  2. ^ ab Manual del programador de 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 del ajuste del compilador GCC Zen en el rendimiento de AMD Ryzen". Forónix . Pero dado que Zen es un diseño limpio, hay algunas extensiones de conjunto de instrucciones que se encuentran en los procesadores Bulldozer que no se encuentran en Zen/znver1. Los que ya no están presentes incluyen FMA4 y XOP.
  4. ^ Agner Fog (5 de diciembre de 2009), Detener la guerra de conjuntos de instrucciones
  5. ^ Referencia de programación Intel AVX (PDF) , marzo de 2008 , consultado el 17 de enero de 2012
  6. ^ Referencia de programación de extensiones vectoriales avanzadas de Intel, enero de 2009, archivado desde el original el 29 de febrero de 2012 , consultado el 17 de enero de 2012
  7. ^ Ganesh Gopalasubramanian (10 de marzo de 2015). "[PATCH] agregue el procesador znver1". [email protected] (lista de correo).
  8. ^ Amit Pawar (7 de agosto de 2015). "[PARCHE] Eliminar CpuFMA4 de los indicadores de CPU Znver1". [email protected] (lista de correo).
  9. ^ abcdefg "Manual del programador de arquitectura AMD64, volumen 4: instrucciones para medios de 128 y 256 bits" (PDF) . AMD . Consultado el 13 de enero de 2014 .
  10. ^ "Nuevas instrucciones de" Bulldozer "y" Piledriver "" (PDF) . AMD . Consultado el 13 de enero de 2014 .
  11. ^ "Referencia de programación de extensiones del conjunto de instrucciones de la arquitectura Intel". Intel . Archivado desde el original (PDF) el 1 de febrero de 2014 . Consultado el 29 de enero de 2014 .
  12. ^ "Optimizaciones de Buldozer x264" . Consultado el 13 de enero de 2014 .
  13. ^ Dave Christie (7 de mayo de 2009), Lograr un equilibrio, blogs de desarrolladores de AMD, archivado desde el original el 9 de noviembre de 2013 , consultado el 17 de enero de 2012
  14. ^ Nuevas instrucciones "Bulldozer" y "Piledriver" (PDF) , AMD, octubre de 2012