Aunque la versión eficiente en el trabajo requiere más pasos, esto se compensa con el hecho de que el número de subprocesos activos disminuye más rápido y el número total de subprocesos activos en todas las iteraciones es considerablemente menor. Si un warp no tiene hilos activos durante una iteración, ese warp simplemente saltará a la siguiente barrera y se suspenderá, permitiendo que se ejecuten otros warps. Por lo tanto, tener menos deformaciones activas a menudo puede dar sus frutos en el tiempo de ejecución. (Implícito en esto es que el código de la GPU debe diseñarse de tal manera que los hilos activos se agrupen en la menor cantidad de deformaciones posible; no desea que estén dispersos escasamente, ya que incluso un hilo activo forzará toda la deformación mantenerse activo)
Considere la cantidad de hilos activos en el algoritmo ingenuo. Mirando la Figura 2 en el artículo, puede ver que todos los hilos están activos, excepto los primeros 2 k en la iteración k . Entonces, con N hilos, el número de hilos activos es como N - 2 k . Por ejemplo, con N = 1024, el número de hilos activos por iteración es:
1023, 1022, 1020, 1016, 1008, 992, 960, 896, 768, 512
Si convierto esto en un número de deformaciones activas (dividiendo entre 32 y redondeando), obtengo:
32, 32, 32, 32, 32, 31, 30, 28, 24, 16
por una suma de 289. Por otro lado, el algoritmo de trabajo eficiente comienza con la mitad de los subprocesos, luego reduce a la mitad el número de activos en cada iteración hasta que se reduce a 1, luego comienza a duplicarse hasta que vuelve a subir a la mitad del tamaño de la matriz nuevamente:
512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512
Convirtiendo esto en warps activos:
16, 8, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 8, 16
La suma es 71, que es solo una cuarta parte. Por lo tanto, puede ver que en el transcurso de toda la operación, el número de deformaciones activas es mucho menor con el algoritmo de trabajo eficiente. (De hecho, para una ejecución larga en el medio solo hay un puñado de deformaciones activas, lo que significa que la mayor parte del chip no está ocupado. Si hay tareas de cálculo adicionales en ejecución, por ejemplo, desde otras secuencias CUDA, podrían expandirse para llenar eso espacio desocupado.)