c# - with - ¿Cómo puede una aplicación usar múltiples núcleos o CPU en.NET o Java?
system threading thread c# (5)
Cuando se lanza un hilo o un proceso en .NET o Java, ¿hay alguna manera de elegir en qué procesador o núcleo se inicia? ¿Cómo funciona el modelo de memoria compartida en tales casos?
¿Hay alguna manera de elegir en qué procesador o núcleo se lanzó?
Puede usar el administrador de tareas para indicarle a Windows en qué CPU (s) se debe permitir ejecutar su programa. Normalmente esto solo es útil para solucionar problemas de programas antiguos que tienen implementaciones rotas de multi-threading. Para hacer esto,
- Ejecutar administrador de tareas
- Encuentra tu proceso en la ventana de
Processes
. - Haga clic derecho y elija
Set Affinity...
- Marque las casillas de verificación junto a la CPU en la que desea permitir que se ejecute su aplicación. Windows entonces solo programará subprocesos de ese proceso en esos CPU particulares
Si recuerdo correctamente, Windows ''recordará'' estas configuraciones para las próximas veces que se ejecute su proceso, pero por favor no me cite sobre eso - ejecute algunas pruebas usted mismo :-)
También puede hacer esto programáticamente en .NET después de que su programa se haya iniciado utilizando la propiedad System.Diagnostics.Process.ProcessorAffinity , pero no creo que "recuerde" la configuración, por lo que siempre habrá un breve período en el que su aplicación se ejecuta en las ventanas de la CPU que considere adecuadas. No sé cómo hacer esto en java, lo siento.
Nota:
Esto aplica en todo el nivel del proceso. Si configura afinidad solo para CPU0 y luego inicia 50 hilos, los 50 de esos hilos se ejecutarán en CPU0, y CPU1, 2, 3, etc. se quedarán sin hacer nada.
Solo para reiterar este punto, esto es principalmente útil para solucionar problemas de software heredado roto. Si su software no está roto, no debería interferir con ninguna de estas configuraciones, y deje que Windows decida la mejor CPU (s) para ejecutar su programa, para que pueda tener en cuenta el resto del rendimiento del sistema.
En cuanto al modelo de "memoria compartida", funciona de la misma manera, pero hay más cosas que pueden ir mal sutilmente cuando tu aplicación se ejecuta en múltiples CPU en lugar de solo partes de tiempo en una sola.
Para un ejemplo revelador, lee este ridículo artículo sobre CPU y barreras de memoria .
Está dirigido al desarrollo de OSX en PowerPC, pero lo suficientemente general como para que se aplique en todas partes. En mi humilde opinión, es uno de los diez mejores "todos los desarrolladores deben leer estos" artículos que he leído.
El sistema operativo se encarga de los subprocesos múltiples cuando la máquina virtual usa subprocesos nativos (a diferencia de los subprocesos verdes), y no puede especificar detalles de bajo nivel, como elegir un procesador para un determinado subproceso. Es mejor así porque normalmente tiene muchos más hilos de los que tiene procesadores disponibles, por lo que el sistema operativo necesita hacer un corte de tiempo para que todos los subprocesos tengan la oportunidad de ejecutarse.
Dicho esto, puede establecer prioridades de subprocesos si tiene una tarea crítica, y una API de subprocesos generalmente ofrece esta posibilidad. Consulte la API de Java, por ejemplo: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)
PD: hay algo roto en el motor de análisis ... Tuve que agregar el enlace anterior como texto sin formato
Si está utilizando múltiples hilos, el sistema operativo se encargará automáticamente de utilizar múltiples núcleos.
Lo he usado en un par de programas porque mi núcleo 0 estaba algo desordenado.
// Programmatically set process affinity
var process = System.Diagnostics.Process.GetCurrentProcess();
// Set Core 0
process.ProcessorAffinity = new IntPtr(0x0001);
o
// Set Core 1
process.ProcessorAffinity = new IntPtr(0x0002);
Más sobre esto en " Propiedad Process.ProcessorAffinity ".
Me gustaría echar un vistazo a las extensiones paralelas al .NET framework. Todavía está en CTP , sin embargo, se supone que debe hacer el mejor uso de procesadores multi-core. El lugar más fácil para comenzar a usar .NET está en el blog de equipos paralelos .
En cuanto a Java, no tengo idea.