¿Qué son las tecnologías MMX, SSE y AVX? ¿Cómo mejoran el rendimiento?

Rubén Castro, 29 diciembre 2020

Aunque ya se han acabado las ofertas de navidad, en Cecotec (gran marca española de gadgets y pequeño electrodoméstico) están tirando la casa por la ventana y tienen ofertas en todos sus productos de más del 60%. ¡Corre que vuelan!

Quiero ver las mejores ofertas de Cecotec

La informática está llena de acrónimos, algunos de ellos ya son muy conocidos como CPU, GPU, RAM, SSD, etc. Sin embargo, hay algunos acrónimos mucho más desconocidos; en este artículo vamos a explicar los términos MMX, SSE y AVX que están relacionados con los conjuntos de instrucciones del procesador y veremos si son importantes o son trucos de marketing.

Un poco de contexto: historia

A mediados de los 80 el mercado de las CPU era bastante similar a como es ahora. Intel tenía la mayor parte del pastel y se enfrentaba a la cada vez más dura competencia de AMD.

Los ordenadores domésticos, como el Commodore 64, utilizaban procesadores básicos de 8 bits, mientras que el ordenador de sobremesa empezaba a pasar de los chips de 16 bits a los de 32 bits. A mayores bits se obtiene una mejor precisión y capacidad.

Esas CPU eran escalares lo que quiere decir que cualquier operación matemática se lleva a cabo usando solo valores de datos individuales. Por ejemplo, para sumar dos valores de datos juntos, solo se procesa para esos dos números. Si quieres hacer algo como sumar el mismo número a un grupo de 16 números, entonces necesitarías emitir 16 conjuntos de instrucciones para hacerlo. Lo cual limita el rendimiento.

Además, algunos procesadores no tenían una capacidad innata para sumar números decimales (de coma flotante), digamos, 3,80 y 7,26. Para calcularlos, necesitaban otro procesador y un conjunto de instrucciones diferentes, la lista de comandos que le dice al CPU qué hacer.

De hecho, para las CPU de esa época, las instrucciones x86 eran para cálculos de números enteros y x87 para operaciones de coma flotante. Hoy en día, usamos el término x86 para cubrir ambos, porque todo se hace con el mismo chip.

Todo cambió cuando Intel lanzó el 80486 (el mítico 486) su primera CPU de escritorio que tenía una unidad integrada de coma flotante (FPU) por lo que ya no necesitaba un co-procesadores (procesador separado para el manejo de operaciones de números de coma flotante).

Debido a eso el 80486 fue un procesador mucho más grande, pero aún mayores eran los beneficios de rendimiento al tener la capacidad de operar con ambos tipos de números.

Aun así, el 486 seguía siendo un procesador escalar cosa que cambió en octubre de 1996 con la llegada de los Pentium de Intel que contaban con la tecnología MMX.

¿Qué es MMX?

En el mundo de las matemáticas, los números pueden estar agrupados en conjuntos de diferentes formas y tamaños… Un tipo de agrupación muy útil es el vector. Y la tecnología MMX trajo al mundo de los procesadores la capacidad de hacer matemáticas vectoriales.

Como todo, en sus inicios sus posibilidades eran bastante limitadas y solo se podía usar con números anterior. El sistema usaba los registros dedicados a la FPU (unidad de coma flotante), así que los programadores que quisieran usar algunas instrucciones MMX deberían tener en cuenta que cualquier cálculo de coma flotante no podía hacerse al mismo tiempo.

La FPU del Pentium tenía registros de 64 bits de tamaño, y para las operaciones MMX, cada uno podía ser empaquetado con dos números enteros de 32 bits, cuatro de 16 bits u ocho de 8 bits. Estos grupos de números son los vectores, y cada instrucción emitida para ser procesada en ellos se llevaría a cabo en todos los valores del grupo.

Este tipo de sistema se llama SIMD (instrucción única, datos múltiples) y marcó un gran paso adelante en la capacidad de las CPU utilizadas en los ordenadores domésticos ya que prácticamente todo lo que implique hacer el mismo cálculo a grupos de números sufriría un incremento de rendimiento importante. Por supuesto, también mejoró las tareas de procesamiento en el manejo de gráficos 3D, multimedia y señales generales.

Desafortunadamente, la adopción del MMX fue bastante lenta, debido a su impacto negativo en el rendimiento de la coma flotante. AMD solucionó parcialmente este problema creando su propia versión, llamada 3DNow! unos dos años después de que apareciera MMX. 3DNow! tenía la ventaja de ofrecer más instrucciones SIMD y también podía manejar números de punto flotante, pero también sufría de una falta de aceptación por parte de los programadores.

