SSE4

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 19 de septiembre de 2016; la verificación requiere 21 ediciones .

SSE4  es un conjunto de instrucciones de la microarquitectura Intel Core , implementado por primera vez en los procesadores de la serie Penryn (que no debe confundirse con el SSE4A de AMD ) [1] .

Se anunció el 27 de septiembre de 2006 , pero una descripción detallada solo estuvo disponible en la primavera de 2007 . Puede encontrar una descripción más detallada de las nuevas características del procesador para programadores en el sitio web de Intel.

Conjunto de comandos

SSE4 consta de 54 instrucciones, 47 de ellas pertenecen a SSE4.1 (están en procesadores Penryn). El conjunto completo de instrucciones (SSE4.1 y SSE4.2, es decir, 47 + las 7 instrucciones restantes) está disponible en los procesadores Intel con microarquitectura Nehalem, que se lanzaron a mediados de noviembre de 2008 y en ediciones posteriores. Ninguna de las instrucciones SSE4 funciona con registros mmx de 64 bits (solo con xmm0-15 de 128 bits).

Nuevos comandos SSE4
Subgrupo instrucciones del procesador Descripción Mejoras esperadas en la aplicación
Varias operaciones DWORD empaquetadas PMULD, PMULDQ Nuevo soporte para cuatro multiplicaciones de 32x32 bits con signo (y sin signo) por instrucción, así como multiplicaciones con signo como 32x32->64. Ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran).
Producto punto flotante DPPS, DPPD Rendimiento de procesamiento mejorado para el tipo de datos AOS (matriz de estructuras) a través del soporte para productos de punto de precisión simple y doble. Creación de contenidos tridimensionales, juegos. Soporte para lenguajes de programación como CG y HLSL.
maridaje lleno BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDDW Por convención, la operación de emparejamiento copia un campo del origen y lo transfiere al destino. Estas nuevas instrucciones del procesador mejorarán el rendimiento de las operaciones de conjugación para la mayoría de los tamaños de campo al empaquetar las operaciones de multiplicación en una sola instrucción. Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video. Recursos multimedia y de juego.
Valores enteros empaquetados máximo y mínimo PMINSB, PMAXSB, PMINUW, PMAXUW, PMINUD, PMAXUD, PMINDS, PMAXSD Compara los valores enteros empaquetados de nivel de byte/palabra/dword con/sin firmar en el operando de destino y en el operando de origen y devuelve el valor mínimo o máximo por instrucción para cada operando empaquetado en el operando de destino. Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video.
Redondeo de valores de punto flotante ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD Redondea eficientemente un operando de precisión simple o doble escalar y empaquetado a un valor entero, lo que admite los requisitos de los lenguajes de programación Fortran, Java y C99. Procesamiento de imágenes, gráficos, información de video. Aplicaciones con recursos multimedia y de juego 2D/3D.
Insertar/Expulsar registros INSERTOS, PINSRB, PINSRD, PINSRQ, EXTRACTOS, PEXTRB, PEXTRD, PEXTRW, PEXTRQ Estas nuevas instrucciones del procesador simplifican el proceso de inserción y extracción entre GPR (o memoria) y XMM. Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video.
Conversión de formato empaquetado PMOVSXBW, PMOVZXBW, PMOVSXBD, PMOVZXBD, PMOVSXBQ, PMOVZXBQ, PMOVSXWD, PMOVZXWD, PMOVSXWQ, PMOVZXWQ, PMOVSXDQ, PMOVZXDQ Convierte un valor entero encuadrado (de un registro o memoria XMM) en un valor entero de un tipo más amplio con extensión firmada o nula. Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video.
Embalado de verificación e instalación. PRUEBA Ramificación más rápida de la arquitectura SIMD para admitir código vectorizado. Aplicable para la automatización de la vectorización del compilador del procesamiento de datos, el procesamiento de información de imágenes y videos y la creación de contenido tridimensional. Recursos multimedia y de juego.
Definición de identidad empaquetada PCMPEQQ, PCMPGTQ La arquitectura SIMD define que los valores empaquetados de QWORDs en el operando de destino y en el operando de origen son idénticos. Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video. Recursos multimedia y de juego.
Empaquetando DWORD en formato WORD sin firmar PAQUETEUSDW Convierte un DWORD con firma empaquetada en una PALABRA empaquetada sin firmar mediante una preparación sin firmar para controlar las condiciones de desbordamiento. Esta nueva instrucción del procesador completa el conjunto de otras instrucciones en este formato. Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video. Recursos multimedia y de juego.
Operaciones de cadena mejoradas PCMPESTRI, PCMPESTRM, PCMPISTRI, PCMPISTRM Estas nuevas instrucciones del procesador contienen una gran cantidad de capacidades de procesamiento de cadenas y texto que normalmente requieren más códigos de operación. Rendimiento mejorado para análisis de virus, búsqueda de texto, bibliotecas de procesamiento de cadenas como ZLIB, bases de datos, compiladores y aplicaciones de máquinas de estado.


