Día tras día, en cuanto a las noticias referidas al hardware no paramos de leer y escuchar información sobre CPUs, GPUs e incluso últimamente procesadores dedicados a la IA. Pero no son los únicos procesadores existentes dentro de nuevos dispositivos, ya sean un PC convencional o un dispositivo PostPC. Sino que se ven acompañados por otros procesadores que les sirven de apoyo, los cuales son comúnmente conocidos como aceleradores. De ellos te vamos a hablar en esta entrada.
Continuamente nuestros ordenadores hacen tareas concurrentes y repetitivas que no son realizadas por la CPU o la GPU, sino por unidades que suelen pasar desapercibidas cuando se habla de las diferentes arquitecturas de hardware y de las que os vamos a hablar a continuación.
El primer acelerador de la historia
En los años 60, quien fuera uno de los pioneros de los gráficos por ordenador, Ivan Sutherland, acuño el concepto «Rueda de la reencarnación» para explicar un fenómeno que se ha da incluso hoy en el día el en el mundo del hardware.
Los ordenadores de esa época mostrar sus rudimentarios gráficos en el osciloscopio que utilizaban como pantalla necesitaban cargar los valores de coordenadas de X e Y donde el haz de electrones se tenía que colocar y mandar el comando de trazado. El problema que se encontraban es que cada vez que la CPU tenía que encargarse de dibujar la pantalla aparte de ejecutar el programa.
La solución por parte de Sutherland y su equipo fue lo que llamaron «Display List», el cual era un hardware aparte que leía las coordenadas de pantalla escritas por el procesador en una parte de la pantalla. De esta manera el procesador no tenía que perder el tiempo controlando el haz de electrones del osciloscopio o de cualquier otro tipo de pantalla utilizada, había nacido con ello el primer acelerador de la historia.
El desarrollo del Display List como hardware de apoyo sirvió para la creación del primer sistema de dibujado, el Sketchpad, y a partir de dicha experiencia Sutherland publico un paper titulado «On the design of Display Processors» donde llego a la conclusión que pese a la creciente potencia de los procesadores era necesario crear procesadores de apoyo que acelerasen tareas concretas realizadas de manera continua y repetida.
Definición básica de lo que es un acelerador
Cuando hablamos de aceleración, nos estamos refiriendo a aumentar la velocidad en la que recorremos una distancia en un determinado espacio de tiempo. En el mundo del hardware llamamos acelerador a todo tipo de unidad que realiza un trabajo concreto de forma más rápida y eficiente que un procesador complejo: CPU, GPU, etc. En paralelo a este.
Todo acelerador cumple las siguientes dos condiciones:
- Ocupa un espacio en el hardware que es varias órdenes de magnitud más pequeño en área en comparación con un procesador complejo.
- Su consumo energético, a la hora de realizar dicha tarea, es minúsculo en comparación con una CPU.
Es decir, los aceleradores ganan por goleada en la relación potencia/área y potencia/consumo a cualquier procesador de propósito general. De ahí a que sean utilizados en todo tipo de procesadores.
Ejemplos de aceleradores
Tenemos varios ejemplos de aceleradores en nuestros sistemas informáticos:
- Cuando haces una foto con tu móvil y esta se convierte en un archivo dentro de su almacenamiento, el proceso de convertir la imagen capturada por el CCD de la cámara lo hace un acelerador pensado para ello.
- Cuando estas reproduciendo una película en un formato de vídeo concreto el que descifra el archivo para convertirlo en esa sucesión de imágenes es un acelerador.
- En el mundo de las GPUs, unidades como las encargadas de hacer el filtraje de texturas, de rasterizar la geometría de la escena e incluso las unidades de intersección en el Ray Tracing son aceleradores.
Como se puede ver se usan para todo tipo de aplicaciones, tipos de ordenador y procesadores.
Función fija versus aceleradores de propósito específico
Una unidad de función fija tiene sus instrucciones micro cableadas, esto significa que no sigue un programa de manera convencional, sino que lo que hace es que a partir de unos datos de entrada los procesa de esa única manera determinada y saca un resultado.
Pese a que las unidades de función fija se han utilizado históricamente para acelerar ciertas taras, estos a día de hoy están en desuso mientras que los aceleradores de propósito específico son cada vez más utilizados,
Los aceleradores de propósito específico son diferentes, ya que sí que ejecutan un programa, pero están diseñados para ejecutar ese programa de la manera más eficiente posible y ha sido diseñado en exclusiva para realizar ese tipo de tarea en concreto. Por lo que tienen una unidad de control y una ALU como todo procesador y ejecutan un programa en memoria.
La ventaja que tienen los aceleradores de propósito específico sobre la función fija, es que la lista de instrucciones que ejecutan para realizar dicha tarea se puede actualizar, mientras que en la función fija no y sería necesario crear un procesador desde cero para añadir mejoras en el algoritmo que ejecutan.
Arquitectura general de los aceleradores de propósito específico
No vamos a hablar de ellos uno a uno, pero sí que vamos a hablar de cómo están diseñados todos ellos en general y porqué son tan eficientes a la hora de hacer las tareas para lo que han sido diseñados, para ello vamos a explicar uno por uno los diferentes pilares que definen este tipo de unidades, independientemente de cuál sea el propósito que cumplen y para lo que han sido diseñados.
Primer pilar: especialización
A la hora de diseñar las unidad de ejecución de las CPUs, las ALUs, los arquitectos tienen que realizar un compromiso de cara a las instrucciones más complejas, ya que por falta de espacio en el chip simplemente no se pueden cablear todas las instrucciones en la ALU. Por lo que el compromiso que toman en el diseño es hacer es ejecutar las instrucciones más complejas a partir de otras más simples.
Cuando se divide una instrucción en otras más simples, lo que estamos haciendo es que por cada una de esas instrucciones se realice el proceso de captación-descodificación-ejecución en cada una de ellas.
Son precisamente las etapas de captación y descodificación de las instrucciones las que más energía consumen de todas, muy por encima del simple hecho de ejecutar la instrucción misma en la ALU.
En los aceleradores, esas instrucciones complejas son integradas dentro del hardware de tal manera que son ejecutados en el acelerador en muchas menos instrucciones que en una CPU. Esto reduce la cantidad de accesos realizados a memoria para la captación y posterior descodificación, lo que implica un consumo energético mucho menor y elimina la latencia entre instrucciones, acelerando el proceso de ejecución de las mismas.
Segundo pilar: complejidad de los datos utilizados
Según el tipo de unidad de ejecución utilizada el consumo será mayor o menor, no es el tipo de dato sino el tipo de ALU lo que consume. ¿Qué ocurre si calculamos una suma de 8 bits en una ALU de 32 bits? Entonces el consumo energético será el de una ALU de 32 bits y no el de una ALU de 8 bits.
Hay problemas que para resolverse no requieren una alta precisión matemática, esto hace que se puedan solucionar utilizando ALUs con precisión más simple, las cuales ocupan menos espacio y consumen menos. Por lo que además se pueden colocar una mayor cantidad de ALUs para realizar esas tareas concretas, aumentando así la potencia de cómputo por ciclo de reloj.
Hay que tener en cuenta que las ALUs de procesadores complejos como las CPUs han de ser anchas para poder ejecutar lo más rápidamente posible instrucciones con datos de alta precisión, pero esto es una contrapartida de cara a tareas que requieren trabajar con menor precisión acaban consumiendo mucho más de lo que deberían.
Tercer pilar: Memoria
Otro motivo por el cual consumen tan poco y pueden trabajar en paralelo es porque cada acelerador tiene su propia memoria, la cual no es una caché, sino una memoria RAM dentro del acelerador que es exclusiva del mismo.
El acelerador no tiene la capacidad de ejecutar nada en la RAM del sistema, no tiene acceso a ella y requiere que otra unidad busque los datos o se los suministre copiando estos a su RAM privada. Hay que tener en cuenta que el consumo energético a la hora de acceder a una memoria cuanto más externa es a la unidad encargada de ejecutar la instrucción, entonces más energía consume debido a que recorre una distancia mayor.
Es por ello que los aceleradores están diseñados para que no utilizar la memoria del sistema sino la suya propia en exclusiva, además el hecho de no tener que crear los caminos de datos para que estos accedan a memoria de manera continua simplifica enormemente el diseño general de los procesadores.
El futuro de los aceleradores
A medida que la Ley de Moore va echando el freno nos encontramos con que el viejo paradigma basado en aumentar el rendimiento con un mayor número de núcleos o con arquitecturas más complejas es cada vez menos viable. Esto obliga a los ingenieros a pensar formas en las que hacer que los procesadores sean más rápidos que los anteriores, lo que implica el desarrollo de aceleradores para acelerar tareas concretas que se ejecutan de manera concurrente.
En un futuro las diferencias de rendimiento entre dos arquitecturas que nos parecerán idénticas sobre el papel será debido exclusivamente a la acción de los aceleradores. Incluso vamos a ver como los procesadores acaban ganando aceleradores para ejecutar ciertos tipos de instrucciones que tradicionalmente se ejecutaban en la misma CPU.