¿Se terminó el almuerzo gratis? [cerrado]

12

En su famoso artículo El almuerzo gratis terminó de 2005, Herb Sutter predijo una revolución de programación concurrente Tan grande como la revolución orientada a objetos. ¿Ha ocurrido realmente esta revolución en los años 2005 - 2013?

Puntos clave en el artículo:

  • Los fabricantes de procesadores se han quedado sin espacio con la mayoría de sus enfoques tradicionales para mejorar el rendimiento de la CPU. En lugar de impulsar velocidades de reloj cada vez más altas, en lugar de eso, están recurriendo a arquitecturas de subprocesamiento múltiple y multinúcleo.

  • Las aplicaciones tendrán que ser cada vez más concurrentes si quieren explotar completamente las ganancias de rendimiento de CPU.

  • "Oh, el rendimiento no importa mucho, las computadoras simplemente se vuelven más rápidas" la declaración será incorrecta.

  • La eficiencia y la optimización del rendimiento obtendrán más, no menos, importancia. Aquellos lenguajes que ya se prestan a una pesada optimización encontrarán nueva vida; aquellos que no necesitan encontrar formas de competir y ser más eficientes y optimizables. Espere una mayor demanda a largo plazo de lenguajes y sistemas orientados al rendimiento.

  • Los lenguajes y sistemas de programación se verán cada vez más obligados a lidiar con la concurrencia. Necesitamos desesperadamente un modelo de programación de nivel superior para la concurrencia de la que ofrecen los idiomas en la actualidad.

pregunta cpp 30.09.2013 - 07:03

2 respuestas

23

Sí, pero depende.

No puede esperar escribir software no trivial , de alto rendimiento sin aprovechar el hardware paralelo y usar la concurrencia como una técnica de estructuración de programas. Pero el software la mayoría es trivial y no crítico para el rendimiento. Una aplicación web no está haciendo mucho procesamiento de números, y las aplicaciones CRUD no tienen nada que ver con los límites de tiempo difíciles de algunos programas de simulación y médicos.

Los desarrolladores de juegos en particular necesitan preocuparse por esto, porque los juegos son el tipo de aplicación más común con requisitos suaves en tiempo real. El problema es relevante en un teléfono móvil, donde desea exprimir la mayor cantidad posible de computación y renderización de un chip integrado con dos núcleos de CPU y una GPU de bajo consumo. Esa es otra razón por la que tantos desarrolladores están mirando a Haskell y esperando a que maduren lenguajes como Rust: queremos seguridad y en hardware moderno.

Desde 2005, hemos adquirido herramientas nuevas y mejoradas como OpenCL, CUDA, OpenMP y conjuntos de instrucciones vectoriales para trabajar con concurrencia y paralelismo de datos en idiomas establecidos. Sin embargo, los recién llegados relativos están diseñados desde el principio para hacer muchas más cosas interesantes con concurrencia.

El tiempo de ejecución concurrente de Haskell permite que el lenguaje brinde un amplio soporte para paralelismo ligero (chispas) y abstracciones de concurrencia (hilos, canales y referencias mutables compartidas). Go and Rust también ofrece tareas ligeras, Go mediante canales y Rust mediante el paso de mensajes.

Estos sistemas ofrecen seguridad de memoria, tiempos de ejecución de rendimiento y protección estática contra ciertos tipos de carreras. La inmutabilidad predeterminada de Haskell y Rust hace que la concurrencia sea mucho más fácil de manejar para los humanos. Erlang ya estaba haciendo esto en los años 80, pero las necesidades del software y nuestro conocimiento sobre cómo diseñar sistemas de programación también han mejorado desde ... gracias a Dios.

Finalmente, muchos idiomas existentes (no nombraré nombres) están listos para rechazar como opciones creíbles para escribir software nuevo. Sus cargas de complejidad y sus pocas abstracciones de concurrencia las hacen inadecuadas para las consideraciones de las aplicaciones modernas. Simplemente estamos esperando alternativas maduras.

    
respondido por el Jon Purdy 30.09.2013 - 07:55
6

Aquí hay algunos puntos de datos; decide por ti mismo si cuenta como una revolución.

Hardware paralelizado

Alrededor de 2005, tanto Intel como AMD comienzan a producir CPUs x86 de escritorio de 2 núcleos (Pentium D y Athlon 64), con velocidades de reloj de aproximadamente 3 GHz.

En 2006, se lanzó PlayStation 3, con el procesador Cell con 8 + 1 cores a 3.2 GHz.

En 2006, se lanzó la serie GeForce 8. Consiste en grandes números (~ 100) de 'procesadores de flujo' de propósito general, a diferencia de unidades específicas de gráficos. Alrededor de 2007, se lanzó la especificación CUDA 1.0, que permite algunos cálculos de uso general en hardware NVidia masivamente paralelo.

Desde entonces, las tendencias continuaron.

Supongamos que ahora, en 2013, tanto Intel como AMD ofrecen CPU de 4, 8 y 16 núcleos, con velocidades de reloj ligeramente superiores a los 4 GHz. Los diseños de doble núcleo y de cuatro núcleos son comunes para dispositivos de menor potencia, como computadoras portátiles y teléfonos inteligentes.

Todo esto es un hardware informático de uso cotidiano de producción masiva.

Software

CUDA se lanzó en 2007, luego OpenCL en 2008, lo que permite utilizar GPU masivas en paralelo en el cálculo general (no gráfico). El modelo se vuelve popular; muchas empresas de alojamiento (por ejemplo, Amazon) ofrecen GPU para tareas informáticas generales.

Go se lanzó en 2009, con hilos preventivos muy baratos ("goroutines") y permite a Exprese eficientemente algoritmos altamente concurrentes.

Akka toolkit se lanza para Java y Scala en 2009, lo que permite la concurrencia basada en actores.

Erlang (un lenguaje altamente concurrente) ve un aumento en el uso.

Concurrencia vs Paralelismo

Tenga en cuenta que para utilizar hardware paralelo, uno no necesita necesariamente el software concurrency , es decir, hacer malabarismos con subprocesos de ejecución dentro de un cálculo. Muchos problemas se resuelven mediante paralelos , procesos que no interactúan, donde cada proceso es un programa secuencial tradicional.

El procesamiento paralelo puede utilizar lenguajes más tradicionales y marcos paralelos, como map-reduce o MPC o OpenMP. Para tales marcos, la presencia de múltiples núcleos en el mismo cristal de CPU no es conceptualmente muy diferente de tener solo más CPU en el clúster; la diferencia es principalmente la velocidad.

No hay almuerzo gratis hasta ahora

Las velocidades de la CPU aún permanecen en torno a 5 GHz en el extremo superior. Con mejores tecnologías a la vista, como los transistores de grafeno, las frecuencias pueden volver a aumentar en el futuro, pero probablemente no muy pronto.

    
respondido por el 9000 30.09.2013 - 14:36

Lea otras preguntas en las etiquetas