SSE2 ( Streaming SIMD Extensions 2 ) es uno de los conjuntos de instrucciones suplementarias del procesador Intel SIMD (Single Instruction, Multiple Data) introducido por primera vez por Intel con la versión inicial del Pentium 4 en 2000. Extiende el conjunto de instrucciones SSE anterior , y está previsto para reemplazar completamente MMX . Intel extendió SSE2 para crear SSE3 en 2004. SSE2 agregó 144 nuevas instrucciones a SSE, que tiene 70 instrucciones. El fabricante de chips de la competencia AMD agregó soporte para SSE2 con la introducción de sus gamas Opteron y Athlon 64 de AMD64 CPU de 64 bits en 2003.
Características
La mayoría de las instrucciones SSE2 implementan las operaciones de vectores enteros que también se encuentran en MMX. En lugar de los registros MMX, utilizan los registros XMM, que son más amplios y permiten importantes mejoras de rendimiento en aplicaciones especializadas. Otra ventaja de reemplazar MMX con SSE2 es evitar la penalización de cambio de modo por emitir instrucciones x87 presentes en MMX porque comparte espacio de registro con la FPU x87. El SSE2 también complementa las operaciones vectoriales de punto flotante del conjunto de instrucciones SSE al agregar soporte para el tipo de datos de doble precisión.
Otras extensiones SSE2 incluyen un conjunto de instrucciones de control de caché destinadas principalmente a minimizar la contaminación de la caché cuando se procesan flujos infinitos de información y un complemento sofisticado de instrucciones de conversión de formato numérico.
La implementación de AMD de SSE2 en la plataforma AMD64 ( x86-64 ) incluye ocho registros adicionales, duplicando el número total a 16 (XMM0 a XMM15). Estos registros adicionales solo son visibles cuando se ejecuta en modo de 64 bits. Intel adoptó estos registros adicionales como parte de su soporte para la arquitectura x86-64 (o en el lenguaje de Intel, "Intel 64") en 2004.
Diferencias entre x87 FPU y SSE2
Las instrucciones FPU (x87) proporcionan una mayor precisión al calcular los resultados intermedios con 80 bits de precisión, de forma predeterminada, para minimizar el error de redondeo en algoritmos numéricamente inestables (consulte la justificación del diseño IEEE 754 y sus referencias). Sin embargo, el x87 FPU es solo una unidad escalar, mientras que SSE2 puede procesar un pequeño vector de operandos en paralelo.
Si los códigos diseñados para x87 se trasladan al punto flotante SSE2 de doble precisión de menor precisión, ciertas combinaciones de operaciones matemáticas o conjuntos de datos de entrada pueden dar como resultado una desviación numérica medible, lo que puede ser un problema en los cálculos científicos reproducibles, por ejemplo, si los resultados del cálculo deben compararse. con los resultados generados a partir de una arquitectura de máquina diferente. Un problema relacionado es que, históricamente, los estándares de lenguaje y los compiladores habían sido inconsistentes en su manejo de los registros x87 de 80 bits implementando variables de precisión extendida doble, en comparación con los formatos de precisión simple y doble implementados en SSE2: el redondeo de valores intermedios de precisión extendida a las variables de doble precisión no estaba completamente definido y dependía de los detalles de implementación, como cuando los registros se derramaban en la memoria.
Diferencias entre MMX y SSE2
SSE2 extiende las instrucciones MMX para operar en registros XMM. Por lo tanto, es posible convertir todo el código MMX existente en un equivalente SSE2. Dado que un registro SSE2 es dos veces más largo que un registro MMX, es posible que sea necesario cambiar los contadores de bucle y el acceso a la memoria para adaptarse a esto. Sin embargo, hay disponibles cargas de 8 bytes y almacenes en XMM, por lo que esto no es estrictamente necesario.
Aunque una instrucción SSE2 puede operar con el doble de datos que una instrucción MMX, es posible que el rendimiento no aumente significativamente. Dos razones principales son: acceder a los datos SSE2 en la memoria que no están alineados con un límite de 16 bytes puede incurrir en una penalización significativa, y el rendimiento de las instrucciones SSE2 en implementaciones x86 más antiguas fue la mitad que el de las instrucciones MMX. Intel abordó el primer problema agregando una instrucción en SSE3 para reducir la sobrecarga de acceder a datos no alineados y mejorar el rendimiento general de cargas desalineadas, y el último problema ampliando el motor de ejecución en su microarquitectura Core en Core 2 Duo y productos posteriores.
Dado que los archivos de registro MMX y x87 se alían entre sí, el uso de MMX evitará que las instrucciones x87 funcionen como se desea. Una vez que se ha usado MMX, el programador debe usar la instrucción emms (C: _mm_empty ()) para restaurar la operación al archivo de registro x87. En algunos sistemas operativos, x87 no se usa mucho, pero aún se puede usar en algunas áreas críticas como pow () donde se necesita precisión adicional. En tales casos, el estado de coma flotante corrupto causado por la falla al emitir emms puede pasar desapercibido para millones de instrucciones antes de que finalmente la rutina de coma flotante falle y devuelva NaN. Dado que el problema no es aparente localmente en el código MMX, encontrar y corregir el error puede llevar mucho tiempo. Como SSE2 no tiene este problema, por lo general proporciona un rendimiento mucho mejor y proporciona más registros en código de 64 bits, debería preferirse para casi todo el trabajo de vectorización.
Uso del compilador
Cuando se introdujo por primera vez en 2000, SSE2 no era compatible con herramientas de desarrollo de software. Por ejemplo, para usar SSE2 en un proyecto de Microsoft Visual Studio , el programador tenía que escribir manualmente ensamblado en línea o importar código objeto desde una fuente externa. Posteriormente, Visual C ++ Processor Pack agregó compatibilidad con SSE2 a Visual C ++ y MASM .
El compilador Intel C ++ puede generar automáticamente código SSE4 , SSSE3 , SSE3 , SSE2 y SSE sin el uso de un ensamblaje codificado a mano.
Desde GCC 3, GCC puede generar automáticamente código escalar SSE / SSE2 cuando el objetivo admite esas instrucciones. La vectorización automática para SSE / SSE2 se ha agregado desde GCC 4.
El Sun Studio Compiler Suite también puede generar instrucciones SSE2 cuando -xvector = SIMD se utiliza la bandera compilador.
Desde Microsoft Visual C ++ 2012, la opción del compilador para generar instrucciones SSE2 está activada de forma predeterminada.
Soporte de CPU
SSE2 es una extensión de la arquitectura IA-32 , basada en el conjunto de instrucciones x86 . Por lo tanto, solo los procesadores x86 pueden incluir SSE2. La arquitectura AMD64 admite IA-32 como modo de compatibilidad e incluye SSE2 en su especificación. [1] [2] También duplica el número de registros XMM, lo que permite un mejor rendimiento. SSE2 también es un requisito para instalar Windows 8 [3] (y posterior) o Microsoft Office 2013 (y posterior) "para mejorar la confiabilidad de aplicaciones y controladores de terceros que se ejecutan en Windows 8". [4]
Las siguientes CPU IA-32 admiten SSE2:
- CPU basadas en Intel NetBurst ( Pentium 4 , Xeon , Celeron , Pentium D , Celeron D )
- Intel Pentium M y Celeron M
- Intel Atom
- AMD Athlon 64
- Transmeta Efficeon
- VIA C7
Las siguientes CPU IA-32 se lanzaron después de que se desarrolló SSE2, pero no lo implementaron:
- CPU AMD anteriores a Athlon 64 , como Athlon XP
- VIA C3
- Transmeta Crusoe
- Intel Quark
Ver también
- Instrucciones SSE2
Referencias
- ^ Matz, Michael; Hubicka, Jan; Jaeger, Andreas; Mitchell, Mark (enero de 2010). "Interfaz binaria de la aplicación System V - Suplemento del procesador de la arquitectura AMD64 - Versión preliminar 0.99.4" (PDF) . Consultado el 26 de abril de 2013 .
- ^ Niebla, Agner. "Optimización de software en C ++: una guía de optimización para plataformas Windows, Linux y Mac" (PDF) . Consultado el 26 de abril de 2013 .
- ^ "Aspectos internos de la biblioteca / guía de programación de DirectXMath" .
- ^ Corporación Microsoft. "¿Qué es PAE, NX y SSE2 y por qué mi PC necesita admitirlos para ejecutar Windows 8?" . Archivado desde el original el 11 de abril de 2013 . Consultado el 19 de marzo de 2013 .