El compilador C de Intel desde la versión 10 genera instrucciones SSE4 cuando se especifica la opción -QxS . El compilador Sun Studio de Sun Microsystems desde la versión 12 actualización 1 genera instrucciones SSE4 usando las opciones -xarch=sse4_1 (SSE4.1) y -xarch=sse4_2 (SSE4.2) [2] . El compilador GCC admite SSE4.1 y SSE4.2 desde la versión 4.3 [ 3] , con las opciones -msse4.1 y -msse4.2 , o -msse4 para incluir ambas.

Cambios

Se han agregado instrucciones para acelerar la compensación de movimiento en los códecs de video , lectura rápida de la memoria USWC , muchas instrucciones para simplificar la vectorización de programas por parte de los compiladores.

Además, se han agregado a SSE4.2 instrucciones para procesar cadenas de caracteres de 8/16 bits, cálculos CRC32, POPCNT . Por primera vez en SSE4, el registro xmm0 se usó como argumento implícito para algunas instrucciones.

Nuevas instrucciones SSE4.1

Acelerar video

Cálculo de ocho sumas de valores absolutos de diferencias (SAD) de grupos sin firmar de 4 bytes compensados. La ubicación de los operandos para SAD de 16 bits está determinada por los tres bits del argumento directo imm8.

s1 = mm8[2]*4 s2 = mm8[1:0]*4 TAE 0 = |A (s1+0) -B (s2+0) | + |A (s1+1) -B (s2+1) | + |A (s1+2) -B (s2+2) | + |A (s1+3) -B (s2+3) | TAE 1 = |A (s1+1) -B (s2+0) | + |A (s1+2) -B (s2+1) | + |A (s1+3) -B (s2+2) | + |A (s1+4) -B (s2+3) | TAE 2 = |A (s1+2) -B (s2+0) | + |A (s1+3) -B (s2+1) | + |A (s1+4) -B (s2+2) | + |A (s1+5) -B (s2+3) | ... TAE 7 = |A (s1+7) -B (s2+0) | + |A (s1+8) -B (s2+1) | + |A (s1+9) -B (s2+2) | + |A (s1+10) -B (s2+3) |

Buscar entre campos sin signo de 16 bits A 0 ... A 7 tales que tengan un valor mínimo (y posición con un número menor, si hay varios de esos campos). Se devuelve un valor de 16 bits y su posición.

Un grupo de 12 instrucciones para expandir el formato de campos empaquetados. Los campos empaquetados de 8, 16 o 32 bits de la parte inferior del argumento se expanden (con o sin signo) en campos de resultados de 16, 32 o 64 bits.

