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?
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?
Respuestas:
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.
¿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".
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.
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.