¿Cómo funciona realmente la ejecución multi hilo en una CPU moderna?

Cuando hablamos de procesadores para PC, es muy frecuente hablar de número de núcleos y de hilos de proceso o ejecución, que generalmente son el doble que el de núcleos porque las tecnologías HyperThreading en el caso de Intel y SMT en el caso de AMD lo que hacen es que cada núcleo pueda ejecutar dos tareas simultáneas. No obstante, esa es una manera un poco simple de explicar cómo funciona la ejecución multi hilo en un procesador, y en este artículo lo que vamos a hacer es explicártelo con mayor nivel de detalle para que puedas comprender todos sus entresijos.

Dicho esto, todos sabemos que un procesador que tiene más hilos de ejecución que núcleos, es capaz de ejecutar más tareas de manera simultánea y, de hecho, el sistema operativo detecta el procesador como si en realidad tuviera tantos núcleos como hilos. Por ejemplo, un Intel Core i7-8700K tiene 6 núcleos y 12 hilos gracias a la tecnología HyperThreading, y Windows 10 lo reconoce como un procesador de 12 núcleos tal cual (si bien es cierto que los llama «procesadores lógicos») porque para el sistema operativo, su funcionamiento es totalmente transparente.

¿Qué es el procesamiento multi hilo?

En la arquitectura de computadoras, el procesamiento multi hilo es la capacidad de la unidad central de procesamiento (CPU) de proporcionar múltiples subprocesos de ejecución al mismo tiempo, respaldados por el sistema operativo. Este enfoque difiere del multiprocesamiento y no hay que confundirlo; en una aplicación multiproceso, los subprocesos comparten los recursos de uno o varios núcleos del procesador, que incluyen las unidades de cómputo, caché y el búfer de búsqueda de traducción (TLBL).

Multiproceso vs multi hilo

Cuando los sistemas de multiprocesamiento incluyen múltiples unidades de procesamiento completas en uno o más núcleos, el multiproceso tiene como objetivo aumentar la utilización de un solo núcleo mediante el uso de paralelismo a nivel de subprocesos, así como el paralelismo a nivel de instrucción. Como las dos técnicas son complementarias, se combinan en casi todas las arquitecturas de sistemas modernos con múltiples CPU de subprocesos múltiples y con CPU con múltiples núcleos capaces de funcionar con múltiples hilos de proceso.

El paradigma de subprocesos múltiples se ha vuelto más popular a medida que los esfuerzos para explotar el paralelismo a nivel de instrucción (es decir, el poder ejecutar varias instrucciones en paralelo) se estancó a finales de la década de 1990. Esto permitió que el concepto de la informática de rendimiento resurgiera del campo más especializado del procesamiento de transacciones.

Aunque es muy difícil acelerar aún más un solo subproceso o programa, la mayoría de los sistemas informáticos son en realidad multitarea entre varios subprocesos o programas y, por lo tanto, las técnicas que mejoran el rendimiento de todas las tareas dan como resultado ganancias de rendimiento general. Dicho de otra manera, cuantas más instrucciones al mismo tiempo sea capaz de procesar una CPU, mejor será el rendimiento global de todo el sistema.

Incluso el procesamiento multi hilo tiene desventajas

Además de las ganancias de rendimiento, una de las ventajas del procesamiento multi hilo es que si un subproceso tiene muchos errores de caché, los otros subprocesos pueden continuar aprovechando los recursos de la CPU no utilizados, lo que puede conducir a una ejecución general más rápida ya que estos recursos habrían estado inactivos si solo se hubiera ejecutado un único subproceso. Además, si un subproceso no puede utilizar todos los recursos de la CPU (por ejemplo porque las instrucciones dependen del resultado del anterior), ejecutar otro subproceso puede evitar que estos recursos se queden inactivos.

CPU Reverso Render

Sin embargo, todo tiene también su lado negativo. Varios subprocesos pueden interferir entre sí al compartir recursos de hardware, como la caché o los búferes de búsqueda de traducción. Como resultado, los tiempos de ejecución de un solo subproceso no mejoran y pueden llegar a degradarse, incluso cuando solo se está ejecutando un subproceso, debido a frecuencias más bajas o etapas de canalización adicionales que son necesarias para acomodar el hardware de conmutación de procesos.

