2011-02-07 11 views
6

System.Environment.ProcessorCount me muestra N procesadores (N en mi caso = 8), que quiero utilizar. Ahora el problema es que el gestor de recursos de Windows dice, que 4 de mis CPU están "estacionadas", y que las 8 cadenas comienzan a separarse hasta las 4 CPU desbloqueadas.C# Threading CPU estacionadas?

Ahora, ¿hay alguna manera de utilizar las CPU estacionadas también?

Respuesta

3

Por lo general, usted debería ser capaz de hacerlo de esta manera:

Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)0x00FF; 

ver documentación aquí:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.processoraffinity.aspx

pero también dice que, por defecto el proceso se asigna a todos núcleos.

Por otro lado, puede probar ProcessThread.ProcessorAffinity e intentar configurarlo manualmente (si desea forzar a cada hilo a utilizar otro núcleo).

+0

Gracias. Básicamente, cada respuesta era correcta ... configurar la Afinidad del procesador para forzar mis hilos usando una CPU separada no me ayudó cada uno, pero me diste exactamente lo que pedí para que yo pudiera resolverlo y aprender. – Steav

+0

Tenga en cuenta que a medida que ajusta las afinidades de su CPU, asegúrese de hacerlo de forma inteligente, ya que está aplicando restricciones artificiales sobre en qué núcleo piensa el planificador de CPU del SO * que debe haber un núcleo. También tenga en cuenta que la pregunta, por supuesto, tenía cierta confusión sobre el núcleo de estacionamiento y la afinidad de la CPU, que traté de aclarar en mi respuesta, aparentemente coja, 0 de años atrás;). –

7

Cuando Windows "aparca" un núcleo de CPU, significa que no hay suficiente trabajo para ese núcleo, por lo que pone ese núcleo en un estado de bajo consumo de energía. Para "desactivar" la CPU, solo tiene que crear suficiente trabajo.

Si está iniciando 8 subprocesos y Windows no está desencadenando las CPU, probablemente los subprocesos están haciendo E/S, bloqueando o completando demasiado rápido. Si publica lo que están haciendo sus hilos, tal vez alguien pueda explicar por qué no se están ejecutando en los núcleos estacionados.

+0

Tengo un For-Loop que funciona brevemente (~ 2-10ms por ciclo), pero la lista a través de la cual funciona puede crecer fácilmente hasta 200-300k. La respuesta no me parece adecuada, porque antes de comenzar el trabajo, 4 CPU están estacionadas y 4 están funcionando ... lo mismo cuando empiezo mi procedimiento ... Y hay MUCHO trabajo por hacer, y 4 núcleos adicionales podrían mejorar mucho el desempeño. Los hilos no se completan en 20 segundos. No se realizan operaciones de E/S. – Steav

+0

En realidad, me preocupo, porque los 4 núcleos adicionales son necesarios, porque la Operación aún tarda más de lo que podría en un 8core Intel I7 – Steav

+0

El estacionamiento es un estado transitorio. Cuando se desencadena un núcleo, realizará su trabajo y se aparcará nuevamente. Cuando miro en Resource Monitor, muestra que un núcleo está estacionado, pero que la CPU aún está trabajando. – Gabe

2

Win7/2K8R2 no destrabe los núcleos hasta que los otros estén saturados o cerca de la saturación.

El objetivo de los núcleos de estacionamiento es consolidar el trabajo. Es más eficiente en el uso de energía usar 4 núcleos al 80% que 8 núcleos al 40%. Además, la diferencia de rendimiento debería ser casi inexistente.

Además, dependiendo de la cantidad de datos compartidos, la consolidación del trabajo en realidad será más rápida porque habrá menos sobrecarga de sincronización porque hay menos hilos de hardware involucrados. Los cambios de datos recientes de un hilo serán más probables en el caché.

Por lo tanto, el peor de los casos es el mismo rendimiento y se utiliza menos energía y la mejor carcasa común es un mejor rendimiento y menos potencia utilizada.

0

El estacionamiento no está controlado por la configuración de afinidad de la CPU de su proceso, sino que se realiza automáticamente mediante el Programador de CPU de Windows. Los ajustes a la afinidad de su CPU pueden quizás forzar el uso de ciertos núcleos, pero Windows simplemente estacionará diferentes núcleos. El estacionamiento se enciende o apaga de forma dinámica, muy rápidamente, de acuerdo con la carga del sistema. En realidad es sorprendentemente agresivo por defecto (quizás demasiado en algunas plataformas). Puedes verlo en el Monitor de recursos, como viste.

Establecer su propia afinidad de CPU es algo que debe hacer con extrema precaución. Debe considerar núcleos HyperThreaded, o en el caso de AMD Bulldozer, núcleos emparejados que comparten unidades computacionales (su HyperThreading sin ser HyperThreading; p). No desea terminar "atrapado" en un núcleo hiper-subprocesado que ofrece una mera fracción del rendimiento de un núcleo real. El programador de la CPU conoce estas cosas, por lo que generalmente es mejor dejar la afinidad, a menos que sepa lo que está haciendo y haya comprobado la CPU de ese sistema.

Sin embargo, puede habilitar/deshabilitar o ajustar el estacionamiento de CPU muy fácilmente, sin reiniciar.Escribí un HOW-TO, completo con una GUI simple, aquí: How to Enable/Disable or Tweak CPU Parking Without a Reboot, and without Registry Edits

También incluye más información sobre CPU Parking, y cómo ajustarlo usando PowerCfg.exe. En realidad, puede hacer aparecer la opción en la configuración estándar de Advanced Power Profile en Windows, pero requiere algunos ajustes. No entraré aquí.