Streaming de extensiones SIMD
En informática, Extensiones SIMD de transmisión (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 la aparición de Advanced Micro Devices (AMD's) 3DNow!. SSE contiene 70 instrucciones nuevas (65 mnemónicos exclusivos 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 varios objetos de datos. Las aplicaciones típicas son el procesamiento de señales digitales y el procesamiento de gráficos.
El primer intento de SIMD IA-32 de Intel fue el conjunto de instrucciones MMX. MMX tenía dos problemas principales: reutilizaba los registros de punto flotante x87 existentes, lo que hacía que las CPU no pudieran trabajar con datos de punto flotante y SIMD al mismo tiempo, y solo funcionaba con números enteros. Las instrucciones de coma flotante SSE operan en un nuevo conjunto de registros independientes, los registros XMM, y agregan algunas instrucciones de enteros que funcionan en los registros MMX.
SSE fue ampliado posteriormente por Intel a SSE2, SSE3, SSSE3 y SSE4. Debido a que admite matemáticas de punto flotante, tenía aplicaciones más amplias que MMX y se hizo más popular. La adición de compatibilidad con números enteros en SSE2 hizo que MMX fuera en gran medida redundante, aunque en algunas situaciones se pueden lograr mayores aumentos de rendimiento mediante el uso de MMX en paralelo con las operaciones de SSE.
SSE originalmente se llamaba Katmai New Instructions (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, en particular de su buque insignia Pentium II. Más tarde pasó a llamarse Internet Streaming SIMD Extensions (ISSE), luego SSE. AMD finalmente agregó soporte para las instrucciones SSE, comenzando con sus procesadores Athlon XP y Duron (Morgan core).
Registros
SSE originalmente agregó ocho nuevos registros de 128 bits conocidos como XMM0
a XMM7
. Las extensiones AMD64 de AMD (originalmente llamadas x86-64) agregaron otros ocho registros XMM8
a XMM15
, y esta extensión está duplicada en Intel 64 arquitectura. También hay un nuevo registro de control/estado de 32 bits, MXCSR
. Los registros XMM8
a XMM15
son accesibles solo en el modo operativo de 64 bits.
SSE usó solo un único tipo de datos para los registros XMM:
- cuatro números de un solo punto de precisión de 32 bits
SSE2 expandiría más tarde el uso de los registros XMM para incluir:
- dos números de doble precisión de 64 bits o
- dos enteros de 64 bits o
- 4 enteros de 32 bits o
- 8 enteros cortos de 16 bits o
- dieciséis bytes de 8 bits o caracteres.
Debido a que estos registros de 128 bits son estados de máquina adicionales que el sistema operativo debe conservar 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 usar las instrucciones FXSAVE
y FXRSTOR
, que es 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 coma flotante (FPU). Mientras que 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 las operaciones de punto flotante escalar y SIMD sin que el rendimiento se vea afectado por el cambio explícito de modo de punto flotante/MMX.
Instrucciones SSE
SSE introdujo instrucciones de punto flotante empaquetadas y escalares.
Instrucciones de coma flotante
- Memory-to-register/register-to-memory/register-to-register- data movement
- Scalar –
MOVSS
- Empaquetado:
MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS, MOVMSKPS
- Scalar –
- Arithmetic
- Scalar –
ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
- Empaquetado:
ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
- Scalar –
- Compare
- Scalar –
CMPSS, COMISS, UCOMISS
- Empaquetado:
CMPPS
- Scalar –
- Desempaquetamiento de datos
- Empaquetado:
SHUFPS, UNPCKHPS, UNPCKLPS
- Empaquetado:
- Conversión de tipo de datos
- Scalar –
CVTSI2SS, CVTSS2SI, CVTTSS2SI
- Empaquetado:
CVTPI2PS, CVTPS2PI, CVTTPS2PI
- Scalar –
- Operaciones lógicas poco profundas
- Empaquetado:
ANDPS, ORPS, XORPS, ANDNPS
- Empaquetado:
Instrucciones de números enteros
- Arithmetic
PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
- Movimiento de datos
PEXTRW, PINSRW
- Otros
PMOVMSKB, PSHUFW
Otras instrucciones
MXCSR
GestiónLDMXCSR, STMXCSR
- Gestión de caché y memoria
MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
Ejemplo
El siguiente ejemplo simple demuestra la ventaja de usar SSE. Considere una operación como la suma de vectores, que se usa 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.Sí. = v1.Sí. + v2.Sí.; 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, un solo 'empaquetado-agregado' La instrucción puede reemplazar las cuatro instrucciones de suma escalar.
movaps xmm0, [v1] ;xmm0 = v1.w TEN v1.z TEN v1.y TEN v1.x addps xmm0, [v2] ;xmm0 = v1.w+v2.w TEN v1.z+v2.z TEN v1.y+v2.y TEN v1.x+v2.x movaps [vec_res] xmm0 ;xmm0
Versiones posteriores
- SSE2, Willamette New Instructions (WNI), introducida con el Pentium 4, es una mejora importante para SSE. SSE2 añade dos características principales: doble precisión (64 bits) punto flotante para todas las operaciones de SSE, y MMX operaciones enteros en registros XMM de 128 bits. En el conjunto de instrucciones SSE original, la conversión a y desde enteros colocó los datos enteros en los registros MMX de 64 bits. SSE2 permite al programador realizar matemáticas SIMD en cualquier tipo de datos (de 8 bits de entero a 64 bits de flotador) completamente con el archivo XMM de registro vectorial, sin la necesidad de utilizar los registros MMX o FPU legados. Ofrece un conjunto ortogonal de instrucciones para tratar con tipos de datos comunes.
- SSE3, también llamado Prescott New Instructions (PNI), es una actualización incremental a SSE2, añadiendo un puñado de instrucciones matemáticas orientadas al DSP y algunas instrucciones de gestión del proceso (ya leído). También permitió la adición o multiplicación de dos números que se almacenan en el mismo registro, que no era posible en SSE2 y antes. Esta capacidad, conocida como horizontal en terminología Intel, fue la mayor adición al conjunto de instrucciones SSE3. ¡El 3DNow de AMD! La extensión también podría hacerlo.
- SSSE3, Merom New Instructions (MNI), es una actualización a SSE3, añadiendo 16 nuevas instrucciones que incluyen la permutación de los bytes en una palabra, multiplicando 16-bit números de punto fijo con redondeo correcto, y dentro de la palabra acumular instrucciones. SSSE3 a menudo se equivoca para SSE4 ya que este término fue utilizado durante el desarrollo de la microarquitectura Core.
- SSE4, Penryn New Instructions (PNI), es otra mejora importante, añadiendo una instrucción de producto de punto, instrucciones adicionales de números enteros, una instrucción popcnt (conteo de populación: cuenta número de bits fijados a 1, utilizado ampliamente, por ejemplo en criptografía), y más.
- XOP, FMA4 y CVT16 son nuevas iteraciones anunciadas por AMD en agosto de 2007 y revisadas en mayo de 2009.
- Extensiones vectoriales avanzadas (AVX), Gesher New Instructions (GNI), es una versión avanzada de SSE anunciada por Intel con una ruta de datos ampliada de 128 bits a 256 bits y 3-operand instrucciones (hasta de 2). Intel lanzó procesadores a principios de 2011 con soporte AVX.
- AVX2 es una expansión del conjunto de instrucciones AVX.
- AVX-512 (3.1 y 3.2) son extensiones de 512 bits a las extensiones vectoriales avanzadas de 256 bits Instrucciones SIMD para la arquitectura del conjunto de instrucciones x86.
Problemas de software y hardware
Con todas las extensiones del conjunto de instrucciones x86, depende del BIOS, el sistema operativo y el programador de aplicaciones probar y detectar su existencia y funcionamiento adecuado.
- Intel y AMD ofrecen aplicaciones para detectar qué extensiones soporta una CPU.
- El opcode CPUID es una instrucción complementaria del procesador (su nombre derivado de la IDentificación de CPU) para la arquitectura x86. Fue introducida por Intel en 1993 cuando introdujo los procesadores Pentium y SL-Enhanced 486.
La aceptación de las extensiones x86 por parte de las aplicaciones de los usuarios ha sido lenta, y las aplicaciones no tienen ni siquiera un mínimo soporte básico de MMX y SSE (en algunos casos) unos 10 años después de que estas extensiones estuvieran disponibles de forma generalizada. La computación distribuida ha acelerado el uso de estas extensiones en la comunidad científica y muchas aplicaciones científicas se niegan a ejecutarse a menos que la CPU sea compatible con SSE2 o SSE3.
El uso de múltiples revisiones de una aplicación para hacer frente a los diferentes conjuntos de extensiones disponibles es la forma más sencilla de solucionar el problema de optimización de la extensión x86. Las bibliotecas de software y algunas aplicaciones han comenzado a admitir múltiples tipos de extensión, lo que sugiere que el uso completo de las instrucciones x86 disponibles finalmente puede volverse común entre 5 y 15 años después de que se introdujeron inicialmente las instrucciones.
Identificación
Los siguientes programas se pueden usar para determinar qué versiones de SSE, si las hay, son compatibles con un sistema
- Utilidad de identificación del procesador Intel
- CPU-Z – CPU, placa base y utilidad de identificación de memoria.
- lscpu - proporcionado por el paquete util-linux en la mayoría de las distribuciones Linux.
Contenido relacionado
Ratón de computadora
Motor de cinco cilindros en línea
Kilobaudios