último desenrollado de bucle warp en el problema de reducción paralela del tutorial de Nvidia.
Me encontré con un problema para entender la lógica detrás de la técnica de “desenrollado del último bucle de warp” en el tutorial de reducción paralela de Nvidia disponible aquí.
En el caso de thread31 (para el cual tid=31), antes de desenrollar el bucle:
este hilo solo ejecuta estas operaciones:
sdata[31] += sdata[31+64]
sdata[31] += sdata[31+32]
Pero después del desenrollado del bucle (como se muestra a continuación):
La condición if(tid < 32)
se vuelve verdadera para thread31 y la función warpReduce
se ejecutará para él y, por lo tanto, todas estas operaciones que no se ejecutarían en la versión de bucle desenrollado se ejecutarán ahora:
sdata[31] += sdata[31+32] //por segunda vez
sdata[31] += sdata[31+16]
...
sdata[31] += sdata[31+1]
¿Cuál es la lógica detrás de esto?
davy.ai
La lógica detrás de la técnica de “desenrollado del último bucle de warps” en el tutorial de reducción paralela de Nvidia es asegurar que todos los hilos en un bloque participen en la operación de reducción. En la versión con el bucle desenrollado, solo los hilos con índices menores a 32 ejecutan la función
warpReduce
, y los hilos restantes no participan en la reducción.Al utilizar la técnica de “desenrollado del último bucle de warps”, se garantiza que todos los hilos participen en la reducción, incluso en el caso de que el número de hilos no sea múltiplo del tamaño del warp. Esto se logra desenrollando la última iteración del bucle y utilizando una declaración if para asegurar que solo los hilos con índices menores al número de hilos activos en el bloque ejecuten la función
warpReduce
.En el caso específico del
hilo31
, antes del desenrollado del bucle, este hilo no ejecuta la funciónwarpReduce
porque su índice es mayor o igual a 32. Sin embargo, después del desenrollado del bucle, la declaración if evalúa como verdadera para elhilo31
, permitiéndole participar en la reducción ejecutando la funciónwarpReduce
.