La eficiencia general varía; Intel dice que su tecnología HyperThreading la mejora un 30%, mientras que un programa sintético que solo realiza un ciclo de operaciones de coma flotante dependientes y no optimizadas en realidad recibe una mejora del 100% cuando se ejecuta en paralelo. Por otro lado, los programas en lenguaje ensamblador ajustados a mano que usan extensiones MMX o AltiVec y realizan búsquedas previas de datos (como un codificador de vídeo) no sufren pérdidas de caché o recursos inactivos, así que no se benefician en nada de una ejecución multi hilo y, de hecho, pueden ver su rendimiento degradado debido a la contención de recursos compartidos.

Desde el punto de vista del software, el soporte de hardware para subprocesos múltiples es totalmente visible, lo que requiere más cambios tanto en los programas de aplicación como en el propio sistema operativo. Las técnicas de hardware utilizadas para admitir procesamiento multi hilo a menudo son paralelas a las técnicas de software utilizadas para la multitarea; la programación de subprocesos también es un problema importante en subprocesos múltiples.

Tipos de procesamiento multi hilo

Como decíamos al principio, todos tenemos la concepción de que el procesamiento multi hilo es simplemente paralelización de procesos (es decir, ejecutar varias tareas al mismo tiempo), pero en realidad la cosa es un poco más complicada que eso y es que hay diferentes tipos de procesamiento multi hilo.

Subprocesos múltiples de «grano grueso»

Best-Processors-CPUs-for-Streaming

El tipo más simple de subprocesos múltiples ocurre cuando un subproceso se ejecuta hasta que es bloqueado por un evento que normalmente crearía un bloqueo de latencia prolongada. Tal bloqueo podría ser una falta de caché que tiene que acceder a la memoria fuera del chip, lo que puede tomar cientos de ciclos de CPU para que los datos regresen. En lugar de esperar a que se resuelva el bloqueo, el procesador cambiará le ejecución a otro subproceso que estaba ya listo para ejecutarse, y solo cuando los datos del hilo anterior hayan llegado, se volverá a colocar en la lista de hilos listos para funcionar.

Conceptualmente, esto es similar a la multitarea cooperativa utilizada en los sistemas operativos a tiempo real, en la que las tareas renuncian voluntariamente al tiempo de ejecución del procesador cuando necesitan esperar a que suceda algún tipo de evento. Este tipo de subprocesos múltiples se conoce como «en bloque» o «de grano grueso».

Multihilo intercalado

El propósito de este tipo de procesamiento multi hilo es eliminar todos los bloqueos de dependencia de datos de la canalización de ejecución. Dado que un subproceso es relativamente independiente de otros, hay menos posibilidades de que una instrucción en una etapa de canalización necesite una salida de una instrucción anterior en el mismo canal; conceptualmente, esto es parecido a la multitarea preventiva que se usa en el sistema operativo, y una analogía sería que el intervalo de tiempo dado a cada subproceso activo es un ciclo de la CPU.

Ejecución multi hilo

Eso sí, este tipo de procesamiento multi hilo tiene una desventaja principal y es que cada etapa de canalización debe rastrear el ID del subproceso de la instrucción que está procesando, lo que ralentiza su rendimiento. Además, dado que hay más subprocesos que se ejecutan al mismo tiempo en la canalización, los recursos compartidos como la caché deben ser más grandes para evitar que se produzcan errores.

Multihilo paralelo

El tipo más avanzado de subprocesos múltiples se aplica a los procesadores conocidos como superescalares. Mientras que una CPU superescalar normal emite varias instrucciones desde un único subproceso en cada ciclo de CPU, en el procesamiento multi hilo simultáneo (SMT) un procesador superescalar puede emitir instrucciones desde varios subprocesos en cada uno de los ciclos. Al reconocer que cualquier subproceso tiene una cantidad limitada de paralelismo a nivel de instrucción, este tipo de subprocesos múltiples intenta explotar el paralelismo disponible en varios subprocesos para disminuir el desperdicio asociado a los espacios no utilizados.

Para distinguir los otros tipos de procesamiento multi hilo de SMT, el término «subprocesos múltiples temporales» se suele utilizar para indicar cuándo se pueden emitir instrucciones de un solo subproceso al mismo tiempo. Las implementaciones de este tipo incluyen DEC, EV8, la tecnología HyperThreading de Intel, IBM Power5, Sun Mycrosystems UltraSPARC T2, Cray XMT y las microarquitecturas Bulldozer y Zen de AMD.

¡Sé el primero en comentar!