it-swarm-es.com

¿Cuánto esfuerzo deberíamos pasar a la programación para múltiples núcleos?

Los procesadores están recibiendo más y más núcleos en estos días, lo que me deja preguntándose ...

¿Deberíamos, programadores, adaptarnos a este comportamiento y gastar más esfuerzo en la programación para múltiples núcleos?

¿Hasta qué punto debemos hacer y optimizar esto? ¿Hilo? ¿Afinidad? ¿Optimizaciones de hardware? ¿Algo más?

12
Tamara Wijsman

No importa lo bueno que sea que sea, será poco probable que se incluya un mejor esquema de gestión de hilos, etc. que los equipos desarrollar el idioma y el compilador que está escribiendo su código.

Si necesita que su solicitud sea multi-roscada, cree los hilos que necesita y deje que el compilador y el sistema operativo continúen con sus trabajos.

Debe estar al tanto de cómo se administran esos hilos para que pueda hacer el mejor uso de los recursos. No crear demasiados hilos es una cosa que resuelve a la mente como ejemplo.

También debe ser consciente de lo que está sucediendo (vea el comentario de Lorenzo) para que pueda proporcionar sugerencias a la gestión del hilo (o anularlo en casos especiales), pero hubiera pensado que estos serían pocos y lejanos.

15
ChrisF

En la tierra de Objective-C y Mac OS X y IOS, los marcos (como muchos otros) están escritos para aprovechar estos aumentos en los núcleos de procesadores y presentar al desarrollador con una bonita interfaz para hacer uso de ellos.

Ejemplo en Mac OS X y iOS es Grand Central Dispatch. Hay adiciones a libc (Creo) para facilitar la cola basada en multi-roscado. Luego, los marcos de cacao y base (entre otros) se escriben en la parte superior de la GCD, lo que le da al desarrollador fácil acceso a las colas de envío y el roscado con un código de placa de calderas muy poco.

Muchos idiomas y marcos tienen conceptos similares.

5
Jasarien

La parte difícil está dividiendo su algoritmo intensivo de la CPU a los trozos de ejecución que podrían ser roscados.

Luego, un hilo saltando continuamente de un núcleo a otro tendrá sanciones de rendimiento (debido a una caché de CPU de primer nivel de primer y segundo nivel), especialmente en arquitecturas donde se emplean dos DIOS físicos distintos. En este caso, la afinidad de los hilos es algo bueno.

5
Wizard79

Ahora somos (octubre de 2010) en un momento de inmensa transición.

Hoy pudimos comprar un escritorio de 12 núcleos.
Today podríamos comprar un procesamiento de 448 núcleos tarjeta (búsqueda de NVIDIA TESLA).

Hay límites a la cantidad de desarrolladores que podemos trabajar en la ignorancia de los entornos tremendamente paralelos, nuestros programas trabajarán en un futuro próximo.

Los sistemas operativos, los entornos de tiempo de ejecución y las bibliotecas de programación solo pueden hacer mucho.

En el futuro, deberemos estar dividiendo nuestro procesamiento en trozos discretos para su procesamiento independiente, utilizando abstracciones como el nuevo .Net "Marco de tareas".

Detalles como la administración de caché y la afinidad aún estarán presentes, pero solo serán la Provenza de la aplicación ultrafistente solamente. Ningún desarrollador querrá administrar estos detalles manualmente a través de una máquina de 10K Core.

3
Bevan

bueno, realmente depende de lo que estés en desarrollo. La respuesta, dependiendo de lo que está desarrollando, puede ir desde "es insignificante" a "es absolutamente crítico, y esperamos que todos en el equipo tengan una buena comprensión y uso de implementaciones paralelas".

para la mayoría de los casos, una comprensión y uso sólida de cerraduras, hilos y tareas y grupos de tareas serán un buen comienzo cuando se requiera la necesidad de paralelismo. (varía por lang/lib)

agregue a que las diferencias en los diseños que debe hacer, para el multiprocesamiento no trivial, uno a menudo debe aprender varios modelos de programación nuevos o estrategias de paralelización. En ese caso, el tiempo para aprender, fallar los tiempos suficientes para tener una comprensión sólida, y actualizar los programas existentes pueden llevar un equipo al año (o más). Una vez que haya alcanzado ese punto, (¡con suerte!) No percinque ni aborde los problemas/implementaciones como lo hace hoy (siempre que aún no haya hecho esa transición).

