stringtranslate.com

SSE2

SSE2 ( Streaming SIMD Extensions 2 ) es uno de los conjuntos de instrucciones suplementarias del procesador Intel SIMD (Single Instruction, Multiple Data) introducido por Intel con la versión inicial del Pentium 4 en 2000. Las instrucciones SSE2 permiten el uso de registros XMM (SIMD) en procesadores con arquitectura de conjunto de instrucciones x86. Estos registros pueden cargar hasta 128 bits de datos y ejecutar instrucciones, como suma y multiplicación de vectores, simultáneamente.

SSE2 introdujo instrucciones de punto flotante de doble precisión además de las instrucciones de punto flotante y de números enteros de precisión simple que se encuentran en SSE. SSE2 amplía el conjunto de instrucciones SSE anterior al agregar 144 instrucciones nuevas a las 70 instrucciones anteriores. SSE2 pretende reemplazar completamente a MMX , un conjunto de instrucciones SIMD que se encuentra en los procesadores de arquitectura IA-32. El fabricante de chips competidor AMD agregó soporte para SSE2 con la introducción de sus gamas Opteron y Athlon 64 de CPU AMD64 de 64 bits en 2003.

SSE2 se amplió para crear SSE3 en 2004, y se amplió una vez más para crear SSE4 en 2006.

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 mejoras significativas en el rendimiento en aplicaciones especializadas. Otra ventaja de reemplazar MMX con SSE2 es evitar la penalización por cambio de modo al emitir instrucciones x87 presentes en MMX porque comparte espacio de registro con la FPU x87. SSE2 también complementa las operaciones de vectores de punto flotante del conjunto de instrucciones SSE al agregar soporte para el tipo de datos de precisión doble.

Otras extensiones de SSE2 incluyen un conjunto de instrucciones de control de caché destinadas principalmente a minimizar la contaminación de la caché al procesar flujos infinitos de información y un sofisticado complemento de instrucciones de conversión de formato numérico.

La implementación de SSE2 por parte de AMD 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 la jerga de Intel, "Intel 64") en 2004.

Diferencias entre x87 FPU y SSE2

Las instrucciones FPU (x87) proporcionan una mayor precisión al calcular resultados intermedios con 80 bits de precisión, de manera predeterminada, para minimizar el error de redondeo en algoritmos numéricamente inestables (consulte la justificación del diseño IEEE 754 y las referencias allí incluidas). Sin embargo, la FPU x87 es solo una unidad escalar, mientras que SSE2 puede procesar un pequeño vector de operandos en paralelo.

Si el código diseñado para x87 se traslada al sistema de coma flotante SSE2 de precisión doble 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 mensurable, 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 de 80 bits x87 que implementaban variables de precisión extendida doble, en comparación con los formatos de precisión doble y simple implementados en SSE2: el redondeo de los valores intermedios de precisión extendida a variables de precisión doble no estaba completamente definido y dependía de detalles de implementación, como cuándo se volcaban los registros a la memoria.

Diferencias entre MMX y SSE2

SSE2 amplía 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 tiene el doble de longitud que un registro MMX, es posible que sea necesario modificar los contadores de bucle y el acceso a la memoria para adaptarlo. Sin embargo, se encuentran disponibles cargas y almacenamientos de 8 bytes 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, el rendimiento podría no aumentar significativamente. Dos razones principales son: acceder a datos SSE2 en memoria que no están alineados con un límite de 16 bytes puede generar una penalización significativa, y el rendimiento de las instrucciones SSE2 en implementaciones x86 más antiguas era la mitad que el de las instrucciones MMX. Intel abordó el primer problema agregando una instrucción en SSE3 para reducir la sobrecarga de acceso 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 alias entre sí, el uso de MMX evitará que las instrucciones x87 funcionen como se desea. Una vez que se ha utilizado MMX, el programador debe utilizar la instrucción emms (C: _mm_empty()) para restaurar la operación en el archivo de registro x87. En algunos sistemas operativos, x87 no se utiliza mucho, pero aún puede utilizarse en algunas áreas críticas como pow() donde se necesita precisión adicional. En tales casos, el estado de punto flotante corrupto causado por la falla en la emisión de emms puede pasar desapercibido durante millones de instrucciones antes de hacer que finalmente la rutina de punto flotante falle, devolviendo 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 y generalmente proporciona un rendimiento mucho mejor y proporciona más registros en código de 64 bits, debería ser el preferido para casi todo el trabajo de vectorización.

Uso del compilador

Cuando se introdujo en 2000, SSE2 no era compatible con las herramientas de desarrollo de software. Por ejemplo, para utilizar SSE2 en un proyecto de Microsoft Visual Studio , el programador tenía que escribir manualmente un ensamblado en línea o importar código de objeto desde una fuente externa. Más tarde, el 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 ensamblaje codificado manualmente.

Desde GCC 3, GCC puede generar automáticamente código escalar SSE/SSE2 cuando el destino admite esas instrucciones. La vectorización automática para SSE/SSE2 se ha agregado desde GCC 4.

Sun Studio Compiler Suite también puede generar instrucciones SSE2 cuando se utiliza el indicador del compilador -xvector=simd.

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 posteriores) o Microsoft Office 2013 (y posteriores) "para mejorar la confiabilidad de las aplicaciones y controladores de terceros que se ejecutan en Windows 8". [4]

Las siguientes CPU IA-32 admiten SSE2:

Las siguientes CPU IA-32 se lanzaron después de que se desarrolló SSE2, pero no lo implementaron:

Véase también

Referencias

  1. ^ Matz, Michael; Hubicka, Jan; Jaeger, Andreas; Mitchell, Mark (enero de 2010). "System V Application Binary Interface - AMD64 Architecture Processor Supplement - Draft Version 0.99.4" (PDF) . Consultado el 26 de abril de 2013 .[ enlace muerto permanente ]
  2. ^ Fog, Agner. "Optimización de software en C++: una guía de optimización para plataformas Windows, Linux y Mac" (PDF) . Archivado (PDF) del original el 8 de abril de 2013. Consultado el 26 de abril de 2013 .
  3. ^ "Guía de programación de DirectXMath/Componentes internos de la biblioteca". Archivado desde el original el 2 de julio de 2019 . Consultado el 2 de julio de 2019 .
  4. ^ Microsoft Corporation. "¿Qué son PAE, NX y SSE2 y por qué mi PC necesita soportarlos para ejecutar Windows 8?". Archivado desde el original el 11 de abril de 2013. Consultado el 19 de marzo de 2013 .