Formato de entrada
Formato resultante
8 bits 16 bits 32 bits
PMOVSXBW 16 bits
PMOVZXBW PMOVZXWW
PMOVSXBD PMOVSXWD 32 bits
PMOVZXBD PMOVZXWD PMOVSXDD
PMOVSXBQ PMOVSXWQ PMOVSXDQ 64 bits
PMOVZXBQ PMOVZXWQ PMOVZXDQ

Primitivas vectoriales

Cada campo de resultado es el valor mínimo/máximo de los campos correspondientes de los dos argumentos. Los campos de bytes se tratan solo como números con signo, los campos de 16 bits se tratan solo como números sin signo. Para campos empaquetados de 32 bits, se proporcionan opciones firmadas y sin firmar.

Multiplique los campos de 32 bits con signo, produciendo los 64 bits completos del resultado (dos operaciones de multiplicación en campos de argumento 0 y 2).

Multiplique los campos de 32 bits con signo, produciendo los 32 bits menos significativos de los resultados (cuatro operaciones de multiplicación en todos los campos de argumento).

Empaquetado de campos firmados de 32 bits en campos sin firmar de 16 bits con saturación.

Comprobación de la igualdad de campos de 64 bits y emisión de máscaras de 64 bits.

Inserciones/Extracciones

Insertar un campo de 32 bits de xmm2 (es posible elegir cualquiera de los 4 campos de este registro) o de una ubicación de memoria de 32 bits en un campo de resultado arbitrario. Además, para cada uno de los campos de resultados, puede configurarlo para que se restablezca a +0.0.

Al extraer un campo de 32 bits del registro xmm, el número de campo se indica en los 2 bits inferiores de imm8. Si se especifica un registro de 64 bits como resultado, sus 32 bits superiores se restablecen (extensión sin signo).

Inserte un valor de 8, 32 o 64 bits en el campo xmm especificado del registro (los demás campos no se modifican).

Extracción de campo de 8, 16, 32, 64 bits del campo xmm especificado en imm8 del registro. Si se especifica case como resultado, se descarta su parte alta (extensión sin signo).

Multiplicación escalar de vectores

Multiplicación escalar vectorial (producto escalar) de campos de 32/64 bits. Mediante una máscara de bits en imm8 se indica qué productos de los campos se deben sumar y qué se debe escribir en cada campo del resultado: la suma de los productos especificados o +0.0.

Mezcla

Cada campo de resultado de 32/64 bits se selecciona según el signo del mismo campo en el argumento implícito xmm0: ya sea del primer o del segundo argumento.

La máscara de bits (4 o 2 bits) en imm8 especifica de qué argumento debe tomarse cada campo de resultado de 32/64 bits.

La elección de cada campo de bytes del resultado se realiza en función del signo del byte del mismo campo en el argumento implícito xmm0: ya sea del primero o del segundo argumento.

La máscara de bits (8 bits) en imm8 especifica de qué argumento debe tomarse cada campo de resultado de 16 bits.

Comprobaciones de bits

Configure la bandera ZF solo si en xmm2/m128 todos los bits marcados con la máscara de xmm1 son cero. Si todos los bits sin marcar son cero, establezca el indicador CF. Las banderas restantes ( AF , OF , PF , SF ) siempre se restablecen. La instrucción no modifica xmm1.

Redondeo

Redondeo de todos los campos de 32/64 bits. El modo de redondeo (4 opciones) se selecciona desde MXCSR.RC o se configura directamente en imm8. También puede suprimir la generación de una excepción de pérdida de precisión.

Redondeando solo el campo de 32/64 bits menos significativo (los demás bits permanecen sin cambios).

Lectura de memoria WC

Una operación de lectura que acelera (hasta 7,5 veces) el trabajo con áreas de memoria de combinación de escritura .

Nuevas instrucciones SSE4.2

Manejo de cadenas

