¿Cómo programar la asignación de subprocesos en procesadores multinúcleo?

13

Me gustaría experimentar con subprocesos en un procesador de múltiples núcleos, por ejemplo. para crear un programa que utiliza dos subprocesos diferentes que se ejecutan mediante dos núcleos de procesador diferentes.

Sin embargo, no está claro a qué nivel se asignan los subprocesos a los diferentes núcleos. Puedo imaginar los siguientes escenarios (dependiendo del sistema operativo y la implementación del lenguaje de programación):

  1. La asignación de subprocesos es administrada por el sistema operativo. Los subprocesos se crean mediante llamadas al sistema operativo y, si el proceso se ejecuta en un procesador de múltiples núcleos, el sistema operativo automáticamente trata de asignar / programar diferentes subprocesos en diferentes núcleos.
  2. La asignación de subprocesos se gestiona mediante la implementación del lenguaje de programación. La asignación de subprocesos a un núcleo diferente requiere llamadas especiales al sistema, pero las bibliotecas de subprocesos estándar del lenguaje de programación manejan esto automáticamente cuando uso la implementación de subprocesos estándar para ese lenguaje.
  3. La asignación de hilos debe programarse explícitamente. En mi programa, tengo que escribir código explícito para detectar cuántos núcleos están disponibles y para asignar diferentes hilos a diferentes núcleos utilizando, por ejemplo, funciones de biblioteca.

Para que la pregunta sea más específica, imagine que he escrito mi aplicación de subprocesos múltiples en Java o C ++ en Windows o Linux. ¿Mi aplicación verá y utilizará múltiples núcleos de forma mágica cuando se ejecute en un procesador de múltiples núcleos (porque todo está gestionado por el sistema operativo o por la biblioteca de hilos estándar), o tengo que modificar mi código para tener en cuenta los múltiples núcleos? ?

    
pregunta Giorgio 01.01.2013 - 12:37

2 respuestas

11
  

¿Verá y utilizará mágicamente mi aplicación múltiples núcleos cuando se ejecute en un   procesador multi-core (porque todo es manejado ya sea por el   sistema operativo o por la biblioteca de hilos estándar), o tengo que   ¿Modificar mi código para tener en cuenta los múltiples núcleos?

Respuesta simple: Sí, generalmente será administrada por el sistema operativo o la biblioteca de subprocesos.

El subsistema de subprocesos en el sistema operativo asignará subprocesos a los procesadores con prioridad (su opción 1). En otras palabras, cuando un subproceso ha terminado de ejecutarse para su asignación de tiempo o bloques, el programador busca el siguiente subproceso de mayor prioridad y lo asigna a la CPU. Los detalles varían de un sistema operativo a otro.

Dicho esto, las opciones 2 (administradas por lenguaje de programación) y 3 (explícitamente) existen. Por ejemplo, la biblioteca de tareas y async / await en las versiones recientes de .Net le dan al desarrollador una forma mucho más fácil de escribir código paralelizable (es decir, que puede ejecutarse simultáneamente con él mismo). Los lenguajes de programación funcionales son paralelizables de manera innata y algunos tiempos de ejecución ejecutarán diferentes partes del programa en paralelo si es posible.

En cuanto a la opción 3 (explícitamente), Windows le permite establecer la afinidad del hilo (especificando en qué procesadores se puede ejecutar un hilo). Sin embargo, esto suele ser innecesario en todos, excepto en los sistemas críticos de tiempo de respuesta más rápidos. La asignación efectiva de subprocesos al procesador depende en gran medida del hardware y es muy sensible a otras aplicaciones que se ejecutan simultáneamente.

Si desea experimentar, cree una tarea de uso intensivo de CPU de larga ejecución, como generar una lista de números primos o crear un conjunto de Mandelbrot. Ahora cree dos subprocesos en su biblioteca favorita y ejecute ambos subprocesos en una máquina multiprocesador (en otras palabras, casi cualquier cosa lanzada en los últimos años). Ambas tareas deben completarse aproximadamente al mismo tiempo porque se ejecutan en paralelo.

    
respondido por el akton 01.01.2013 - 13:01
-1

Una vez tuve un gran entorno SGI IRIX. Solo por el gusto de escribirlo, escribí un pequeño programa java de múltiples subprocesos (que simplemente no hacía más que consumir ciclos de CPU) y creé 12 subprocesos. El trabajo se extendió a través de 12 CPU en la arquitectura NUMA. Puede ser que busque el programa y lo ejecute en los Dell R910s y compruebe ...

    
respondido por el P. Prabhakar 21.03.2015 - 18:48

Lea otras preguntas en las etiquetas