Las CPU son muy rápidas, funcionan a 4 GHz más o menos, sin embargo, solo una pequeña fracción de su matriz, llamada FPU (unidad de punto flotante) está dedicada a las operaciones de punto flotante. El resto está dedicado a muchas otras funciones que la CPU debe realizar de manera rápida y eficiente, como instrucciones y búsqueda de datos, problema de fuera de servicio paralelo, manejo del flujo de control por predicción de rama, manejo de múltiples niveles de jerarquía de memoria, incluidos registros, Caches L1, L2 y mucho más.
Una CPU moderna de cuatro núcleos como Intel Core i7 tiene cuatro núcleos, que son CPU independientes en sí mismos. Además, cada núcleo tiene dos subprocesos (lógicos), que pueden verse nuevamente como CPU independientes. El resultado final es que Intel Core i7 puede realizar hasta 8 operaciones de FPU simultáneamente.
La diferencia entre hilos y núcleos es que los hilos comparten en gran medida los recursos, mientras que los núcleos son replicados e independientes. Uno puede ver el efecto de esta organización en comandos como ‘top’ en Linux, donde un solo chip de cuatro núcleos aparece como 8 CPU.
- ¿Cómo se calcula la pérdida WARP de la estadística de orden K para aprender a clasificar las recomendaciones?
- ¿Qué recursos sobre modelos gráficos se recomiendan para los estudiantes de aprendizaje automático que desean ingresar al campo?
- ¿Qué es el etiquetado gráfico?
- ¿Cuál es una buena manera de entender la pérdida de Minkowski con una configuración diferente?
- ¿Cuál sería la arquitectura más apropiada para entrenar una red neuronal basada en dos imágenes de entrada?
En contraste, una GPU como Nvidia GTX, o un chip AMD similar, tiene miles de FPU. Funcionan más lentamente que las CPU, pero su potencia proviene de la gran cantidad de unidades de procesamiento simples.
En una GPU, todas esas unidades están organizadas en tuberías simples, capaces de funcionar muy rápido para secuencias de instrucciones optimizadas especializadas con pocos saltos. En las CPU, también hay tuberías profundas, pero son muy complejas ya que tienen que manejar código arbitrario con potencialmente muchos saltos.
La técnica clave empleada por las CPU para los saltos se denomina predicción de ramificación, donde la CPU intenta adivinar literalmente el resultado de los saltos por adelantado. Las CPU modernas pueden hacer esto correctamente alrededor del 95% del tiempo, lo cual es sorprendente, si lo piensas por un momento.
En caso de que la CPU adivine incorrectamente, la consecuencia es una gran desaceleración en la velocidad de ejecución, ya que las instrucciones adivinadas incorrectamente restantes deben vaciarse y la tubería se llena nuevamente. Una penalización típica de predicción de rama de CPU contemporánea de más de 14 ciclos es sustancial, especialmente si se combina con errores de caché.
En las GPU, las tuberías se llenan de secuencias más secuenciales mediante código producido por varios algoritmos especializados, como gráficos o aprendizaje profundo. Las GPU también pueden evitar los saltos con frecuencia, utilizando una variedad de técnicas. Dicho esto, las GPU todavía tienen problemas de salto: en particular sufren de divergencia de rama, pero tienen otras técnicas para evitar el impacto en el rendimiento asociado con esto. Gran parte se puede evitar con algoritmos bien diseñados.
En resumen, las GPU son mucho más rápidas que las CPU para el aprendizaje profundo porque tienen órdenes de magnitud más recursos dedicados a operaciones de punto flotante, ejecutando algoritmos especializados que aseguran que sus tuberías profundas siempre estén llenas.