En informática , Streaming SIMD Extensions ( SSE ) es una extensión del conjunto de instrucciones de instrucción única y datos múltiples ( SIMD ) para la arquitectura x86 , diseñada por Intel e introducida en 1999 en su serie Pentium III de unidades centrales de procesamiento (CPU) poco después de su aparición. de Microdispositivos Avanzados (AMD) 3DNow! . SSE contiene 70 instrucciones nuevas (65 mnemónicos únicos [1] que utilizan 70 codificaciones), la mayoría de las cuales funcionan con datos de punto flotante de precisión simple . Las instrucciones SIMD pueden aumentar considerablemente el rendimiento cuando se deben realizar exactamente las mismas operaciones en múltiples objetos de datos. Las aplicaciones típicas son el procesamiento de señales digitales y el procesamiento de gráficos .
El primer esfuerzo SIMD IA-32 de Intel fue el conjunto de instrucciones MMX . MMX tenía dos problemas principales: reutilizaba registros de punto flotante x87 existentes , lo que hacía que las CPU no pudieran funcionar con datos de punto flotante y SIMD al mismo tiempo, y solo funcionaba con números enteros . Las instrucciones de punto flotante SSE operan en un nuevo conjunto de registros independientes, los registros XMM, y agrega algunas instrucciones de números enteros que funcionan en registros MMX.
Posteriormente, Intel amplió SSE a SSE2 , SSE3 , SSSE3 y SSE4 . Debido a que admite matemáticas de punto flotante, tuvo aplicaciones más amplias que MMX y se volvió más popular. La adición de soporte de números enteros en SSE2 hizo que MMX fuera en gran medida redundante, aunque en algunas situaciones se pueden lograr mayores aumentos de rendimiento [ ¿cuándo? ] utilizando MMX en paralelo con operaciones SSE.
SSE originalmente se llamaba Katmai New Instrucciones ( KNI ), siendo Katmai el nombre en clave de la primera revisión del núcleo Pentium III. Durante el proyecto Katmai, Intel buscó distinguirlo de su línea de productos anterior, particularmente de su buque insignia Pentium II . Más tarde pasó a llamarse Extensiones SIMD de transmisión de Internet ( ISSE [2] ) y luego SSE.
AMD agregó un subconjunto de SSE, 19 de ellos, llamados nuevas instrucciones MMX, [3] y conocidos como varias variantes y combinaciones de SSE y MMX, poco después del lanzamiento del Athlon original en agosto de 1999, ver 3DNow! extensiones . AMD finalmente agregó soporte completo para instrucciones SSE, comenzando con sus procesadores Athlon XP y Duron ( núcleo Morgan ).
SSE originalmente agregó ocho nuevos registros de 128 bits conocidos XMM0
como XMM7
. Las extensiones AMD64 de AMD (originalmente llamadas x86-64 ) agregaron ocho registros más XMM8
y XMM15
esta extensión está duplicada en la arquitectura Intel 64 . También hay un nuevo registro de control/estado de 32 bits, MXCSR
. Los registros XMM8
a través XMM15
son accesibles sólo en modo operativo de 64 bits.
SSE utilizó solo un tipo de datos para los registros XMM:
Posteriormente, SSE2 ampliaría el uso de los registros XMM para incluir:
Debido a que estos registros de 128 bits son estados de máquina adicionales que el sistema operativo debe preservar entre cambios de tareas , están deshabilitados de forma predeterminada hasta que el sistema operativo los habilite explícitamente. Esto significa que el sistema operativo debe saber cómo utilizar las instrucciones FXSAVE
y FXRSTOR
, que son el par de instrucciones extendidas que pueden guardar todos los estados de registro x86 y SSE a la vez. Este soporte se agregó rápidamente a todos los principales sistemas operativos IA-32.
La primera CPU compatible con SSE, el Pentium III , compartía recursos de ejecución entre SSE y la unidad de punto flotante (FPU). [2] Si bien una aplicación compilada puede intercalar instrucciones FPU y SSE una al lado de la otra, el Pentium III no emitirá una instrucción FPU y SSE en el mismo ciclo de reloj . Esta limitación reduce la efectividad de la canalización , pero los registros XMM separados permiten que se mezclen operaciones SIMD y de punto flotante escalar sin que el rendimiento se vea afectado por el cambio explícito de modo MMX/punto flotante.
SSE introdujo instrucciones escalares y de punto flotante empaquetado .
MOVSS
MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS, MOVMSKPS
ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
CMPSS, COMISS, UCOMISS
CMPPS
SHUFPS, UNPCKHPS, UNPCKLPS
CVTSI2SS, CVTSS2SI, CVTTSS2SI
CVTPI2PS, CVTPS2PI, CVTTPS2PI
ANDPS, ORPS, XORPS, ANDNPS
PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
PEXTRW, PINSRW
PMOVMSKB, PSHUFW
MXCSR
gestiónLDMXCSR, STMXCSR
MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
El siguiente ejemplo sencillo demuestra la ventaja de utilizar SSE. Considere una operación como la suma de vectores, que se utiliza muy a menudo en aplicaciones de gráficos por computadora. Para sumar dos vectores de cuatro componentes de precisión simple usando x86 se requieren cuatro instrucciones de suma de punto flotante.
vec_res . x = v1 . x + v2 . X ; vec_res . y = v1 . y + v2 . y ; vec_res . z = v1 . z + v2 . z ; vec_res . w = v1 . w + v2 . w ;
Esto corresponde a cuatro instrucciones FADD x86 en el código objeto. Por otro lado, como muestra el siguiente pseudocódigo, una única instrucción 'packed-add' de 128 bits puede reemplazar las cuatro instrucciones de suma escalar.
movaps xmm0 , [ v1 ] ;xmm0 = v1.w | v1.z | v1.y | v1.x agrega xmm0 , [ v2 ] ;xmm0 = v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x movaps [ vec_res ], xmm0 ;xmm0
popcnt
instrucción ( recuento de población : cuenta el número de bits establecidos en 1, se usa ampliamente, por ejemplo, en criptografía ) y más.Los siguientes programas se pueden utilizar para determinar qué versiones de SSE, si las hay, son compatibles con un sistema.