En ocasiones no es posible explotar el paralelismo a nivel de instrucción dentro de un proceso debido a las dependencias que existen entre unas instrucciones y otras y que impiden su ejecución paralela. Una posible solución es el multithreading, que permite explotar el paralelismo entre instrucciones que pertenecen a diferentes hilos de ejecución o threads, y que por lo tanto es menos probable que dependan unas de otras (TLP o paralelismo a nivel de thread).
A diferencia de la mayor parte de las técnicas de ILP, el multithreading involucra directamente al sistema operativo y al compilador. Si una aplicación no está compilada para ejecutarse en diferentes threads y/o el SO no soporta este tipo de ejecución, no nos valdrá de nada que el procesador incorpore esta técnica.
El multihtreading consiste en ejecutar al mismo tiempo dos o más threads de un programa, permitiendo que cada uno de estos threads sea planificado de la manera más conveniente en el procesador, es decir, aprovechando al máximo todos los recursos disponibles. Es equivalente a tener dos o más procesadores lógicos o virtuales en lugar de uno sólo.
Hasta ahora la técnica de multithreading más utilizada ha sido el SMT (Symmetric MultiThreading) o Hyperthreading, patentado por Intel. Consiste en permitir que se emitan en el mismo ciclo instrucciones que pertenecen a distintos hilos de ejecución o threads. De momento todas las implementaciones han permitido ejecutar simultáneamente instrucciones de 2 threads diferentes, lo que permite aprovechar recursos que de otra manera no se utilizarían.
Físicamente sólo se tiene un procesador, aunque virtualmente es como si se tuvieran dos. Para que os hagáis una idea, con dos threads (dos procesadores virtuales), se puede incrementar el rendimiento del procesador en un 25 ó 30%, obviamente no en un 100%, ya que casi todos los recursos hardware son únicos y se comparten entre los dos threads.
aa