12

Por lo que yo sé, la arquitectura de múltiples núcleos en un procesador de no efectuar el programa. La ejecución de la instrucción real se maneja en una capa inferior.programación para procesadores de núcleo múltiple

mi pregunta es,

Teniendo en cuenta que tiene un entorno de múltiples núcleos, ¿Puedo utilizar cualquier práctica de programación para utilizar los recursos disponibles de manera más efectiva? ¿Cómo debería cambiar mi código para obtener más rendimiento en entornos multinúcleo?

+1

Una CPU multinúcleo se parece a varias CPU de un programa, por lo que siempre que utilice los hilos al máximo, no hay nada más que hacer. ¿A menos que esté buscando consejos sobre cómo mejorar su código de subprocesos múltiples? –

+1

¿Significa que el uso de una mayor cantidad de subprocesos puede mejorar el rendimiento en arquitecturas multinúcleo? –

+0

significa que una arquitectura multinúcleo puede ejecutar la misma cantidad de subprocesos que sus núcleos (el hyper-threading se parece a dos núcleos cada uno) al mismo tiempo. Por lo tanto, teniendo una cantidad de hilos> 1 es aconsejable usar los núcleos. – TomTom

Respuesta

13

Eso es correcto. Su programa no se ejecutará más rápido (excepto por el hecho de que el núcleo está manejando menos otros procesos, porque algunos de los procesos se están ejecutando en el otro núcleo) a menos que emplee concurrencia. Sin embargo, si usa concurrencia, más núcleos mejoran el paralelismo real (con menos núcleos, la concurrencia se intercala, mientras que con más núcleos, puede obtener un verdadero paralelismo entre los hilos).

Hacer programas concurrentes de manera eficiente no es una tarea sencilla. Si se hace mal, hacer que su programa sea simultáneo puede hacerlo más lento. Por ejemplo, si pasa mucho tiempo generando hilos (la construcción de la secuencia es muy lenta), y trabaja en un tamaño de fragmento muy pequeño (para que la sobrecarga de la construcción de la secuencia domine el trabajo real), o si sincroniza frecuentemente sus datos (que no solo obliga a las operaciones a ejecutarse en serie, sino que también tiene una sobrecarga muy alta) o si escribe frecuentemente en datos en la misma línea de caché entre varios hilos (lo que puede hacer que toda la línea de caché se invalide en uno) de los núcleos), entonces puede dañar seriamente el rendimiento con la programación simultánea.

También es importante tener en cuenta que si usted tiene N núcleos, que no significa que obtendrá un aumento de velocidad de N. Ese es el límite teórico para la aceleración. De hecho, tal vez con dos núcleos es dos veces más rápido, pero con cuatro núcleos puede ser aproximadamente tres veces más rápido, y luego con ocho núcleos es aproximadamente tres veces y media más rápido, etc. Qué tan bien es su programa en realidad capaz de aprovechar estos núcleos se llama escalabilidad paralela.A menudo, la sobrecarga de comunicación y sincronización previene una aceleración lineal, aunque, en el mejor de los casos, si puede evitar la comunicación y la sincronización tanto como sea posible, con suerte puede acercarse a la lineal.

No sería posible dar una respuesta completa sobre cómo escribir programas paralelos eficientes en StackOverflow. Este es realmente el tema de al menos uno (probablemente varios) cursos de informática. Le sugiero que se inscriba en un curso o compre un libro. Te recomendaría un libro si conociera uno bueno, pero el curso de algoritmos paralelos que tomé no tenía un libro de texto para el curso. También podría estar interesado en escribir un puñado de programas utilizando una implementación en serie, una implementación paralela con subprocesamiento múltiple (subprocesos regulares, grupos de subprocesos, etc.) y una implementación paralela con transmisión de mensajes (como Hadoop, Apache Spark, Cloud Dataflows , RPC asíncronas, etc.), y luego midiendo su rendimiento, variando el número de núcleos en el caso de las implementaciones paralelas. Esta fue la mayor parte del trabajo del curso para mi curso de algoritmos paralelos y puede ser bastante perspicaz. Algunos cálculos que puede intentar paralelizar incluyen calcular Pi utilizando el método de Monte Carlo (esto es trivialmente paralelizable, suponiendo que puede crear un generador de números aleatorios donde los números aleatorios generados en diferentes hilos son independientes), realizar la multiplicación de la matriz, calcular la forma escalonada escalonada de una matriz, sumando el cuadrado del número 1 ... N para un número muy grande de N, y estoy seguro de que puedes pensar en otros.

+0

En realidad, la ley de Ahmdal muestra que no obtendrá una aceleración de N para N procesadores a menos que el código sea 100% embarazosamente paralelo. Este es el límite teórico. –

+0

@San Jacinto, ¿cómo es eso diferente de lo que dije? –

+0

solo un nitpick, es todo :). Dijiste que N es el límite teórico, pero hay un poco más de la historia. Usted respondió bien, yoo. –

3

Sí, simplemente agregar más núcleos a un sistema sin alterar el software no arrojaría ningún resultado (con la excepción del sistema operativo sería capaz de programar múltiples procesos concurrentes en núcleos separados).

Para que su sistema operativo utilice sus múltiples núcleos, debe hacer una de estas dos cosas: aumentar el número de subprocesos por proceso o aumentar el número de procesos al mismo tiempo (¡o ambos!).

Utilizando los núcleos con eficacia, sin embargo, es una bestia de un color diferente. Si pasa demasiado tiempo sincronizando el acceso a datos compartidos entre hilos/procesos, su nivel de concurrencia se verá afectado a medida que los hilos esperen entre sí. Esto también supone que tiene un problema/cálculo que puede ser paralelizado con relativa facilidad, ya que la versión paralela de un algoritmo es a menudo mucho más compleja que la versión secuencial de la misma.

Dicho esto, especialmente para los cálculos vinculados a la CPU con las unidades de trabajo que son independientes entre sí, es muy probable que veremos una aceleración lineal de lo que se tira más hilos en el problema. A medida que agrega segmentos de serie y bloques de sincronización, esta aceleración tenderá a disminuir.

I/O cálculos pesados ​​típicamente irá el peor en un entorno multi-hilo, ya que el acceso al almacenamiento físico (especialmente si es en el mismo controlador, o los mismos medios) es también de serie, en cuyo caso el roscado se convierte más útil en el sentido de que libera sus otros hilos para continuar con la interacción del usuario o las operaciones basadas en CPU.

2

No sé si es el mejor lugar para comenzar, pero me suscribí al artículo de Intel Software Network hace un tiempo y encontré muchas cosas interesantes, presentadas de una manera bastante simple. Puede encontrar algunos artículos muy básicos sobre conceptos fundamentales de informática paralela, como this. Here tiene una inmersión rápida en openMP que es un enfoque posible para comenzar a paralelizar las partes más lentas de su aplicación, sin cambiar el resto. (Si esas partes presentan paralelismo, por supuesto). También marque Intel Guide for Developing Multithreaded Applications. O simplemente vaya y busque the article section, los artículos no son demasiado muchos, para que pueda averiguar rápidamente qué es lo que más le conviene. También tienen un foro y una llamada semanal webcast llamada Parallel Programming Talk.

0

Puede considerar el uso de lenguajes de programación diseñados para la programación concurrente. Erlang y Go vienen a la mente.

Cuestiones relacionadas