¿Por qué se distribuye un solo subproceso en las CPU?

24

Tengo curiosidad por saber por qué el programador mueve constantemente una aplicación entre las CPU, en lugar de mantenerla en una. Parece un poco tonto tener 4 núcleos al 25% en lugar de uno al 100%.

¿Tiene que ver con el calor o es más eficiente de alguna manera? ¿Otros sistemas operativos lo hacen de manera diferente?

Las ideas o enlaces a cosas en profundidad serían buenos. (No pude encontrar mucho yo mismo).

Actualizar:

Por "extendido" no quiero decir que se ejecuta en varias CPU a la vez, sino que se está moviendo de una a otra varias veces por segundo, lo que hace que el efecto se vea extendido.

Macke
fuente
3
Incluso cuando "nada más se está ejecutando", siempre hay hilos del sistema que compiten por la CPU. Por ejemplo, el O / S tiene un hilo para poner a cero las páginas de memoria recuperadas, por lo que cuando se requiera memoria, tendrá algunas páginas listas para usar. Cuando su hilo se ejecute nuevamente, la CPU en la que estaba puede estar en uso por uno de estos hilos. ¿Qué debe hacer el sistema operativo? ¿Esperarlo o mudarte a una nueva CPU? Lo que sea que haga, terminará con un comportamiento indeseable en algunos casos.
Tony Lee
Es un goomba. SMB, no LBP. :)
Macke
En mi "respuesta", mostré un programa de un solo subproceso que se comportaba exactamente como usted lo describe, es decir, "se mueve de uno a otro varias veces por segundo, lo que hace que parezca extendido".
Evan Rosica

Respuestas:

8

Creo que wierobha descrito el punto bastante bien.
Aquí hay un artículo anterior que analiza la processor affinityconfiguración con un QX6800 de cuatro núcleos .
(el enlace apunta a la segunda página de ese artículo).

Si no fuerza la afinidad del proceso a un núcleo, ¿pierde rendimiento ?

  • Si bien el planificador de Windows necesita decidir tal afinidad para evitar la disputa con los cachés,
    el diseño del procesador en sí también considera tales cosas.
  • El Intel QX6800 de cuatro núcleos (como lo mencioné anteriormente en esta respuesta)
    tiene una memoria caché de 8 MB L3compartida en sus 4 núcleos .

Cabe señalar que si bien es posible que haya elegido ejecutar solo este proceso de un solo subproceso en el sistema, el sistema operativo en sí tendría varias otras tareas en ejecución que también deben programarse. El planificador equilibra toda esta actividad en el grupo de procesadores (o núcleos) disponibles.


En el futuro, con la arquitectura Nehalem y NUMA , los
procesadores a través de múltiples sockets también podrán abordar mejor el thrash de acceso.
Aquí hay una imagen rápida de una página de ArsTechnica en NUMA .

ingrese la descripción de la imagen aquí

Si Nehalem i7te interesa, tengo algunos enlaces más en esta respuesta .

nik
fuente
Lo que le hace pensar que "En el futuro, con la arquitectura Nehalem y NUMA, los procesadores en múltiples sockets también podrán abordar mejor el acceso acelerado". ? Tal como lo veo, NUMA hace que la memoria sea aún más local y relacionada con un procesador particular, lo que empeora los efectos de la basura.
Roland Pihlakas
@RolandPihlakas, ha pasado un tiempo desde esta respuesta, pero mirando el artículo de arstechnica y estos puntos, creo que estaba explicando la capacidad de las nuevas plataformas para tener una mejor conectividad de memoria y el software para aprovechar eso (sobre no tener esa opción con configuraciones de socket múltiples en ese momento; es decir, antes de Nehalem).
nik
6

El planificador simplemente ejecuta el siguiente subproceso que está listo para ejecutarse en un núcleo / CPU "libre".

Puede asignar un proceso a una CPU específica a través del administrador de tareas de Windows.

Tener 4 núcleos al 25% significa que 4 hilos se ejecutan simultáneamente. Mientras que un núcleo en x% significa que solo se ejecuta un hilo. Entonces, el primero es más eficiente en algunos casos.

Pero durante su ejecución, el caché de la CPU se llena con los datos a los que accede el hilo. Entonces, si el subproceso se ejecuta en otra CPU, experimentará más errores de caché, que son costosos, ya que los datos no están en la caché de esta CPU.

¿Qué hace tu hilo? Si el hilo "duerme" por un tiempo muy corto, el núcleo en el que se ejecutó antes podría estar ocupado por otra amenaza y, por lo tanto, su hilo se ejecuta en el siguiente núcleo disponible. ¿Qué sucede si especifica un solo núcleo para ser utilizado por su proceso (por ejemplo, un administrador de tareas)?

wierob
fuente
3
El programador afaik de Windows hace un buen trabajo al mantener los hilos en la misma CPU / núcleo durante su duración para evitar ese problema.
Paxxi
@ Pär: Mi hilo parece estar ejecutándose en cada núcleo en realidad.
Macke
Sí, probablemente sean los procs del sistema operativo los que me rompan el hilo. ¿Cómo aceptar dos respuestas? :)
Macke
@ PärBjörklund desde mi experiencia, al menos Windows XP no. Creo que el problema de "rebote de caché" se solucionó en Vista o posterior
Waxhead
1
"Tener 4 núcleos al 25% significa que 4 hilos se ejecutan simultáneamente". No, significa que se ejecuta un hilo, un bit en un núcleo, luego otro y así sucesivamente. Como el Administrador de tareas muestra el uso promedio, mostrará un 25% (en un sistema de 4 núcleos, en un núcleo de dos mostrará un 50%) para cada núcleo. Significa que el núcleo se utilizó por completo un cuarto de tiempo y estuvo inactivo durante el resto del tiempo.
David Balažic
0

