¿Múltiples subprocesos utilizan múltiples núcleos?

¿Múltiples subprocesos utilizan múltiples núcleos?

Tengo una pregunta y básicamente se trata de explorar algunas formas lentas de utilizar todos los núcleos de una máquina.

Digamos que tengo el programa "./theprogram" que actúa sobre un conjunto de datos D, es "vergonzosamente paralelo" y toma un argumento de línea de comando j que ejecuta el programa en un subconjunto de su conjunto de datos determinado por j.

Entonces supongamos que en mi terminal ejecuto los comandos

./theprogram j1 &
./theprogram j2 &
./theprogram j3 &
. etc
. etc
. etc
./theprgoram jfinal &

Ahora he generado subprocesos para j1, j2, ... jfinal

Mi pregunta: suponiendo que tenga un sistema Unix moderno (por ejemplo, el Mac Os X más reciente ejecutándose en un chip multinúcleo)

Entonces, ¿los procesos se distribuirán en todos los núcleos por separado? Es decir, ¿estoy aprovechando TODOS mis núcleos?

Respuesta1

En teoría, sí.

El sistema operativo programa tareas en núcleos de CPU no utilizados. Sabe cuándo un núcleo no se utiliza porque acaba de desprogramar una tarea del mismo.

Sus procesos tendrán una bandera en sus estructuras que indica si está esperando una entrada (disco, teclado, mouse, etc.) y, por lo tanto, si no está esperando ninguna de esas cosas, entonces es programable.

Para cada núcleo, el sistema operativo esencialmente ejecutará su lista de tareas programables y las programará. A las tareas se les dará un período de tiempo en el núcleo y luego se suspenderán nuevamente para que el sistema operativo pueda ver siotrolos procesos deben ejecutarse.

Si no es necesario ejecutar ningún otro proceso, el suyo seguirá estando en la parte superior de la lista y tendrá otra oportunidad.

El efecto natural es que, con una pequeña sobrecarga de administración, su CPU se utilizará por completo, suponiendo que ninguno de sus procesos se bloquee entre sí ni pase una cantidad vergonzosa de tiempo esperando accesos al disco.

Puede probar esto con cualquier aplicación multiproceso con datos paraleizables. La codificación de vídeo y la compresión de datos son dos situaciones en las que este tipo de paralelismo vale la pena.

Handbrake es un codificador de video basado en CPU (recientemente también con soporte para GPU) que podría usar tantos núcleos de CPU como quisiera y lograría un alto nivel de aumento de velocidad al hacerlo. Muchos codificadores de vídeo pueden hacer un buen uso de varios núcleos. x.264 y otros codificadores también admiten múltiples subprocesos.

7-Zip es un programa de compresión que también puede utilizar múltiples subprocesos en su algoritmo LZMA2 para acelerar la compresión. La creación de un diccionario de compresión es un proceso compartido razonable y una vez que se tiene un diccionario, la compresión real es "trivialmente" comparable.

Respuesta2

Para realizar multiprocesamiento debes elegir la sección de código que se adhiera a:

  1. No se puede depender de resultados anteriores
  2. No requiere ser ejecutado en un orden particular.
  3. No devolverá nada a lo que sea necesario acceder más adelante en el código.

Entonces, por lo que escuché, se deduce que deberías poder usar tus múltiples núcleos.

información relacionada