Los XOP ( operaciones extendidas [1] ) conjunto de instrucciones , anunciada por AMD el 1 de mayo de 2009, es una extensión de los 128 bits SSE instrucciones básicas en la x86 y AMD64 conjunto de instrucciones para la niveladora núcleo del procesador, el cual fue lanzado de octubre 12, 2011. [2] Sin embargo, AMD eliminó el soporte para XOP de Zen (microarquitectura) en adelante. [3]
El conjunto de instrucciones XOP contiene varios tipos diferentes de instrucciones vectoriales, ya que originalmente se pensó 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 de 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 pensó como SSE5 . Se cambió para que sea similar pero no se superponga con AVX , las partes que se superponen con AVX se eliminaron o se movieron a estándares separados como FMA4 ( multiplicación y 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 anunciadas por Intel se han cambiado 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 código de operación byte 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 que AMD use ninguna parte del gran espacio de codificación VEX. AMD se ha visto obligada a usar códigos diferentes para evitar usar cualquier combinación de código que Intel pueda estar usando en su línea de desarrollo para otra cosa. El esquema de codificación XOP está tan cerca del esquema VEX como es técnicamente posible sin correr el riesgo de que los códigos AMD se superpongan con los códigos futuros de Intel. Esta inferencia es especulativa, ya que no se dispone de información pública 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 la superposición con las instrucciones existentes. El byte C4 utilizado en el esquema VEX no tiene tal restricción. Esto puede evitar el uso de m-bits para otros propósitos 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 instrucciones que no tienen equivalente heredado. Esto puede complicar el uso de los bits de 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ó la compatibilidad con 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 admitirá TBM, FMA4, XOP e instrucciones LWP desarrolladas específicamente para la familia de microarquitecturas "Bulldozer". [7] [8]
Instrucciones de multiplicación-acumulación de vectores enteros
Se trata de una versión entera del conjunto de instrucciones FMA . Estas son las cuatro instrucciones de operandos similares a FMA4 y todas operan en enteros con signo.
Instrucción | Descripción [9] | Operación |
---|---|---|
VPMACSWW
| Multiplica Acumula (con saturación) palabra a palabra | 2x8 palabras ( a0-a7 , b0-b7 ) + 8 palabras ( c0-c7 ) → 8 palabras ( r0-r7 ) r0 = a0 * b0 + c0 , r1 = a1 * b1 + c1 , .. |
VPMACSWD
| Multiplicar Acumular (con saturación) Palabra baja a palabra doble | 2x8 palabras a0-a7 , b0-b7 ) + 4 palabras dobles ( c0-c3 ) → 4 palabras dobles ( r0-r3 ) r0 = a0 * b0 + c0 , r1 = a2 + b2 * c1 ,. [2] |
VPMACSDD
| Multiplicar acumular (con saturación) palabra doble a palabra doble | 2x4 palabras dobles ( a0-a3 , b0-b3 ) + 4 palabras dobles ( c0-c3 ) → 4 palabras dobles ( r0-r3 ) r0 = a0 * b0 + c0 , r1 = a1 * b1 + c1 , .. |
VPMACSDQL
| Multiplicar Acumular (con saturación) palabra doble baja a palabra cuádruple | 2x4 palabras dobles ( a0-a3 , b0-b3 ) + 2 cuádruples ( c0-c1 ) → 2 cuádruples palabras ( r0-r3 ) r0 = a0 * b0 + c0 , r1 = a2 * b2 + c1 |
VPMACSDQH
| Multiplicar Acumular (con saturación) alta palabra doble a palabra cuádruple | 2x4 palabras dobles ( a0-a3 , b0-b3 ) + 2 cuádruples ( c0-c1 ) → 2 cuádruples palabras ( r0-r3 ) r0 = a1 * b1 + c0 , r1 = a3 * b3 + c1 |
VPMADCSWD
| Multiplica, suma, acumula (con saturación) palabra a palabra doble | 2x8 palabras a0-a7 , b0-b7 ) + 4 palabras dobles ( c0-c3 ) → 4 palabras dobles ( r0-r3 ) r0 = a0 * b0 + a1 * b1 + c0 , r1 = a2 * b2 + a3 * b3 + c1 , .. |
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 adición horizontal realizada. Por ejemplo, byte a palabra horizontal agrega dos bytes a la vez y devuelve el resultado como vector de palabras, pero byte a palabra cuádruple agrega ocho bytes juntos a la vez y devuelve el resultado como vector de palabras cuádruples. Se pueden encontrar seis instrucciones adicionales de suma y resta horizontal en SSSE3 , pero operan en dos vectores de entrada y solo realizan dos y dos operaciones.
Instrucción | Descripción [9] | Operación |
---|---|---|
VPHADDBW
| Horizontal agregue dos bytes firmados / sin firmar a la palabra | 16 bytes ( a0-a15 ) → 8 palabras ( r0-r7 ) r0 = a0 + a1 , r1 = a2 + a3 , r2 = a4 + a5 , ... |
VPHADDBD
| Horizontal agregue cuatro bytes firmados / sin firmar a doble palabra | 16 bytes ( a0-a15 ) → 4 palabras dobles ( r0-r3 ) r0 = a0 + a1 + a2 + a3 , r1 = a4 + a5 + a6 + a7 , ... |
VPHADDBQ
| Horizontal agregue ocho bytes firmados / sin firmar a quadword | 16 bytes ( a0-a15 ) → 2 cuádruples palabras ( r0-r1 ) r0 = a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 , ... |
VPHADDWD
| Horizontal agregue dos palabras firmadas / sin firmar a doble palabra | 8 palabras a0-a7 ) → 4 palabras dobles ( r0-r3 ) r0 = a0 + a1 , r1 = a2 + a3 , r2 = a4 + a5 , ... |
VPHADDWQ
| Horizontal agregue cuatro palabras firmadas / sin firmar a quadword | 8 palabras a0-a7 ) → 2 cuádruples palabras ( r0-r1 ) r0 = a0 + a1 + a2 + a3 , r1 = a4 + a5 + a6 + a7 |
VPHADDDQ
| Horizontal añada dos palabras dobles firmadas / sin firmar a quadword | 4 palabras dobles ( a0-a3 ) → 2 palabras cuádruples ( r0-r1 ) r0 = a0 + a1 , r1 = a2 + a3 |
VPHSUBBW | Restar horizontalmente dos bytes con signo a la palabra | 16 bytes ( a0-a1 5) → 8 palabras ( r0-r7 ) r0 = a0-a1 , r1 = a2-a3 , r2 = a4-a5 , ... |
VPHSUBWD | Restar horizontalmente dos palabras con signo a doble palabra | 8 palabras a0-a7 ) → 4 palabras dobles ( r0-r3 ) r0 = a0-a1 , r1 = a2-a3 , r2 = a4-a5 , ... |
VPHSUBDQ | Restar horizontalmente dos palabras dobles con signo a palabra cuádruple | 4 palabras dobles ( a0-a3 ) → 2 palabras cuádruples ( r0-r1 ) r0 = a0-a1 , r1 = a2-a3 |
Comparación de vectores enteros
Este conjunto de instrucciones de comparación de vectores toman todos un argumento inmediato como un argumento adicional. El 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 .
Instrucción | Descripción [9] | Inmediato | Comparación | |
---|---|---|---|---|
VPCOMB | Comparar bytes firmados por vectores | 000 | Menos que | |
VPCOMW | Comparar palabras firmadas por vectores | 001 | Menor o igual | |
VPCOMD | Comparar palabras dobles firmadas por vectores | 010 | Mas grande que | |
VPCOMQ | Comparar palabras cuádruples firmadas por vectores | 011 | Mayor que o igual | |
VPCOMUB | Comparar bytes vectoriales sin firmar | 100 | Igual | |
VPCOMUW | Comparar palabras vectoriales sin firmar | 101 | No es igual | |
VPCOMUD | Comparar palabras dobles sin signo de vector | 110 | Falso | |
VPCOMUQ | Comparar palabras cuádruples sin signo de vector | 111 | Cierto |
Movimiento condicional de vector
VPCMOV funciona como una variante bit a bit de las instrucciones de mezcla en SSE4 . Para cada bit del selector, 1 selecciona el mismo bit en la primera fuente y 0 selecciona el mismo en la segunda fuente. Cuando se usa junto con las instrucciones de comparación de vectores XOP anteriores, se puede usar para implementar un movimiento ternario vectorizado, o si la segunda entrada es la misma que el destino, un movimiento condicional (CMOV).
Instrucción | Descripción [9] |
---|---|
VPCMOV | Movimiento condicional vectorial |
Instrucciones de rotación y desplazamiento de vectores enteros
Las instrucciones de desplazamiento aquí difieren de las de SSE2 en que pueden desplazar cada unidad con 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 desplazamiento a la izquierda y desplazamiento a la derecha negativo [10] Intel ha especificado un conjunto diferente incompatible de instrucciones de desplazamiento de vector variable en AVX2. [11]
Instrucción | Descripción [9] |
---|---|
VPROTB | Bytes de rotación empaquetados |
VPROTW | Palabras rotas empaquetadas |
VPROTD | Palabras dobles rotas empaquetadas |
VPROTQ | Quadwords rotativos empaquetados |
VPSHAB | Bytes aritméticos de cambio empaquetados |
VPSHAW | Palabras aritméticas de turno empaquetadas |
VPSHAD | Palabras dobles aritméticas de turno empaquetadas |
VPSHAQ | Cuatro palabras aritméticas de turno empaquetadas |
VPSHLB | Bytes lógicos de cambio empaquetados |
VPSHLW | Palabras lógicas de turno empaquetadas |
VPSHLD | Palabras dobles lógicas de cambio empaquetadas |
VPSHLQ | Palabras cuadradas lógicas de cambio empaquetadas |
Vector permute
VPPERM es una única instrucción que combina la instrucción SSSE3 PALIGNR y PSHUFB y agrega más a ambas. Algunos lo comparan con la instrucción Altivec VPERM. [12] Toma tres registros como entrada, los dos primeros son registros fuente y el tercero el registro selector. Cada byte del 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 VPERMIL2PD y VPERMIL2PS son dos versiones fuente de las instrucciones VPERMILPD y VPERMILPS en AVX, lo que significa que, al igual que VPPERM, pueden seleccionar la salida de cualquiera de los campos de las dos entradas.
Instrucción | Descripción [9] |
---|---|
VPPERM | Byte de permutación empaquetado |
VPERMIL2PD | Permutar punto flotante de doble precisión de dos fuentes |
VPERMIL2PS | Permutar punto flotante de precisión simple de dos fuentes |
Extracción de fracción de punto flotante
Estas instrucciones extraen la parte fraccionaria del punto flotante, que es la parte que se perdería en la conversión a entero.
Instrucción | Descripción [9] |
---|---|
VFRCZPD | Extraer Fracción Empaquetada de Punto Flotante de Doble Precisión |
VFRCZPS | Extraer Fracción Empaquetada de Punto Flotante de Precisión Única |
VFRCZSD | Extraer Fracción Escalar de Punto Flotante de Doble Precisión |
VFRCZSS | Extraer Fracción Escalar Punto flotante de precisión simple |
CPU con XOP
- AMD :
- Procesadores de "equipo pesado"
- Procesadores basados en bulldozer, cuarto trimestre de 2011 [13]
- Procesadores basados en Piledriver , cuarto trimestre de 2012 [14]
- Procesadores basados en apisonadora, primer trimestre de 2014
- Procesadores basados en excavadoras (incluida "v2"), 2015
- Procesadores de "equipo pesado"
Ver también
- AVX
- CVT16
- FMA4
- SSE5
- x86
Referencias
- ↑ a b c d Dave Christie ( 7 de mayo de 2009 ), Striking a balance , blogs de desarrolladores de AMD, archivado desde el original el 4 de noviembre de 2013 , consultado el 4 de noviembre de 2013
- ^ a b Manual del programador de la arquitectura AMD64 Volumen 6: Instrucciones de XOP, FMA4 y CVT16 de 128 y 256 bits (PDF) , AMD , 1 de mayo de 2009
- ^ Michael Larabel (3 de marzo de 2017). "El impacto del ajuste del compilador GCC Zen en el rendimiento de AMD Ryzen" . Phoronix .
Pero dado que Zen es un diseño de hoja limpia, hay algunas extensiones de conjuntos 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.
- ^ Agner Fog (5 de diciembre de 2009), Detenga la guerra del conjunto de instrucciones
- ^ Referencia de programación Intel AVX (PDF) , marzo de 2008 , consultado el 17 de enero de 2012
- ^ Intel Advanced Vector Extensions programación de referencia , enero de 2009, Archivado desde el original el 29 de febrero, 2012 , recuperado 2012-01-17
- ^ Ganesh Gopalasubramanian (10 de marzo de 2015). "[PATCH] agregar procesador znver1" . [email protected] (lista de correo).
- ^ Amit Pawar (7 de agosto de 2015). "[PATCH] Elimina CpuFMA4 de los indicadores de CPU de Znver1" . [email protected] (lista de correo).
- ^ a b c d e f g "Manual del programador de la arquitectura AMD64, volumen 4: instrucciones de medios de 128 bits y 256 bits" (PDF) . AMD . Consultado el 13 de enero de 2014 .
- ^ "Instrucciones" Nuevo "Bulldozer" y "Piledriver" (PDF) . AMD . Consultado el 13 de enero de 2014 .
- ^ "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 .
- ^ "Optimizaciones Buldozer x264" . Consultado el 13 de enero de 2014 .
- ^ David Christie (2009-05-07), lograr un equilibrio , los blogs de AMD Developer, archivada desde el original en 11/09/2013 , recuperado 2012-01-17
- ^ Nuevas instrucciones "Bulldozer" y "Piledriver" (PDF) , AMD, octubre de 2012