• Compra una licencia de Windows 10/11 (10€) u Office (18€) al mejor precio u Office al mejor precio. Entra en este post con las ofertas
  • ¡Bienvenid@! Recuerda que para comentar en el foro de El Chapuzas Informático necesitas registrar tu cuenta, tardarás menos de 2 minutos y te dará valiosa información además de ayudarte en lo que necesites o pasar un rato agradable con nosotros.

Dudas sobre núcleos e hilos.

Saito_25

Friki informático
Registrado
15 Mar 2015
Mensajes
1.154
Puntos
83
Buenas,

Me ha surgido una duda sobre el funcionamiento de los núcleos e hilos, hoy en clases.

El profesor ha explicado que función cumplen los hilos y es algo muy diferente a lo que yo tenía pensado, a ver si me podéis decir quien está más en lo cierto. Y muchas gracias.

Explicación del profesor:
Un núcleo que simula dos hilos, se encarga de dos subprocesos a la vez.

Lo que yo tenía entenidido:
Un núcleo que simula dos hilos, se encarga de un subproceso y cuando esté se queda parado, porque espera alguna instrucción para poder seguir haciendo operaciones, en lugar de esperar, hace operaciones con otro subproceso, eliminando así los tiempos muertos.

¿Me podéis aclarar, por favor, la duda?
 
Lo que tú tienes entendido es lo que se conoce como "paralelización de instrucciones", y se ejecuta en un único core/hilo. Con ese concepto puedes investigar por Google, pero básicamente es no ejecutar las instrucciones secuencialmente, lo que produce que cuando unas dependen del resultado de otras haya ciclos muertos del procesador y se pierda tiempo. Cuando una instrucción no puede continuar por este concepto, se para y se intercalan en los siguientes ciclos de reloj las subinstrucciones de otra u otras, luego se retoma la anterior, etc. Sin la paralelización de instrucciones un procesador como un Pentium 4 con un único core no podría abrir una ventana mientras extrae un .rar. Básicamente es que las instrucciones se "trocean" y se ejecutan "todas a la vez", entendiéndose esto como que no esperan unas por la finalización de las otras. He usado lenguaje poco técnico para que se entienda, te remito a Google.

Si tienes dos cores/hilos, puedes ejecutar dos instrucciones simultáneamente sin necesidad de intercalar sus subinstrucciones. Es diferente.
 
tasadarf, me voy a leer el post que has puesto, te agradecería si puedes explicarme un poco más.

Gracias!
 
@tasadarf es mi tocayo, yo soy Tassadar xd

Así a groso modo, si has leído el enlace que te puse, lo que hace el SMT es aprovechar los momentos en los que se produce un "pipeline stall" para procesar otro hilo (otra instrucción de otro hilo) en esa etapa del pipeline, aprovechando así mejor el procesador, pues realmente no tiene porque tomar una instrucción y estar ocupado hasta que acaba de procesarla, sino que internamente está procesando dos instrucciones diferentes.

A lo que comenta el compañero @Megaman, por lo que yo se (corregidme si me equivoco), la paralelización de instrucciones, que es algo que se usa desde los primeros sistemas operativos multitarea, lo que hace es crear una pila de instrucciones de forma que en lugar de ejecutar un programa entero y cuando acaba ejecutar otro (procesamiento nonotarea), lo que se hace es ejecutar varios programas a la vez, la sensación que tiene el usuario es que todo va al mismo tiempo, pero internamente la realidad es que se crea una pila de instrucciones que se va procesando de determinada manera, dando prioridad a unas instrucciones u otras (LIFO, FIFO...)…

Es algo complicado de explicar, pero a donde quiero llegar es que en un procesador (o núcleo más bien) sin SMT, es una realidad que vas ejecutando varios programas a la vez, pero el punto importante es que las instrucciones se ejecutan de una en una, vas procesando diferentes instrucciones de diferentes programas, pero desde que entra en el pipeline una instrucción hasta que sale, esa instrucción ha de pasar por todas las etapas, y sin existir ejecución de otras instrucciones en medio de ésta. O sea, los tiempos muertos que se producen por los "pipeline stall" se quedan muertos, y en estos tiempos esa etapa del pipeline está rascándose la barriga (esto se explica bien en el artículo).