otro obstáculo es que estás optimizando efectivamente un programa para una cierta ejecución. Si no se le da mucho tiempo para optimizar los programas, entonces realmente no se beneficiará de él tanto como deberías. La paralelización de alto nivel (o obvio) puede mejorar la velocidad percinada de su programa con bastante poco esfuerzo, y eso es hasta donde muchos equipos irán hoy: "Hemos paralelizado las partes realmente obvias de la aplicación", que está bien en algunos casos. ¿Será proporcional el beneficio de tomar las frutas bajas a colgar y usar la paralización simple a la cantidad de núcleos? A menudo, cuando hay dos a cuatro núcleos lógicos, pero no tan a menudo más allá de eso. En muchos casos, eso es un retorno aceptable, dado la inversión de tiempo. Este modelo paralelo es la introducción de muchas personas a la implementación de buenos usos del paralelismo. Se implementa comúnmente utilizando la iteración paralelizada, tareas explícitas, hilos simples o multitarea.

lo que aprendes usando estos modelos paralelos triviales no será ideal en todos los escenarios paralelos complejos; Aplicar efectivamente los diseños paralelos complejos requiere una comprensión y enfoque muy diferente. Estos modelos simples a menudo se separan o tienen una interacción trivial con otros componentes del sistema. Además, muchas implementaciones de estos modelos triviales no se escalan bien a los sistemas paralelos complejos de manera efectiva, un diseño paralelo complejo de mal tiempo puede tardar el tiempo que se ejecuta como el modelo simple. Ill: se ejecuta dos veces más rápido que el modelo único roscado, mientras que utiliza 8 núcleos lógicos durante la ejecución. Los ejemplos más comunes están utilizando/creando demasiados hilos y altos niveles de interferencia de sincronización. En general, esto se denomina desaceleración paralela. Es bastante fácil encontrar si se acerca a todos los problemas paralelos como problemas simples.

por lo tanto, digamos que usted realmente debe utilizar un multiprolaje eficiente en sus programas (la minoría, en el clima de hoy): deberá emplear el modelo simple de manera efectiva para aprender el modelo complejo y luego relatar cómo se acerca Flujo y interacción del programa. El modelo complejo es donde finalmente debe ser su programa, ya que es donde se encuentra el hardware hoy, y donde se realizarán las mejoras más dominantes.

la ejecución de modelos simples se puede imaginar como un tenedor, y los modelos complejos operan como un complejo, uh, ecosistema. Creo que la comprensión de los modelos simples, incluido el bloqueo general y el roscado, debe ser o pronto se esperarán de los desarrolladores intermedios cuando el dominio (en el que se desarrolle) lo usa. Entender los modelos complejos sigue siendo un poco inusual hoy (en la mayoría de los dominios), pero creo que la demanda aumentará bastante rápidamente. Como desarrolladores, muchos más de nuestros programas deben apoyar estos modelos, y la mayoría de los usos están muy lejos en la comprensión y la implementación de estos conceptos. Dado que los conteos de procesador lógicos son una de las áreas más importantes de mejora de hardware, la demanda de personas que entiende y puede implementar sistemas complejos seguramente aumentarán.

finalmente, hay muchas personas que piensan que la solución es simplemente "agregar la paralelización". A menudo, es mejor hacer que la implementación existente sea más rápida. Es mucho más fácil y mucho más sencillo en muchos casos. Muchos programas en la naturaleza nunca han sido optimizados; Algunas personas solo tuvieron la impresión de que la versión sin optimizaría sería eclipsada por Hardware algún día pronto. La mejora del diseño o los algos de los programas existentes también es una habilidad importante si el rendimiento es importante, la lanzar más núcleos en los problemas no es necesariamente la solución mejor o más simple.

cuando se dirige a PC Modernas, la mayoría de nosotros que necesitamos implementar buenos sistemas paralelos no tendrá que ir más allá de las bibliotecas de lectura, bloqueo, paralelo de un libro, y muchas experiencias de escritura y programas de prueba (básicamente, reestructurar significativamente cómo usted Enfoque de programas de escritura).

3
justin

Hacemos, pero escribimos el software pesado de cálculo, por lo que nos beneficiamos directamente de múltiples núcleos.

A veces, el programador mueve hilos entre núcleos mucho. Si eso no es aceptable, puedes jugar con la afinidad central.

2
Toon Krijthe