CUDA Academy · Lección

Reducción final en varios bloques

Combine las sumas parciales de cada bloque.

Lección 4 de 413 pasos

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. 🏁

Gratis para empezar

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

  1. La idea del árbol de reducción
  2. Eliminar la divergencia de warps
  3. Direccionamiento secuencial
  4. Reducción final en varios bloques
← Volver a CUDA Academy