¿Qué es el SSE?

Las cosas mejoraron en 1999, con el lanzamiento del procesador Pentium III de Intel y el SSE (Streaming SIMD Extensions). Esta vez había un conjunto extra de ocho registros de 128 bits, separados de los de la FPU, y una pila de instrucciones extra que podían manejar los números en coma flotante.

El uso de los registros separados significó que la FPU ya no estaba tan atada, aunque el Pentium III no podía emitir instrucciones SSE al mismo tiempo que las de la FP. La nueva característica también solo admitía un tipo de datos en los registros: cuatro números en coma flotante de 32 bits.

Pero la decisión de ofrecer instrucciones SIMD en coma flotante permitió un mayor rendimiento en aplicaciones como la codificación y descodificación de vídeo, el procesamiento de imágenes y audio, la compresión de archivos y muchas otras.

Una versión actualizada, SSE2, apareció en 2001 con el Pentium 4, y esta vez el soporte del tipo de datos fue mucho mejor: cuatro números en coma flotante de 32 bits o dos de 64 bits, así como dieciséis de 8 bits, ocho de 16 bits, cuatro de 32 bits o dos enteros de 64 bits. Los registros MMX permanecieron en el procesador, pero todas las operaciones MMX y SSE se pudieron realizar utilizando los registros SSE de 128 bits por separado.

El SSE3 cobró vida en 2003, con más instrucciones y la posibilidad de realizar algunas matemáticas entre los valores que residían en el mismo registro.

La arquitectura Intel Core llegó 3 años después, lo que trajo otra revisión de la tecnología SIMD (SSSE3 - Supplemental SSE) con la versión final, SSE4, que llegó a finales del mismo año.

La arquitectura de AMD tuvo su propia versión de la extensión SSE4 - SSE4a en los procesadores lanzados a partir de 2007.

Una actualización menor, SSE4.2 (por lo que la versión original se conoció como SSE4.1), fue lanzada en 2008 en la gama de procesadores Nehalem de Intel. Ninguna de las actualizaciones trajo consigo cambios en los registros, pero sí más instrucciones, abriendo aún más el abanico de operaciones matemáticas y lógicas que podían tener lugar.

A finales de 2008, tanto Intel como AMD estaban fabricando procesadores que podían manejar MMX hasta los conjuntos de instrucciones SSE4.2, y muchas aplicaciones (sobre todo juegos) estaban empezando a requerir estas características para poder ejecutarse.

¿Qué es AVX?

Ya en el 2008 Intel anunció que estaban trabajando en una importante actualización de su configuración SIMD y en 2011 se lanzó la gama de CPU Sandy Bridge, con AVX (Advanced Vector Extensions). Todo se duplicó: el doble de registros vectoriales y el doble de tamaño.

Por ejemplo, el Core i7-2600K podía potencialmente producir más de 230 GFLOPS (mil millones de operaciones en coma flotante por segundo), al hacer instrucciones AVX. Lo malo es que al usar AVX la carga del chip era tan alta que Intel hizo que disminuyeran automáticamente la velocidad de reloj en un 20%, para mantener el consumo de energía y los niveles de calor bajos. Y este es un problema que continua en las CPU modernas al hacer cálculos SIMD.

Los dieciséis registros de 256 bits sólo podían tomar ocho números de flotación de 32 bits o cuatro de 64 bits, por lo que era un poco más restrictivo que SSE en términos de formatos de datos, pero ese conjunto de instrucciones todavía estaba disponible. Para entonces, el soporte de software para las operaciones de vectores de la CPU estaba bien establecido, desde los compiladores, hasta las aplicaciones más complejas.

Otra mejora ofrecida con AVX fue la capacidad de trabajar con tres valores a la vez. En todas las versiones de SSE, las operaciones tenían lugar entre dos valores, con la respuesta reemplazando uno de ellos en el registro. Al hacer las instrucciones SIMD, AVX mantiene los valores originales seguros y almacena el resultado en un registro separado.

La secuela, AVX2 fue lanzada con la arquitectura Haswell de procesadores Core de 4ª generación en 2013, y fue una actualización significativa gracias a la inclusión de otra extensión: FMA (fusible multiplicador-acumulador).

