¿Se puede hacer que un programa de subproceso único use múltiples núcleos?

12

El título lo dice todo: ¿hay alguna manera de obtener un programa anterior diseñado para usar un solo núcleo de CPU para usar múltiples núcleos de CPU?

Chris
fuente
13
No, no es posible
Moab
55
Ojalá fuera así de fácil ...
Brendan Long
1
¿Qué pasaría si hubiera un programa que 'emulara' un procesador (como quizás un vm?) Pero tomara su CPU de múltiples núcleos y emulara una CPU de un solo núcleo con mucha más potencia de procesamiento por hilo? ¿Es eso posible?
schizoid04
¿Quién administrará la sincronización entre múltiples hilos entonces, porque el orden importa?
user36582

Respuestas:

16

Desafortunadamente, un programa heredado escrito para una sola CPU no puede ser forzado a usar múltiples núcleos de CPU. El uso de múltiples núcleos de CPU requiere múltiples subprocesos, que deben comunicarse entre sí al tiempo que garantizan que no se produzcan condiciones de carrera y otros problemas. No se puede hacer que una aplicación anterior use más que el núcleo de la CPU a menos que se reescriba para hacerlo, y solo si la naturaleza de la aplicación permite que se paralelice.

bwDraco
fuente
19
También vale la pena señalar que algunas aplicaciones simplemente no pueden reescribirse para tener en cuenta múltiples núcleos. Depende principalmente de cuán paralelizable sea el proceso. Un ejemplo simple de proceso no paralelizable sería la reproducción humana: una mujer puede tener un hijo en 9 meses. Nueve mujeres pueden tener 9 hijos en 9 meses, pero no puedes usar 9 mujeres para fabricar un solo hijo en un mes.
AndrejaKo
1
En principio, se podría escribir un programa para analizar otro programa e intentar paralelizarlo. Dicho esto, incluso las versiones "fáciles" muy limitadas de este problema han generado Ph.D. disertaciones para las últimas dos generaciones y el progreso ha sido lento. El problema completo puede muy bien ser AI completo.
dmckee --- ex-gatito moderador
Genial, gracias a todos, me hicieron llorar con su ejemplo de Mujeres y nacimiento, especialmente cuando hablamos de fabricación: D
Chris
¿Qué pasa si un programa tiene un montón de operaciones matemáticas independientes que luego se utilizan entre sí? tal vez un segundo hilo pueda analizar el programa, hmm, no sé lo que estoy diciendo. Si un hilo pudiera analizar el ensamblaje ... "haga una operación costosa aquí, luego realice una segunda operación costosa en esto que la primera operación costosa no toca" está bien, pondré una operación costosa en un hilo, una en la otra, luego sincronícelos. de vuelta en el hilo principal. Supongo que un programa completo tendría que ser analizado previamente para identificar operaciones costosas independientes.
CausingUnderflowsEverywhere
13

¿Cuál es tu objetivo con eso? ¿Mayor rendimiento? Lamentablemente, las aplicaciones que están diseñadas para utilizar solo 1 núcleo no utilizarán más. De eso se trata esta charla de aplicaciones "multihilo".


fuente
2

Existen al menos tres técnicas para explotar múltiples procesadores en un programa diseñado para usar un solo núcleo. La más sencilla de estas técnicas es usar bibliotecas y código de sistema que usa múltiples núcleos o puede ejecutarse al menos parcialmente en paralelo con el código de la aplicación. La recolección de basura es un ejemplo de funcionalidad que se puede paralelizar y que se puede hacer en paralelo con la ejecución de la aplicación. Incluso sin la administración automática de la memoria, existe cierto potencial de paralelismo en las funciones de desasignación de memoria porque el asignador de memoria puede tener que hacer algo más que simplemente marcar la sección de memoria como disponible.

Una segunda técnica es la traducción binaria. Si bien esto podría considerarse "reescribir la aplicación", se realiza mediante software y sin acceso al código fuente. La producción de paralelismo a nivel de hilo no parece haber sido el objetivo principal de la mayoría de la investigación y el desarrollo utilizando la traducción binaria (que a menudo se refiere a ejecutar código heredado en un ISA diferente, explotar extensiones ISA u optimizar para una microarquitectura particular, y usar información dinámica para proporcionar mayor optimización de perfil de calidad), pero el potencial es obvio.

Una tercera técnica es el multihilo especulativo. Actualmente, ningún procesador (que yo sepa) admite subprocesos múltiples especulativos administrados por hardware. Sin embargo, con la introducción de la memoria transaccional de hardware, tener un sistema de tiempo de ejecución implementado se vuelve algo más práctico porque el HTM se puede usar para detectar conflictos en el uso de la memoria. El subprocesamiento múltiple especulativo administrado por software generalmente implicaría alguna traducción binaria, pero su naturaleza especulativa justifica considerar una técnica separada.

La practicidad de estas técnicas está limitada por los costos asociados con los sistemas existentes (incluido el costo de la comunicación entre subprocesos y los subprocesos de desove), por el paralelismo limitado que pueden explotar y por el limitado retorno de la inversión (aplicaciones importantes que pueden ser beneficiosas es probable que se reescriban en paralelo, muchas aplicaciones se beneficiarían relativamente poco de tales técnicas (especialmente con límites de potencia / térmicos que permiten que un solo núcleo funcione a una frecuencia más alta que múltiples núcleos), y los costos de desarrollo son significativos). Sin embargo, estas técnicas hacen existir y es teóricamente posible usar múltiples núcleos con una aplicación diseñada para utilizar un solo núcleo.

Paul A. Clayton
fuente
0

No, no puede ser. Un programa está escrito explícitamente para usar múltiples núcleos. No es trivial hacer el trabajo en múltiples núcleos. Requiere sincronizaciones de todos los hilos. Como uno lanza la pelota, el otro atrapa, uno pule la pelota, uno limpia, uno verifica si la pelota tiene buena cantidad de aire. Ahora imagine que cada personaje se ejecuta en un hilo independientemente uno del otro. Alguien intenta atrapar la pelota cuando no se la arroja. O alguien trata de pulir la pelota cuando se está jugando. O dos personajes que intentan atrapar y lanzar la pelota simultáneamente. Hay tantas formas de estrellarse. Por lo tanto, los programadores deben rediseñar cuidadosamente una aplicación de núcleo único para que pueda aprovechar múltiples núcleos.

usuario36582
fuente