Reducción final en varios bloques
Combine las sumas parciales de cada bloque.
Reducción final en varios bloques es una lección gratuita de CUDA Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de CUDA Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de CUDA Academy incluye 4 lecciones en total.
Los bloques no pueden comunicarse
Una reducción dentro de un bloque es sencilla, pero los bloques se ejecutan de forma independiente y no pueden sincronizarse entre sí durante la ejecución del kernel. Por eso, un solo lanzamiento no puede sumarlo todo.
Cada bloque produce un parcial
Por tanto, cada bloque reduce su propio segmento a un número, una suma parcial, y la escribe en un pequeño array de salida indexado mediante blockIdx.
if (tid == 0)
out[blockIdx.x] = data[0];Ahora tiene menos valores
Con 1000 bloques, pasa de un millón de entradas a 1000 parciales. La parte difícil ya está hecha; solo queda combinar un array pequeño.
Estrategia uno: vuelva a lanzar
La forma más sencilla de terminar es realizar un segundo lanzamiento del mismo kernel sobre los parciales. Repita el proceso hasta que solo quede un valor.
Recursión hasta obtener uno
Cada pasada reduce el tamaño del array según el tamaño del bloque. Unos pocos lanzamientos recursivos reducen millones de valores a una única suma final.
Estrategia dos: operaciones atómicas
Como alternativa, el hilo 0 de cada bloque puede sumar su parcial directamente a un único total global mediante atomicAdd, evitando un segundo kernel.
if (tid == 0)
atomicAdd(total, data[0]);El compromiso de las operaciones atómicas
Las operaciones atómicas son sencillas y solo requieren un lanzamiento, pero muchos bloques que compiten por la misma dirección pueden serializarse. Con pocos parciales, normalmente funcionan bien.
Estrategia tres: grid-stride
Un bucle grid-stride permite que cada hilo sume primero muchos elementos en un registro, de modo que se necesiten muchos menos bloques antes del paso final.
for (int i = gid; i < n; i += gridDim.x * blockDim.x)
sum += in[i];Menos bloques, menos sobrecarga
Realizar más trabajo por hilo al principio implica menos parciales y menos lanzamientos. Esto suele ser mejor que crear un hilo por elemento.
Ponga a cero el total primero
Si utiliza operaciones atómicas, recuerde poner a cero el total global antes del lanzamiento; de lo contrario, la suma comenzará con datos residuales de esa memoria.
Elija según el tamaño del problema
Las entradas pequeñas aprovechan la sencillez de las operaciones atómicas; las entradas enormes favorecen un diseño de dos pasadas o grid-stride. Mida el rendimiento con sus datos para elegir.
Comprobación rápida
Reflexione sobre por qué un único lanzamiento de kernel no puede sumar directamente todo el array.
Resumen
Cada bloque produce una suma parcial y después usted las combina con un segundo lanzamiento, operaciones atómicas o grid-stride. Ahora puede reducir arrays de cualquier tamaño. 🏁
Aprende C++ con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 30
- Lecciones
- 120
Preguntas frecuentes
¿La lección «Reducción final en varios bloques» es gratis?
Sí — el texto completo de «Reducción final en varios bloques» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de CUDA Academy, actualiza a CoddyKit PRO. El curso de CUDA Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Reducción final en varios bloques»?
Combine las sumas parciales de cada bloque. Practicas CUDA Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar CUDA Academy?
No se requiere experiencia previa. CUDA Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Reducción final en varios bloques»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de CUDA Academy?
Sí. Cada lección de CUDA Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- La idea del árbol de reducción
- Eliminar la divergencia de warps
- Direccionamiento secuencial
- Reducción final en varios bloques