Pregunta

Hasta donde yo sé, la arquitectura multinúcleo de un procesador no afecta el programa.La ejecución real de la instrucción se maneja en una capa inferior.

mi pregunta es,

Dado que tiene un entorno multinúcleo, ¿puedo utilizar alguna práctica de programación para utilizar los recursos disponibles de manera más efectiva?¿Cómo debo cambiar mi código para obtener más rendimiento en entornos multinúcleo?

¿Fue útil?

Solución

Eso es correcto. Su programa no se ejecutará más rápido (excepto por el hecho de que el núcleo está manejando un menor número de otros procesos, ya que algunos de los procesos están en ejecución en el otro núcleo) a menos que usted emplea concurrencia. Si usted hace uso de la concurrencia, sin embargo, más núcleos mejora el paralelismo real (con un menor número de núcleos, la concurrencia se entrelazan, mientras que con más núcleos, se puede obtener cierto paralelismo entre los hilos).

Realización de programas concurrentes de manera eficiente no es una tarea sencilla. Si se hace mal, haciendo que su concurrente programa realmente puede hacer que sea más lento! Por ejemplo, si vas a gastar un montón de hilos de tiempo de desove (construcción hilo es muy lento), y trabajas en un tamaño muy pequeño trozo (de modo que los gastos indirectos de la construcción hilo domina el trabajo real), o si con frecuencia se sincronicen los datos ( que no sólo las fuerzas de operaciones a ejecutar en serie, sino que también tiene un muy alto por encima en la parte superior de la misma), o si escribe con frecuencia a los datos en la misma línea de caché entre varios subprocesos (que puede conducir a toda la línea de caché de ser invalidada por una de los núcleos), entonces se puede dañar seriamente el rendimiento con la programación concurrente.

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 que podría ser alrededor de tres veces más rápido, y luego con ocho núcleos es alrededor de tres veces y media más rápido, etc. ¿Qué tan bien su programa es en realidad capaz de tomar ventaja de estos núcleos se llama la escalabilidad paralelo. A menudo, la comunicación y la sincronización prevenir sobrecarga de una aceleración lineal, aunque, en el ideal, si se puede evitar la comunicación y sincronización tanto como sea posible, con suerte se puede conseguir casi lineal.

No sería posible dar una respuesta completa sobre cómo escribir programas paralelos eficientes en StackOverflow. Este es realmente el objeto de al menos un cursos de ciencias (probablemente varios) de ordenador. Sugiero que usted se inscribe en un curso de tales o comprar un libro. Te recomiendo un libro para que si sabía de una buena, pero el curso algoritmos Paralelo de Tomé no tenía un libro de texto para el curso. Usted también puede estar interesado en escribir un puñado de programas utilizando una aplicación en serie, una aplicación paralela con múltiples hilos (hilos regulares, grupos de subprocesos, etc.), y una implementación paralela con el paso de mensajes (por ejemplo, con Hadoop de Apache, Spark, Nube flujos de datos , RPCs asíncronos, etc.), y después medir su rendimiento, variando el número de núcleos en el caso de las implementaciones paralelas. Esta fue la mayor parte del curso funciona para mi curso de algoritmos paralelos y puede ser muy perspicaz. Algunos cálculos que podría intentar paralelización incluir Pi computación usando el método de Monte Carlo (esto es trivialmente paralelizable, suponiendo que se puede crear un generador de números aleatorios, donde los números aleatorios generados en diferentes hilos son independientes), la realización de la multiplicación de matrices, el cálculo de la forma escalonada de una matriz, sumando el cuadrado del número 1 ... N por algún número muy grande de N, y estoy seguro de que usted puede pensar en los demás.

Otros consejos

No sé si es el mejor lugar posible para empezar, pero me he suscrito al artículo de alimentación de Intel Software Network hace algún tiempo y han encontrado una gran cantidad de cosas interesantes allí, se presenta en forma bastante simple. Se pueden encontrar algunos artículos muy básicos sobre los conceptos fundamentales de la computación paralela, como esta . Aquí usted tiene una inmersión rápida en OpenMP que es un enfoque posible para iniciar la paralelización de las partes más lentas de su aplicación, sin cambiar el resto. (Si las partes presente paralelismo, por supuesto.) También comprobar Guía Intel para desarrollar aplicaciones multiproceso . O simplemente ir y navegar la sección de artículos , los artículos no son también muchos, por lo que puede averiguar rápidamente lo que más le convenga. También tienen un foro y un de transmisión en paralelo llamado programación de debate.

Sí, simplemente agregar más núcleos a un sistema sin alterar el software no produciría resultados (con la excepción de que el sistema operativo podría programar múltiples procesos simultáneos en núcleos separados).

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

Sin embargo, utilizar los núcleos de manera efectiva es una bestia de otro color.Si dedica demasiado tiempo a sincronizar el acceso a datos compartidos entre subprocesos/procesos, su nivel de concurrencia se verá afectado a medida que los subprocesos se esperan entre sí.Esto también supone que tiene un problema/cálculo que puede paralelizarse con relativa facilidad, ya que la versión paralela de un algoritmo suele ser mucho más compleja que la versión secuencial del mismo.

Dicho esto, especialmente para los cálculos vinculados a la CPU con unidades de trabajo independientes entre sí, lo más probable es que veas una aceleración lineal a medida que lanzas más subprocesos al problema.A medida que agregue segmentos seriales y bloques de sincronización, esta aceleración tenderá a disminuir.

Los cálculos pesados ​​de E/S normalmente serían los peores en un entorno de subprocesos múltiples, ya que el acceso al almacenamiento físico (especialmente si está en el mismo controlador o en el mismo medio) también es en serie, en cuyo caso el subprocesamiento se vuelve más útil en el sentido que libera sus otros subprocesos para continuar con la interacción del usuario o las operaciones basadas en la CPU.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top