Subprocesamiento múltiple especulativo


La especulación a nivel de subprocesos (TLS), también conocida como subprocesos múltiples especulativos o paralelización especulativa, [1] es una técnica para ejecutar especulativamente una sección de código informático que se anticipa que se ejecutará más adelante en paralelo con la ejecución normal en un subproceso independiente separado . Tal hilo especulativo puede necesitar hacer suposiciones sobre los valores de las variables de entrada. Si estos resultan ser inválidos, entonces las partes del hilo especulativo que se basan en estas variables de entrada deberán descartarse y aplastarse. Si las suposiciones son correctas, el programa puede completarse en menos tiempo, siempre que el subproceso se haya podido programar de manera eficiente.

TLS extrae hilos del código serial y los ejecuta especulativamente en paralelo con un hilo seguro. El subproceso especulativo deberá descartarse o volver a ejecutarse si sus suposiciones sobre el estado de entrada resultan ser inválidas. Es una técnica de paralelización dinámica (en tiempo de ejecución) que puede descubrir el paralelismo que las técnicas de paralelización estáticas (en tiempo de compilación) pueden no explotar porque en el momento de la compilación no se puede garantizar la independencia de subprocesos. Para que la técnica logre el objetivo de reducir el tiempo de ejecución general, debe haber un recurso de CPU disponible que se pueda ejecutar de manera eficiente en paralelo con el subproceso seguro principal. [2]

TLS asume de manera optimista que una parte determinada del código (generalmente bucles) se puede ejecutar de forma segura en paralelo. Para hacerlo, divide el espacio de iteración en fragmentos que se ejecutan en paralelo por diferentes hilos. Un monitor de hardware o software asegura que se mantenga la semántica secuencial (en otras palabras, que la ejecución progrese como si el ciclo se ejecutara secuencialmente). Si aparece una violación de dependencia, el marco especulativo puede optar por detener toda la ejecución paralela y reiniciarla; para detener y reiniciar los subprocesos ofensivos y todos sus sucesores, para que se alimenten con los datos correctos; o para detener exclusivamente el subproceso infractor y sus sucesores que han consumido datos incorrectos del mismo. [3]