Multithreading (arquitectura de ordenadores)

Multithreading intercalado/temporalEditar

Artículo principal: Multithreading temporal

Multihilo de grano gruesoEditar

El tipo más simple de multithreading ocurre cuando un hilo se ejecuta hasta que es bloqueado por un evento que normalmente crearía un stall de larga latencia. Este bloqueo puede ser una pérdida de caché que tiene que acceder a la memoria fuera del chip, lo que puede llevar cientos de ciclos de CPU para que los datos vuelvan. En lugar de esperar a que se resuelva el bloqueo, un procesador con hilos cambiaría la ejecución a otro hilo que estuviera listo para ejecutarse. Sólo cuando los datos del hilo anterior hubieran llegado, el hilo anterior volvería a la lista de hilos listos para ejecutarse.

Por ejemplo:

  1. Ciclo i: se emite la instrucción j del hilo A.
  2. Ciclo i + 1: se emite la instrucción j + 1 del hilo A.
  3. Ciclo i + 2: se emite la instrucción j + 2 del hilo A, que es una instrucción de carga que falla en todas las cachés.
  4. Ciclo i + 3: se invoca al programador de hilos, que pasa al hilo B.
  5. Ciclo i + 4: se emite la instrucción k del hilo B.
  6. Ciclo i + 5: se emite la instrucción k + 1 del hilo B.
  7. Conceptualmente, es similar a la multitarea cooperativa utilizada en los sistemas operativos en tiempo real, en la que las tareas ceden voluntariamente tiempo de ejecución cuando necesitan esperar algún tipo de evento. Este tipo de multithreading se conoce como multithreading de bloque, cooperativo o de grano grueso.

    El objetivo del soporte hardware de multithreading es permitir el cambio rápido entre un hilo bloqueado y otro hilo listo para ejecutarse. Para lograr este objetivo, el coste del hardware es replicar los registros visibles del programa, así como algunos registros de control del procesador (como el contador de programa). Pasar de un hilo a otro significa que el hardware pasa de utilizar un conjunto de registros a otro; para cambiar de forma eficiente entre hilos activos, cada hilo activo debe tener su propio conjunto de registros. Por ejemplo, para cambiar rápidamente entre dos hilos, el hardware de registro debe instanciarse dos veces.

    El soporte de hardware adicional para el multihilo permite que el cambio de hilo se realice en un ciclo de la CPU, lo que aporta mejoras de rendimiento. Además, el hardware adicional permite que cada hilo se comporte como si se ejecutara solo y no compartiera ningún recurso de hardware con otros hilos, lo que minimiza la cantidad de cambios de software necesarios dentro de la aplicación y el sistema operativo para soportar el multihilo.

    Muchas familias de microcontroladores y procesadores embebidos tienen múltiples bancos de registros para permitir un rápido cambio de contexto para las interrupciones. Tales esquemas pueden considerarse un tipo de multihilo en bloque entre el hilo del programa de usuario y los hilos de interrupción.

    Multihilo intercaladoEditar

    Artículo principal: Procesador de barril

    El propósito del multithreading intercalado es eliminar todos los estancamientos de dependencia de datos del pipeline de ejecución. Dado que un hilo es relativamente independiente de otros hilos, hay menos posibilidades de que una instrucción en una etapa de pipelining necesite una salida de una instrucción más antigua en el pipeline. Conceptualmente, es similar a la multitarea preventiva utilizada en los sistemas operativos; una analogía sería que la porción de tiempo dada a cada hilo activo es un ciclo de CPU.

    Por ejemplo:

    1. Ciclo i + 1: se emite una instrucción del hilo B.
    2. Ciclo i + 2: se emite una instrucción del hilo C.
    3. Este tipo de multihilo se denominó por primera vez procesamiento en barril, en el que las duelas de un barril representan las etapas del pipeline y sus hilos de ejecución. El multithreading intercalado, preemptive, fine-grained o time-sliced es una terminología más moderna.

      Además de los costes de hardware comentados en el multithreading de tipo bloque, el multithreading intercalado tiene el coste adicional de que cada etapa del pipeline rastrea el ID del hilo de la instrucción que está procesando. Además, dado que hay más hilos que se ejecutan de forma concurrente en el pipeline, los recursos compartidos, como las cachés y los TLB, deben ser mayores para evitar el thrashing entre los diferentes hilos.

      Multihilo simultáneoEditar

      Artículo principal: Multithreading simultáneo

      El tipo más avanzado de multithreading se aplica a los procesadores superescalares. Mientras que un procesador superescalar normal emite múltiples instrucciones desde un único hilo en cada ciclo de la CPU, en el multihilo simultáneo (SMT) un procesador superescalar puede emitir instrucciones desde múltiples hilos en cada ciclo de la CPU. Reconociendo que cualquier hilo individual tiene una cantidad limitada de paralelismo a nivel de instrucción, este tipo de multihilo intenta explotar el paralelismo disponible a través de múltiples hilos para disminuir el desperdicio asociado con ranuras de emisión no utilizadas.

      Por ejemplo:

      1. Ciclo i: las instrucciones j y j + 1 del hilo A y la instrucción k del hilo B se emiten simultáneamente.
      2. Ciclo i + 1: la instrucción j + 2 del hilo A, la instrucción k + 1 del hilo B y la instrucción m del hilo C se emiten simultáneamente.
      3. Ciclo i + 2: la instrucción j + 3 del hilo A y las instrucciones m + 1 y m + 2 del hilo C se emiten simultáneamente.
      4. Para distinguir los otros tipos de multihilo del SMT, se utiliza el término «multihilo temporal» para denotar cuando las instrucciones de un solo hilo pueden emitirse a la vez.

        Además de los costes de hardware comentados para el multithreading intercalado, SMT tiene el coste adicional de que cada etapa del pipeline rastrea el ID del hilo de cada instrucción que se procesa. Una vez más, los recursos compartidos, como las cachés y los TLB, tienen que ser dimensionados para el gran número de hilos activos que se procesan.

        Las implementaciones incluyen DEC (más tarde Compaq) EV8 (no se ha completado), Intel Hyper-Threading Technology, IBM POWER5, Sun Microsystems UltraSPARC T2, Cray XMT, y AMD Bulldozer y microarquitecturas Zen.