El modelo de ejecución SIMT ( instrucción única, múltiples subprocesos ) es un modelo de ejecución utilizado en computación paralela en el que se combina instrucción única, múltiples datos (SIMD) con subprocesos múltiples . Se diferencia del modelo SPMD en que todas las instrucciones de todos los "subprocesos" se ejecutan en sincronía. El modelo de ejecución SIMT se ha implementado en varias GPU y es relevante para computación de propósito general en unidades de procesamiento gráfico (GPGPU), por ejemplo, algunas supercomputadoras combinan CPU con GPU.
Los procesadores, digamos un número p de ellos, parecen ejecutar muchas más de p tareas. Esto se logra porque cada procesador tiene múltiples "hilos" (o "elementos de trabajo" o "secuencias de operaciones de carril SIMD"), que se ejecutan en sincronía y son análogos a los carriles SIMD . [1]
La forma más sencilla de entender SIMT es imaginar un sistema multi-núcleo, donde cada núcleo tiene su propio archivo de registros, sus propias ALU (tanto SIMD como escalares) y su propio caché de datos, pero que a diferencia de un sistema multi-núcleo estándar que tiene múltiples cachés de instrucciones y decodificadores independientes, así como múltiples registros de contador de programa independientes, las instrucciones se transmiten sincrónicamente a todos los núcleos SIMT desde una sola unidad con un solo caché de instrucciones y un solo decodificador de instrucciones que lee instrucciones usando un solo contador de programa.
La diferencia clave entre los carriles SIMT y SIMD es que cada uno de los núcleos SIMT puede tener un puntero de pila completamente diferente (y, por lo tanto, realizar cálculos en conjuntos de datos completamente diferentes), mientras que los carriles SIMD son simplemente parte de una ALU que no sabe nada sobre la memoria per se.
SIMT fue introducido por Nvidia en la microarquitectura de GPU Tesla con el chip G80. [2] [3] ATI Technologies , ahora AMD , lanzó un producto competidor un poco más tarde, el 14 de mayo de 2007, el chip GPU "R600" basado en TeraScale 1 .
Como el tiempo de acceso de todos los tipos de RAM más extendidos (por ejemplo, DDR SDRAM , GDDR SDRAM , XDR DRAM , etc.) sigue siendo relativamente alto, a los ingenieros se les ocurrió la idea de ocultar la latencia que inevitablemente se produce con cada acceso a la memoria. Estrictamente, la ocultación de la latencia es una característica de la programación sin sobrecarga implementada por las GPU modernas. Esto podría considerarse o no como una propiedad de "SIMT" en sí.
SIMT tiene como objetivo limitar la sobrecarga de obtención de instrucciones , [4] es decir, la latencia que viene con el acceso a la memoria, y se utiliza en las GPU modernas (como las de Nvidia y AMD ) en combinación con la "ocultación de latencia" para permitir una ejecución de alto rendimiento a pesar de la considerable latencia en las operaciones de acceso a la memoria. Aquí es donde el procesador está sobresuscrito con tareas de cálculo y puede cambiar rápidamente entre tareas cuando de lo contrario tendría que esperar a la memoria. Esta estrategia es comparable al multihilo en las CPU (que no debe confundirse con multinúcleo ). [5] Al igual que con SIMD, otro beneficio importante es el uso compartido de la lógica de control por muchos carriles de datos, lo que lleva a un aumento en la densidad computacional. Un bloque de lógica de control puede administrar N carriles de datos, en lugar de replicar la lógica de control N veces.
Una desventaja de la ejecución de SIMT es el hecho de que el flujo de control específico de cada subproceso se realiza mediante "enmascaramiento", lo que conduce a una mala utilización, ya que los subprocesos de un procesador siguen diferentes rutas de flujo de control. Por ejemplo, para manejar un bloque IF - ELSE en el que varios subprocesos de un procesador ejecutan diferentes rutas, todos los subprocesos deben procesar ambas rutas (ya que todos los subprocesos de un procesador siempre se ejecutan en sincronía), pero se utiliza el enmascaramiento para deshabilitar y habilitar los distintos subprocesos según corresponda. El enmascaramiento se evita cuando el flujo de control es coherente para los subprocesos de un procesador, es decir, todos siguen la misma ruta de ejecución. La estrategia de enmascaramiento es lo que distingue a SIMT del SIMD ordinario, y tiene el beneficio de una sincronización económica entre los subprocesos de un procesador. [6]