¿Son lo mismo los hilos de ejecución en los programas que en tu CPU?

Los ordenadores ya no son como sus inicios que ejecutaban un proceso y gracias, ahora tienen la capacidad de ejecutar una cantidad inmensa de programas en paralelo. Algunos de ellos los vemos en nuestros juegos, otros en cambio son invisibles, pero ahí están, siendo ejecutados por la CPU. ¿Existe alguna relación entre los procesos del software e hilos de ejecución con los del hardware?

A menudo solemos escuchar o leer el concepto hilo de ejecución al oír hablar de nuevas CPUs, pero también en el mundo del software. Es por ello que hemos decidido explicaros las diferencias entre lo que son los procesos o hilos de ejecución en el software y sus equivalentes de significante en el hardware.

Procesos en el software

Código binario color

En su definición más simple programa no es más que una sucesión de instrucciones ordenadas secuencialmente en la memoria, las cuales son procesadas por la CPU, pero la realidad es más compleja. Cualquiera con un poco de conocimientos en cuanto a programación sabrá que esa definición corresponde a los diferentes procesos que se ejecutan en un programa, donde cada proceso se intercomunica con los otros y se encuentra en una parte de la memoria.

A día de hoy tenemos una gran cantidad de programas ejecutándose en nuestro ordenador y por tanto una cantidad mucho mayor de procesos, los cuales se pelean para acceder a los recursos de la CPU para ser ejecutados. Con tal cantidad de procesos al mismo tiempo se necesita un director de orquesta que se encargue de gestionarlos. Dicho trabajo corre en manos del sistema operativo, el cual como si fuese un sistema de control de tráfico de una gran ciudad se encarga de gestionar y planificar los diferentes procesos que se van a ejecutar.

No obstante se suelen hablar de los procesos en software como hilos de ejecución, y no es una mala definición si tenemos en cuenta su naturaleza, pero no coincide la definición en ambos mundos, por lo que se suelen confundir a menudo y esto lleva a varios malentendidos acerca de cómo funciona el hardware y el software multihilo. Es por ello que en este artículo hemos decidido llamar procesos a los hilos de ejecución del software para diferenciarlos de los del hardware.

El concepto de burbuja o parada en una CPU

Burbuja Procesos

Una burbuja o parada en la ejecución ocurre cuando un proceso que ejecuta la CPU por algún motivo no puede continuar, pero tampoco ha sido terminado en el sistema operativo. Por ese motivo los sistemas operativos tienen la capacidad de suspender un hilo de ejecución cuando la CPU no puede continuar y le asigna el trabajo a otro núcleo que esté disponible.

En el mundo del hardware apareció a principios de los 2000 lo que llamamos multihilo con el Hyperthreading de los Pentium IV. El truco estaba en duplicar la unidad de control de la CPU que se encarga de la captación y descodificación. Con ello se conseguía que el sistema operativo acabará viendo la CPU cómo si fueran dos CPUs distintas y le asignaba la tarea a la segunda unidad de control. Esto no duplica la potencia, pero cuando la CPU misma se quedaba bloqueada en un hilo de ejecución pasaba al otro de manera inmediata para aprovechar así los tiempos muertos que se producían y sacar más rendimiento de los procesadores.

La ejecución multihilo a nivel de hardware al duplicar la unidad de control, la cual es la parte más compleja de una CPU moderna, supone aumentar por completo el consumo energético. De ahí a que las CPU para smartphones y tablets no tengan multihilo por hardware en sus CPU.

El rendimiento depende del sistema operativo

Procesos Sistema Operativo

Pese a que las CPU pueden ejecutar dos hilos de ejecución por núcleo, es el el sistema operativo el que se encarga de realizar la gestión de los diferentes procesos. Y en la actualidad la cantidad de procesos que se ejecutan en un sistema operativo son una cantidad mayor que el número de núcleos que puede ejecutar una CPU simultáneamente.

Por lo que al ser el sistema operativo el que se encarga de gestionar los diferentes procesos este es el que también se encarga de asignarlos. Esto es una tarea muy fácil si hablamos de un sistema homogéneo en el que cada núcleo tiene la misma potencia. Pero, en un sistema totalmente heterogéneo con núcleos de diferentes potencias esto supone una complicación para el sistema operativo. El motivo de ello es que necesita una forma de medir cual es el peso computacional de cada proceso, y esto no se mide solo por lo que ocupa en memoria, sino por la complejidad de las instrucciones y los algoritmos.

El salto a los núcleos híbridos ya se ha dado en el mundo de los procesadores ARM dónde sistemas operativos como iOS y Android se han tenido que adaptar al uso de núcleos de diferentes rendimientos trabajando de manera simultánea. Al mismo tiempo la unidad de control de futuros diseños se ha tenido que complicar aún más en los x86. ¿El objetivo? Que cada proceso en el software se ejecute en el hilo de ejecución adecuado del hardware y que sea la propia CPU la que tenga más independencia en la ejecución de los procesos.

¿Cómo es la ejecución de procesos en las GPU?

TFLOPS Velocidad GPU

Las GPU en sus unidades shader también ejecutan programas, pero sus programas no están en forma secuencial, sino que cada hilo de ejecución se compone de una instrucción y su dato, la cual tiene tres condicionantes distintos:

  • El dato se encuentra junto a la instrucción y se puede ejecutar de manera directa.
  • En la instrucción se encuentra la dirección de memoria del dato y se ha de esperar a que el dato llegue desde la memoria a los registros de la unidad shader.
  • El dato depende de la ejecución de un hilo de ejecución anterior.

Pero una GPU no ejecuta un sistema operativo que pueda gestionar los diferentes hilos. ¿La solución? Todas las GPU utilizan un algoritmo en el planificador de cada unidad shader, el equivalente a la unidad de control. Dicho algoritmo se llama Round-Robin y consiste en darle un tiempo de ejecución en ciclos de reloj a cada hilo de ejecución/instrucción. Si este no se ha solucionado en ese tiempo pasa a la cola y se ejecuta la siguiente instrucción de la lista.

Los programas shader no se encuentran compilados en el código, debido a que hay diferencias sustanciales en la ISA interna de cada GPU, es el controlador el encargado de compilar y empaquetar los diferentes hilos de ejecución, pero es el código del programa el encargado de gestionarlos. Por lo que es un paradigma diferente a como ejecuta los diferentes procesos la CPU.

¡Sé el primero en comentar!