¿Cómo se pueden explicar, comparar y contrastar CPU, FPU y GPU?

Bueno, como alguien que ha diseñado una CPU y que ahora trabaja en el diseño de GPU, creo que estoy calificado para responder 🙂

Una CPU es un “caballo de batalla de propósito general”. Está diseñado para hacer muchas cosas diferentes, lo más rápido posible. En particular, las CPU están optimizadas para la toma de decisiones, es decir, “SI esto es cierto, ENTONCES haga esto, OTRO haga eso”. Las CPU pueden realizar muchas operaciones diferentes (aritmética / matemática, lógica, cargar y almacenar en memoria / registros, etc.) pero son “generalistas”.

Los diseñadores de CPU intentan mantener las tuberías de CPU cortas. ¿Por qué? Peligros. Cuando tomas una decisión, la CPU tiene que intentar decidir qué vas a hacer a continuación. Considere el siguiente pseudocódigo:

a: = b + c

SI a = 0 ENTONCES

hacer esto;

MÁS

Haz eso;

TERMINARA SI;

Ahora, para ejecutar cada instrucción, la CPU debe:

  • Cargue las instrucciones de la memoria
  • Cargue cualquier valor que la instrucción pueda necesitar
  • Hacer la instrucción
  • Escribe el resultado en la memoria
  • Siguiente instrucción …

Una CPU no ejecuta cada instrucción por separado antes de comenzar con la siguiente. En cambio, la CPU se canaliza de modo que, a medida que se ejecuta cada instrucción, se carga la siguiente, etc.

En el ejemplo de código anterior, a medida que se ejecuta “a: = b + c”, la CPU ya ha cargado la instrucción IF y también está intentando cargar la instrucción para que se ejecute después del IF. ¿Pero cuál debería cargar? ¿El “hacer esto” o el “hacer eso”? Aún no ha realizado la operación “a: = b + c”, por lo que no sabe qué opción tomar. En cambio, toma una conjetura. Esto se llama predicción de rama. La CPU hace una suposición y carga una de ellas. Si se equivoca, tiene que tirar las instrucciones que cargó y cargar las otras en su lugar. Esto se llama una “penalización de rama”. Cuanto más larga sea la tubería, mayor será la penalización.

Una FPU generalmente se construye como un “coprocesador” para una CPU. Por lo general, no se programa por sí solo, sino que hace aritmética de punto flotante en nombre de la CPU que lo controla. En teoría, sería posible agregar instrucciones aritméticas de punto flotante dentro de una CPU como parte de su conjunto de instrucciones normal, pero eso generalmente no se hace porque la aritmética de punto flotante es lenta y requiere grandes cantidades de lógica para implementarla. Hacerlo dentro de una CPU “normal” ralentizaría toda la CPU y, por lo tanto, generalmente lo hacemos afuera como una unidad separada. La CPU envía datos e instrucciones a la FPU; la FPU realiza los cálculos y luego la CPU lee los resultados nuevamente.

Una GPU está optimizada para realizar grandes cantidades de operaciones de punto flotante en paralelo. Para renderizar gráficos en 3D, debe realizar las mismas operaciones muchas veces con datos diferentes. Por lo tanto, están optimizados con canalizaciones muy anchas que utilizan operaciones de estilo SIMD (Instrucción única, Datos múltiples) donde obtiene una palabra de datos muy grande (por ejemplo, 256 bits) que consiste en múltiples valores concatenados juntos. Por ejemplo, en una palabra de 256 bits, podría tener datos para 8 píxeles, con 8 bits por píxel, y desea realizar la misma operación en cada uno de esos valores.

Las GPU están construidas con tuberías que son anchas (ver arriba) y largas. Como resultado, son muy eficientes para realizar un gran número de operaciones matemáticas en paralelo (por ejemplo, A = (B + C) / D + E, donde hay un millón de valores para B, C, D y E, y usted quiere los correspondientes millones de valores de A). Una canalización larga significa que puede realizar una serie de operaciones matemáticas una tras otra muy rápidamente, pero requieren trabajo para configurar la canalización.

Las GPU se construyeron originalmente específicamente para implementar el procesamiento de gráficos 3D (de ahí el nombre) y, por lo tanto, se adaptaron a las operaciones requeridas para las diversas API 3D (DirectX, OpenGL); sin embargo, las personas comenzaron a darse cuenta de que sus habilidades para realizar operaciones matemáticas en grandes conjuntos de datos los hacían útiles para otras cosas, por lo que los fabricantes de GPU comenzaron a agregar un acceso más directo para que los programadores pudieran usar las capacidades matemáticas de la GPU para otras cosas además de los gráficos.

Las GPU son excesivas si quieres hacer matemáticas simples en un puñado de valores a la vez, pero si quieres hacer la misma operación matemática en un gran conjunto de datos, son perfectos.

Esto da una diferencia de muy alto nivel entre CPU y GPU

Las FPU generalmente son parte de las CPU y GPU, aunque históricamente también se han implementado como chips distintos que tuvo que conectar o soldar a sus otros componentes.
La CPU y la GPU pueden ejecutar muchas operaciones, tanto aritméticas (suma, resta, etc.) como instrucciones de control (saltar a otra parte del programa, buscar datos para agregar, hacer diferentes cosas dependiendo del valor de alguna variable)
Las FPU son circuitos especializados para realizar operaciones de coma flotante (suma, resta, exponenciación, etc.).
Por lo tanto, las CPU y las GPU usan FPU si la instrucción que procesan es una instrucción de coma flotante para calcular el resultado.