El SMT permite aprovechar esos atasques del pipeline para "colar" otra instrucción en el núcleo, de forma que mantienes todas las etapas del pipeline aprovechadas, sacándole mucho más jugo al hardware. Siguiendo el ejemplo que usé en el artículo, seria equivalente a que en la fábrica, en lugar de tener la cadena de montaje de coches de forma que van entrando los coches de uno en uno, es posible estar montando dos coches al mismo tiempo:

Imagina que en la parte de la fábrica hay un problema con el montaje del chasis del coche. Sin SMT esto crea un pipeline stall que hace perder tiempo a todas las fases del pipeline que vienen después, porque claro, si el chasis no está montado, el equipo siguiente no puede pintarlo, y el otro equipo no puede poner el motor....

Con SMT lo que hacemos es que si en la primera fase hay un problema con el chasis del coche, tenemos otro coche al que únicamente se le ha puesto el chasis y está pendiente de pintarlo, así que en lugar de dejar el equipo de pintura (la etapa dos del pipeline) de brazos cruzados, se pone a pintar otro coche mientras que el equipo de montaje de chasis termina de montar el otro.

La implementación de Intel del SMT (llamada comercialmente Hyperthreading) permite aumentar el redimiendo hasta un 30%, y el SMT de los Ryzen hasta un 40%, así que es algo bastante interesante, pues no requiere una inversión demasiado grande en cuanto a lógica (transistores) y espacio en el silicio, pero consigue una mejora sustancial.

Un saludo
 
Última edición:
Disculpad ambos, me he liado con los nombres.

Gracias a los dos. me pongo a leer el post y a ver si consigo entenderlo mejor.
 
Disculpad ambos, me he liado con los nombres.

Gracias a los dos. me pongo a leer el post y a ver si consigo entenderlo mejor.

Por mi parte nada que disculpar :)

Espero que encuentres interesante el artículo que te enlacé y que la explicación que he dado aqui del SMT se entienda, si tienes dudas pregúntame y dentro de mis conocimientos intentaré aclararlo lo mejor posible.

Saludos
 
Tassadar, super interesante la verdad.

Los ejemplos fueron super claros y todo estaba explicado a un nivel que se te hacía agradable seguir leyendo... ¿Hay más post como ese en algún lado?

Pues creo que he conseguido solventar mis dudas, pero os pongo un ejemplo con lo que creo saber a ver si me podéis decir si lo he entendido bien. Muchas gracias.

Vamos a suponer que tengo dos programas, word y google abiertos.

Según sé, un programa es un flujo de datos que puede dividirse en subflujos (procesos y subprocesos). Un subproceso es la unidad mínima de procesamiento que se procesa en un thread. ¿Cómo voy hasta aquí? ¿Me he liado mucho?

Suponiendo que el word se divide en dos subprocesos y el google en tres, y que mi cpu es de 2 núcleos y 4 hilos: quedaría así:

[TABLE="class: outer_border, width: 500, align: left"]
[TR]
[TD]Núcleo 1
[/TD]
[TD]Núcleo 2
[/TD]
[/TR]
[TR]
[TD]Word 1
[/TD]
[TD]Word 2
[/TD]
[/TR]
[TR]
[TD]Google 1
[/TD]
[TD]Google 2
[/TD]
[/TR]
[TR]
[TD]Google 3
[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD][/TD]
[/TR]
[/TABLE]









Ahora bien, si el núcleo 1 está procesando una instrucción del Word en la segunda etapa del pipeline del núcleo 1 y va a necesitar dos etapas para poder avanzar, ya que le falta un dato, se colaría algún otro de los subprocesos a la tercera etapa del pipeline y luego pasaría a la 4 etapa, y a la tercera pasaría otro subproceso. Luego la tercera pasaría a la cuarta y como la segunda etapa ya tiene su instrucción puede hacer que la instrucción del word pase a la 3 etapa.

¿Estoy en lo cierto?

Gracias!
 
@Tassadar, super interesante la verdad.

Los ejemplos fueron super claros y todo estaba explicado a un nivel que se te hacía agradable seguir leyendo... ¿Hay más post como ese en algún lado?

Pues creo que he conseguido solventar mis dudas, pero os pongo un ejemplo con lo que creo saber a ver si me podéis decir si lo he entendido bien. Muchas gracias.

Vamos a suponer que tengo dos programas, word y google abiertos.

Según sé, un programa es un flujo de datos que puede dividirse en subflujos (procesos y subprocesos). Un subproceso es la unidad mínima de procesamiento que se procesa en un thread. ¿Cómo voy hasta aquí? ¿Me he liado mucho?

