Pregunta

Al iniciar 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?

¿Fue útil?

Solución

Si utiliza varios subprocesos, el sistema operativo se encargará automáticamente de utilizar varios núcleos.

Otros consejos

¿Hay alguna forma de elegir en qué procesador o núcleo se inicia?

Puede utilizar el administrador de tareas para indicarle a Windows en qué CPU se le debe permitir ejecutar su programa.Normalmente, esto sólo es útil para solucionar problemas de programas heredados que tienen implementaciones rotas de subprocesos múltiples.Para hacer esto,

  • Ejecutar administrador de tareas
  • Encuentra tu proceso en el Processes ventana.
  • Haga clic derecho y elija Set Affinity...
  • Marque las casillas de verificación junto a las CPU en las que desea permitir que se ejecute su aplicación.Entonces, Windows solo programará subprocesos de ese proceso en esas CPU en particular.

Si no recuerdo mal, Windows "recordará" estas configuraciones para las siguientes veces que se ejecute su proceso, pero no me cite al respecto; ejecute algunas pruebas usted mismo :-)

También puede hacer esto mediante programación en .NET después de que su programa se haya iniciado usando el System.Diagnostics.Process.ProcessorAffinity propiedad, pero no creo que "recuerde" la configuración, por lo que siempre habrá un breve período en el que su aplicación se ejecutará en cualquier CPU que Windows considere adecuada.No sé cómo hacer esto en Java, lo siento.

Nota:

Esto se aplica a todo el nivel del proceso.Si configura la afinidad solo para CPU0 y luego inicia 50 subprocesos, los 50 subprocesos se ejecutarán en CPU0, y CPU1, 2, 3, etc. se quedarán sin hacer nada.

Sólo para reiterar el punto, esto es principalmente útil para solucionar problemas de software heredado dañado.Si su software no está dañado, realmente no debería alterar ninguna de estas configuraciones y dejar que Windows decida las mejores CPU para ejecutar su programa, de modo que pueda tener en cuenta el resto del rendimiento del sistema.


En cuanto al modelo de 'memoria compartida', funciona igual, pero hay más cosas que pueden salir sutilmente mal cuando su aplicación se ejecuta en varias CPU en lugar de solo intervalos de tiempo en una sola.

Para ver un ejemplo revelador, lea este ridículo artículo sobre CPU y barreras de memoria.

Está dirigido al desarrollo de OSX en PowerPC, pero es lo suficientemente general como para aplicarse en todas partes.En mi humilde opinión, es uno de los diez mejores artículos que he leído sobre "todos los desarrolladores deberían leer esto".

El sistema operativo se encarga de los subprocesos múltiples cuando la máquina virtual utiliza subprocesos nativos (a diferencia de los subprocesos verdes) y no se pueden especificar detalles de bajo nivel, como elegir un procesador para un determinado subproceso.Es mejor así porque normalmente tienes muchos más subprocesos que procesadores disponibles, por lo que el sistema operativo necesita dividir el tiempo para dar a todos los subprocesos la oportunidad de ejecutarse.

Dicho esto, puede establecer prioridades de subprocesos si tiene una tarea crítica, y una API de subprocesos generalmente brinda esta posibilidad.Vea 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 de arriba como texto sin formato.

Echaría un vistazo a las extensiones paralelas del marco .NET.todavía está en CTP, sin embargo, se supone que debe aprovechar al máximo los procesadores multinúcleo.El lugar más fácil para comenzar con .NET es el blog de equipos paralelos.

En cuanto a Java, no tengo idea.

He usado esto en un par de programas porque mi núcleo 0 estaba un poco estropeado.

// 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 "Process.ProcessorAffinity Propiedad".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top