No es. Un subproceso solo puede ejecutarse en un procesador. Sin embargo, algunos procesos tienen múltiples subprocesos, que pueden distribuirse.

El razonamiento, lo creas o no, nunca consideró cómo se ve. El sistema intenta extender los hilos porque no tiene forma de saber cuándo se disparará.

tsilb
fuente
1
Ver mi aclaración adicional. Este es un subproceso, que funciona a toda velocidad, que se mueve rápidamente para que, con el tiempo, cada núcleo (fuera de la delantera) esté un 25% ocupado. (Todos los demás procesos / hilos son insignificantes)
Macke
0

El sistema operativo migra el hilo a través de los núcleos de la CPU (rápidamente, varias veces por segundo). Es más eficiente ejecutarlo en el mismo núcleo todo el tiempo. Esto se puede aplicar mediante el elemento del menú contextual "Establecer afinidad" en el Administrador de tareas.

Tenga en cuenta que generalmente (uso doméstico típico) la diferencia está en el rango de pocos porcentajes.

Los "4 núcleos cada uno con un 25% de uso" significan, como el Administrador de tareas muestra el uso promedio, que cada núcleo se utilizó por completo un cuarto de tiempo y se liberó el resto del tiempo.

La descripción es para Windows, pero también es similar en otros sistemas operativos.

David Balažic
fuente
-1

Si alguien todavía está leyendo esto, también lo he notado y he realizado bastantes pruebas para ver si no es solo una casualidad. Resulta que no lo es! Creo que extender un solo hilo sobre todos los núcleos es más eficiente por varias razones:

  1. Extender un hilo a través de todos los núcleos permite un menor consumo de energía. La mayoría de los procesadores reducen sus frecuencias y, lo que es más importante, el voltaje de acuerdo con la carga, por lo que un Core 2 Quad, por ejemplo, consumirá mucha menos energía y producirá menos calor al distribuir un hilo en los 4 núcleos en lugar de usar un núcleo (que conducen al aumento de voltaje en TODOS los núcleos, ya que solo hay un regulador de voltaje *, eso es bastante ineficaz).
  2. Asegura que el hilo siempre funcione a velocidad máxima / constante. Si el hilo repentinamente solicita más potencia de procesamiento, un núcleo podría sobrecargarse y habrá un retraso en la ejecución. Al extenderlo a través de los núcleos, cualquier pico repentino se manejará sin problemas, sin retrasos ni demoras.

Además, debido a las dos observaciones anteriores, he llegado a creer que Turbo Boost e IDA son ineficaces. Pueden ser útiles en sistemas operativos más antiguos, pero Linux y Windows 7 distribuyen todo en todos los núcleos de manera bastante eficiente. Entonces, un Core 2 Quad q9100 @ 2.26 GHz casi (siempre hay excepciones :-) siempre será más rápido que un Core 2 Duo X9100 @ 3.06GHz, y rara vez lo he visto usar IDA (básicamente el predecesor de Turbo boost, aumenta la frecuencia en uno o dos núcleos solo para aplicaciones de subproceso único).

  • El Core 2 Quad tiene dos dominios de reloj gracias al hecho de que hay dos troqueles físicos, por lo que dos núcleos pueden funcionar a frecuencia completa, mientras que dos están en la frecuencia más baja. Sin embargo, no sé si hay dos reguladores de voltaje: he notado que el voltaje es uniforme en los 4 núcleos, por lo que debe haber un solo regulador para todo el paquete.
JakL
fuente
3
Esto suena dudoso por varias razones. Proporcione referencias a sus "hechos". Primero, ¿por qué la informática al 25% en cuatro núcleos consume menos energía que el 100% en uno? (Estoy de acuerdo en que el calor se distribuye de manera más uniforme, pero ...) Además, el hilo en mi pregunta se está ejecutando a toda velocidad (100%), por lo que no "solicitará más potencia de procesamiento", porque ya está funcionando cuanto más se pueda.
Macke
Bueno, eso es solo de mis propias observaciones: estaba intrigado por IDA y TurboBoost, decidí hacer algunas pruebas. Fue hace bastante tiempo, pero llegué a las conclusiones anteriores. El procesador consume menos energía, ya que todos los núcleos funcionan a un voltaje más bajo: una reducción de 0.1V ahorra aproximadamente 6-10 vatios en consumo de energía (si un núcleo está cargado al 100%, todos los núcleos funcionan a un voltaje más alto, ya sea que estén inactivos o no). Esto es especialmente cierto en Core2Duo con modo SLFM. Tiene razón acerca de que el hilo que se ejecuta a toda velocidad no solicita más toques de procesador, pero hay aplicaciones que sí lo hacen.
JakL
No existe tal cosa como "difundir un hilo" (no, ni siquiera 5 años después). Hay un solo hilo, ejecutado en un núcleo. Y luego más tarde otro. Y así. En cada momento, un núcleo funciona al 100% y los otros están inactivos. Entonces no hay ahorro. Especialmente como mencionas cuando todos los núcleos están a plena tensión todo el tiempo de todos modos (como dijiste, comparten voltaje). Además, como ya se mencionó, estar en el mismo núcleo garantiza que el hilo obtenga toda la potencia de procesamiento que existe. Como ese núcleo ya se usa al 100%, el sistema operativo programará otros hilos para otros núcleos menos utilizados.
David Balažic