¿Qué es el cuello de botella de von Neumann y cómo se puede evitar?

Como dijo Mark Harrison, el cuello de botella es una crítica tanto del modelo de programa almacenado que von Neumann propuso como de la forma en que los programadores en ese momento y ahora se han adaptado a pensar solo en esos términos.

La crítica subyacente es que el modelo de programación se basa en la transferencia constante de datos entre la memoria y la unidad de procesamiento. Tal configuración es un desperdicio ya que un buen porcentaje del tiempo, esa información no necesita ser transferida.

Las optimizaciones modernas de almacenamiento en caché, subprocesos múltiples y acceso a memoria (canal de comando de baja latencia, palabra crítica primero, etc.) han intentado esencialmente convertir la arquitectura general en algo menos von Neumann a través de la abstracción de hardware.

Los cachés ocultan la mayoría de los casos en los que los datos que no necesitan ser devueltos a la memoria, por ejemplo, si se escriben, se accede nuevamente y luego se descartan, no se escribirán innecesariamente. El subprocesamiento múltiple sirve para ocultar la naturaleza serializada de las tareas. Los controladores de memoria intentan agrupar los accesos para eliminar el desperdicio de accesos de una sola palabra a través de un amplio bus de datos.

Sin embargo, todas estas abstracciones de hardware no serían necesarias si la programación, incluida la arquitectura subyacente del compilador y el procesador, no evolucionara bajo el modelo serializado de carga, almacenamiento y cálculo. Las GPU y el hardware de funciones fijas (procesadores de imagen, etc.), por ejemplo, representan otros modelos informáticos donde los datos viajan con las instrucciones previstas y no hay una separación fija y larga entre los recursos informáticos y la memoria; Ambos están estrechamente unidos.

La forma en que uno puede adaptar dichos conceptos a la informática general sigue siendo un tema de investigación y, hasta ahora, no creo que nadie haya encontrado una buena solución para ello.

El cuello de botella de Von Neumann es un término acuñado en 1977 por John Backus.

Se refiere a dos cosas:

  • Un cuello de botella en los sistemas, ya que el ancho de banda entre las Unidades centrales de procesamiento y la Memoria de acceso aleatorio es mucho menor que la velocidad a la que una CPU típica puede procesar datos internamente.
  • El ‘cuello de botella intelectual’ en que los programadores en ese momento pasaban mucho tiempo pensando en la optimización del código para evitar que ‘muchas palabras’ fueran empujadas de un lado a otro entre la CPU y la RAM.

En términos del cuello de botella de los sistemas, se ha hecho mucho:

  • Cachés de CPU
  • Lógica de predicción de rama
  • Muchos tipos de computación paralela

En términos del cuello de botella intelectual, los lenguajes de programación modernos tienden a abstraer los conceptos de lecturas de memoria y similares … y la gran mayoría de los programadores pueden enfocarse en niveles más altos de abstracciones.

Pero, en gran medida, la Ley de Moore (y sus amigos) se han acelerado en muchos de los problemas: no necesita pensar en la eficiencia de la programación para el 90% del código, simplemente puede lanzar un bus de CPU más rápido / L2 más grande caché ante el problema … o simplemente espere un par de años hasta que los chips de nivel de entrada sean lo suficientemente rápidos.

Parte de la historia está cubierta en este blog por Maarten van Emden:
La bomba H y la computadora, parte II: la revolución que casi no sucedió

El artículo original es bastante lúcido: Conferencia de Turing de Backus (Norman Ramsey)