Suponiendo que el word se divide en dos subprocesos y el google en tres, y que mi cpu es de 2 núcleos y 4 hilos: quedaría así:

[TABLE="class: outer_border, width: 500, align: left"]
[TR]
[TD]Núcleo 1[/TD]
[TD]Núcleo 2[/TD]
[/TR]
[TR]
[TD]Word 1[/TD]
[TD]Word 2[/TD]
[/TR]
[TR]
[TD]Google 1[/TD]
[TD]Google 2[/TD]
[/TR]
[TR]
[TD]Google 3[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD][/TD]
[/TR]
[/TABLE]









Ahora bien, si el núcleo 1 está procesando una instrucción del Word en la segunda etapa del pipeline del núcleo 1 y va a necesitar dos etapas para poder avanzar, ya que le falta un dato, se colaría algún otro de los subprocesos a la tercera etapa del pipeline y luego pasaría a la 4 etapa, y a la tercera pasaría otro subproceso. Luego la tercera pasaría a la cuarta y como la segunda etapa ya tiene su instrucción puede hacer que la instrucción del word pase a la 3 etapa.

¿Estoy en lo cierto?

Gracias!

No termino de entender tu gráfico... a ver, si el core 1 se pone a ejecutar la primera instrucción del word, lo más normal es que al mismo tiempo no peudas ejecutar la segunda instrucción del word en el core 2, porque necesitas tener el resultado de la primera para ejecutar la segunda*. Otra cosa es que el programa tenga operaciones que se puedan paralelizar, de forma que no se necesite el resultado de una para ejecutar otra (el ejemplo mas fácil es cuando hay que hacer la misma operación a muchos conjuntos de datos similares).

Pero por experiencia propia (soy programador) te digo que programar de forma que se paralelize requiere bastante más esfuerzo y pruebas, digamos que es mucho mas fácil aprovechar un solo núcleo que programar para que se aprovechen varios.

Realmente, con dos núcleos y tu ejemplo, lo mas fácil (y obvio) sería ejecutar para programa en un núcleo:

y que mi cpu es de 2 núcleos y 4 hilos: quedaría así:

[TABLE="class: outer_border, width: 500, align: left"]
[TR]
[TD]Núcleo 1[/TD]
[TD]Núcleo 2[/TD]
[/TR]
[TR]
[TD]Word 1[/TD]
[TD]Google 1[/TD]
[/TR]
[TR]
[TD]Word 2[/TD]
[TD]Google 2[/TD]
[/TR]
[TR]
[TD]Google 3[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD][/TD]
[/TR]
[/TABLE]









Pero una cosa es el orden en el que se ejecutan las instrucciones y otras como van pasando por las etapas del pipeline. Como viste en el enlace que te puse, el procesador puede estar ejecutando dos o más instrucciones (en realidad puede estar con tantas instrucciones a la vez como etapas del pipeline tenga, mientras que no haya ningún "pipeline stall"), o sea, que haya en cada etapa del pipeline una instrucción, realizando la operación propia de esa etapa.

La cuestión es que el retraso de una instrucción en una etapa del pipeline crea ese atasco, es como un atasco de coches, si uno se queda parado, los que están detrás no pueden pasar, y se pierde uno o varios ciclos de reloj. Con el SMT lo que se hace es algo como meter dos coches a la vez en cada cadena de montaje. si el pipeline no estalla nunca no aumenta el rendimiento, porque realmente es un solo procesador físico, pero si ocurre esto (se crea ese atasco) se manejan los recursos del procesdador de forma que esa etapa del pipeline no se queda desaprovechada en ese ciclo, porque se carga otra instrucción en ella.

De todas formas, quiero dejar claro que no soy experto en arquitectura de CPUs, lo que sé del tema es por puro hobby, si digo alguna burrada que algún compañero por favor me corrija.

En ForoDVD tengo mas artículos, mañana los busco y te los listo por aqui por si alguno te interesa.

Un saludo


*Aunque esto no es 100% cierto ya que existe una tecnología que intenta predecir el resultado de una instrucción e ir ejecutando la siguiente por si acierta. Si el resultado era el que se esperaba, pues se ha ganado tiempo porque la siguiente instrucción ya está ejecutada, si no, pues hay que volver a ejecutar.
 
Arriba