Aunque se trataba de una característica separada de AVX2, la posibilidad de emitir una instrucción que luego realizaría dos operaciones era enormemente beneficiosa para las aplicaciones que hacían matemáticas vectoriales o matriciales, aunque también funcionaba en operaciones escalares.

Sin embargo, la extensión FMA de Intel era diferente a la de AMD; tanto es así que son totalmente incompatibles. Esto se debe a que el FMA de Intel es un sistema de tres operandos, es decir, funciona con 3 valores separados - esto puede ser en forma de 2 números de fuente y una respuesta separada, o 3 valores de fuente y una respuesta que reemplaza a uno de ellos.

El FMA es de cuatro operandos, por lo que es posible hacer matemáticas con 3 números y no tener que escribir la respuesta sobre uno de ellos. Mientras que FMA4 es matemáticamente mejor que FMA3, su implementación es un poco más compleja, tanto en términos de programación como de integración de la característica en el procesador.

AVX-512

Cuando AVX2 llegó a los consumidores, Intel ya estaba haciendo planes para su sucesor, el AVX-512. No solo habría el doble de registros de nuevos, sino que también se duplicaría el tamaño, y habría una pila de nuevas instrucciones.

El primer lote de chips que puso en marcha la característica del AVX-512 fue la serie Xeon Phi 7200… la segunda generación de procesadores de Intel, dirigidos al mundo de las supercomputadoras, y que contaba con 72 núcleos y 288 hilos.

A diferencia de sus iteraciones anteriores, el nuevo conjunto de instrucciones vectoriales consistía en 19 subconjuntos: un núcleo básico, el AVX-512F, que debía ofrecerse para cumplir con la normativa, y luego una serie de muy específicos. Estos conjuntos extra cubren operaciones como matemáticas recíprocas, FMA entero, o algoritmos de redes neuronales de convolución.

Los procesadores AVX-512 ya han llegado a los consumidores y lo malo es que los registros vectoriales ocupan un espacio muy importante en el chip. Además, y dado que el uso de AVX, en cualquier versión, resulta en la disminución automática de los relojes, el uso de AVX-512 en aplicaciones domésticas conlleeva un rendimiento menor en muchas circunstancias, ya que es aún más exigente en cuanto a la potencia en funcionamiento.

AMD no ofrece soporte para el AVX-512 y no tiene planes de hacerlo. Considera que la tarea de manejar cálculos de vectores grandes es competencia de las GPU, al igual que Nvidia, y ambas han lanzado productos específicamente para tales funciones.

Presente y Futuro

La capacidad adicional de las CPU para manejar la matemática de vectores marcó un importante paso adelante. Los procesadores actuales son extremadamente capaces, ofreciendo una masa de conjuntos de instrucciones para manejar operaciones enteras y de punto flotante para datos escalares, vectoriales y matriciales.

En el caso de los dos últimos tipos de datos, las CPU ahora compiten directamente con las GPU; el mundo de los gráficos 3D es todo sobre SIMD, vectores, flotadores, etc. y el desarrollo de los aceleradores gráficos ha sido meteórico.

Pero el auge de la GPU significa que las CPU no tienen que llevar unidades vectoriales muy grandes; y es por esto por lo que AMD no ha desarrollado su propio sucesor de AVX2 (una extensión que tienen en sus chips desde 2015). Tampoco olvidemos que las CPU de la próxima generación pueden parecerse más a las SoC móviles con silicio dedicado a ciertos tipos de tareas. Intel, por otro lado, parece estar interesada en desplegar el AVX-512 en tantos productos como sea posible.

Entonces, ¿vamos a ver un AVX-1024? Probablemente no, o al menos, no por muchos años. En cambio, es más probable que Intel ofrezca subconjuntos de instrucción adicionales para el AVX-512, para mejorar su flexibilidad, y dejar el rendimiento bruto de SIMD a su recién desarrollada línea de GPU.

SSE y AVX son ahora una parte integral de la escena del software: Adobe Photoshop requiere que las CPU soporten SSE4.2, como mínimo; la API de aprendizaje de máquinas TensorFlow demanda soporte AVX en las CPU; los equipos de Microsoft solo pueden hacer efectos de vídeo de fondo si AVX2 está disponible. Eso solo significa que estos no van a desaparecer pronto, a pesar de la potencia SIMD de una GPU.

Fuentes

  1. es.wikipedia.org
Ver más
WikiVersus puede usar cookies para recopilar estadísticas, optimizar la funcionalidad del sitio y ofrecerte publicidad basada en tus intereses. Si sigues navegando estarás aceptando su uso. Más información de nuestras políticas.