Estas instrucciones realizan comparaciones aritméticas entre todos los pares de campos posibles (64 o 256 comparaciones) de ambas cadenas dadas por los contenidos de xmm1 y xmm2/m128. Los resultados booleanos de las comparaciones luego se procesan para obtener los resultados deseados. El argumento directo de imm8 controla el tamaño (cadenas de bytes o unicode, hasta 16/8 elementos cada una), la caracterización de los campos (elementos de cadena), el tipo de comparación y la interpretación de los resultados.

Pueden buscar en una cadena (área de memoria) caracteres de un conjunto dado o en rangos dados. Puede comparar cadenas (áreas de memoria) o buscar subcadenas.

Todos ellos afectan los indicadores del procesador : SF se establece si xmm1 no es una cadena completa, ZF se establece si xmm2/m128 no es una cadena completa, CF es si el resultado no es cero, OF es si el bit menos significativo de la resultado no es cero. Las banderas AF y PF se borran.

Configuración explícita del tamaño de las líneas en <eax>, <edx> (el valor absoluto de los registros se toma de saturación a 8/16, dependiendo del tamaño de los elementos de las líneas. El resultado está en el registro ecx .

Configuración explícita del tamaño de las líneas en <eax>, <edx> (el valor absoluto de los registros se toma de saturación a 8/16, dependiendo del tamaño de los elementos de las líneas. El resultado está en el registro xmm0 .

Configuración implícita del tamaño de las cadenas (se buscan cero elementos para cada una de las cadenas). El resultado está en el registro ecx.

Configuración implícita del tamaño de las cadenas (se buscan cero elementos para cada una de las cadenas). El resultado está en el registro xmm0.

Cálculo CRC32

Acumulación del valor CRC-32C (otra notación CRC-32/ISCSI CRC-32/CASTAGNOLI ) para un argumento de 8, 16, 32 o 64 bits (usando el polinomio 0x1EDC6F41 ).

Contando una población de 1 bits

Contando el número de bits individuales. Tres opciones de instrucción: para registros de 16, 32 y 64 bits. También presente en el SSE4A de AMD .

Primitivas vectoriales

Comprobación de campos de 64 bits para "mayor que" y emisión de máscaras de 64 bits.

SSE4a

AMD introdujo el conjunto de instrucciones SSE4a en los procesadores de arquitectura Barcelona . Esta extensión no está disponible en los procesadores Intel. El soporte se define mediante el indicador CPUID.80000001H:ECX.SSE4A[Bit 6]. [cuatro]

Instrucción Descripción
LZCNT/POPCNT Contando el número de bits cero/uno.
EXTRQ/INSERTQ Instrucciones combinadas de máscara y turno [5]
MOVNTSD/MOVNTSS Instrucciones de escritura de flujo escalar [6]

Procesadores con soporte SSE4

Literatura

Notas

  1. Innovador conjunto de instrucciones Streaming SIMD Extensions 4 (SSE4) (enlace descendente ) . Consultado el 21 de febrero de 2010. Archivado desde el original el 29 de mayo de 2010. 
  2. Sun Studio 12 Actualización 1: C Compiler 5.10 Léame . Consultado el 8 de febrero de 2010. Archivado desde el original el 7 de noviembre de 2009.
  3. GCC 4.3 Release Series - Cambios, nuevas funciones y correcciones - Proyecto GNU - Free Software Foundation (FSF) . Consultado el 27 de mayo de 2010. Archivado desde el original el 9 de mayo de 2012.
  4. Especificación de CPUID de AMD . Consultado el 7 de mayo de 2011. Archivado desde el original el 16 de mayo de 2011.
  5. Rahul Chaturvedi. Característica del procesador "Barcelona": conjunto de instrucciones SSE4a  (inglés)  (enlace no disponible) (17 de septiembre de 2007). Archivado desde el original el 25 de octubre de 2013.
  6. Rahul Chaturvedi. Característica del procesador "Barcelona": SSE4a, parte 2  (inglés)  (enlace no disponible) (2 de octubre de 2007). Archivado desde el original el 25 de octubre de 2013.