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?¿Cómo puede una aplicación usar múltiples núcleos o CPU en .NET o Java?
Respuesta
Si usa varios subprocesos, el sistema operativo se encargará automáticamente de utilizar varios núcleos.
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 subprocesos que 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 las prioridades de subprocesos si tiene una tarea crítica, y una API de subprocesos generalmente ofrece esta posibilidad. Ver 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 ... he tenido que añadir el enlace anterior como texto sin formato
hay una manera de elegir qué procesador o núcleo se lanza en?
Usted puede utilizar el administrador de tareas de Windows para contar lo que la CPU (s) de su programa se debe permitir que se ejecuta. Normalmente esto solo es útil para solucionar problemas de programas antiguos que tienen implementaciones rotas de multi-threading. Para ello,
- administrador de tareas Ejecutar
- Encuentre su proceso en la ventana
Processes
. - Haga clic derecho y seleccione
Set Affinity...
- Marque las casillas de verificación junto a la CPU que desea permitir que se ejecute su aplicación. Windows entonces solo programará los hilos de ese proceso en esas CPUs particulares
Si recuerdo correctamente, Windows 'recordará' estas configuraciones para las siguientes veces que se ejecute su proceso, pero por favor no me cite en eso - ejecutar 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á una período corto en el que se ejecuta su aplicación en las ventanas de la CPU que considere adecuadas. No sé cómo hacer esto en java, lo siento.
Nota:
Esto se aplica a todo el nivel de 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 la solución de problemas de software heredado. 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', que funciona de la misma, pero hay más cosas que pueden salir sutilmente mal cuando su aplicación se ejecuta en varios de CPU en lugar de sólo fracciones de tiempo en una sola.
Para un ejemplo ojo-apertura, lee this ridiculousfish article about CPU's and Memory Barriers.
Está dirigido a desarrollo OSX en PowerPC, pero lo suficientemente general que debería aplicarse 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.
he utilizado esto en un par de programas porque mi núcleo 0 era una especie de mal estado.
// 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 Property".
me gustaría tener un vistazo a las extensiones en paralelo a la plataforma .NET. 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 es el parallel teams blog.
para Java que no tienen ni idea.
- 1. ¿Puede gcc usar múltiples núcleos al vincular?
- 2. JVM en múltiples núcleos
- 3. Ejecución de una aplicación Hadoop independiente en múltiples núcleos de CPU
- 4. Escribir múltiples núcleos o un kernel único
- 5. ¿Qué es más eficiente? Más núcleos o más CPU
- 6. ¿Puede MS Visual Studio compilar proyectos utilizando 2 o 4 núcleos en la CPU?
- 7. MPI: ¿núcleos o procesadores?
- 8. ¿Es posible forzar a una aplicación Java existente a usar no más de x núcleos?
- 9. ¿Cómo usar DMA o RDMA en Java?
- 10. CPU TSC operación de recuperación, especialmente en el entorno de múltiples núcleos de procesadores múltiples
- 11. ¿Cómo genero hilos en diferentes núcleos de CPU?
- 12. ¿Qué puedo hacer para que mi aplicación C# aproveche múltiples núcleos de procesador?
- 13. Configuración de java para usar una CPU
- 14. ¿Cómo encontrar una clase intensiva de CPU en Java?
- 15. ¿Cómo usar todos los núcleos en Windows 7?
- 16. ¿Cómo usar archivos EPS en una aplicación WPF o Silverlight?
- 17. Java: ¿Cómo escalar hilos de acuerdo con los núcleos de la CPU?
- 18. Uso de múltiples núcleos/procesadores al compilar Java
- 19. ¿Cómo usar Nutch Solrindex para indexar múltiples núcleos?
- 20. ¿Cómo hacer que los sitios web de Ruby o Python usen múltiples núcleos?
- 21. ¿Cuántos núcleos de CPU puede utilizar un solo proceso de Java?
- 22. ¿Es mejor usar múltiples SpanObjects o múltiples TextViews en Android?
- 23. aplicación Windows o Aplicación
- 24. GPU lee desde CPU o CPU escribe en la GPU?
- 25. ¿Cómo puede una clase anónima usar "extender" o "implementar"?
- 26. ¿Cómo forzar a una aplicación a usar .NET 3.5 o superior?
- 27. Cómo compilar en múltiples núcleos usando mingw dentro de QTCreator
- 28. ¿Cómo hacer los mismos cálculos más rápido en la CPU de 4 núcleos: 4 hilos o 50 hilos?
- 29. ¿Puede una aplicación Heroku usar puertos diferentes/múltiples?
- 30. ¿Uno o múltiples servlets por aplicación web?
¿Puede citar esto? ¿Dónde encontraste esta información? –
@Josh Brown, esto parece conocimiento común. Como referencia, cualquier libro sobre Win32 API que trate con hilos le dirá esto. –