CUDA Academy · Lección

Desenrollado de bucles con #pragma unroll

Reduzca la sobrecarga de los bucles y exponga el ILP.

Lección 2 de 413 pasos

Desenrollado de bucles con #pragma unroll es una lección gratuita de CUDA Academy en CoddyKit. Esta es la lección 2 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 bucles tienen costes ocultos

Cada iteración del bucle dedica trabajo al contador, la comparación y el salto. Esta gestión se denomina sobrecarga del bucle y se acumula en los bucles internos críticos.

Qué hace el desenrollado

El desenrollado de bucles copia el cuerpo varias veces por iteración para que el bucle se ejecute menos veces. Realiza el mismo trabajo con menos conteos y saltos.

for (int i = 0; i < n; i += 2) {
    out[i]     = in[i]     * 2;
    out[i + 1] = in[i + 1] * 2;
}

Deje que lo haga el compilador

CUDA le ofrece una indicación para que no tenga que copiar el código manualmente. Coloque #pragma unroll justo antes de un bucle y el compilador lo desenrollará por usted.

#pragma unroll
for (int i = 0; i < 4; i++)
    sum += a[i];

Elija un factor específico

Puede solicitar una cantidad exacta escribiendo un número después de la directiva. #pragma unroll 4 desenrolla el bucle de cuatro iteraciones en cuatro.

#pragma unroll 4
for (int i = 0; i < n; i++)
    acc += w[i] * x[i];

Desactivar el desenrollado

A veces, desenrollar por completo aumenta demasiado el código o consume registros. Escribir #pragma unroll 1 indica al compilador que deje el bucle sin desenrollar, exactamente como está escrito.

#pragma unroll 1
for (int i = 0; i < n; i++)
    process(i);

Los recuentos de iteraciones constantes ayudan

El desenrollado funciona mejor cuando el número de iteraciones se conoce en tiempo de compilación. Un recuento de iteraciones fijo permite al compilador expandir por completo el bucle en código lineal.

El desenrollado expone el ILP

Las iteraciones copiadas a menudo no tienen dependencias entre sí. Esto proporciona al planificador más instrucciones independientes que solapar y oculta la latencia sin coste adicional.

Menos saltos, ruta más rápida

Con el bucle desenrollado, el hardware comprueba la condición de salida con menor frecuencia. Menos saltos producen un flujo de instrucciones más uniforme y predecible.

La contrapartida de los registros

Más valores activos por iteración implican un mayor uso de registros. Un desenrollado agresivo puede provocar spills de registros y reducir la ocupación, por lo que no siempre resulta beneficioso.

El tamaño del código también crece

Cada copia desenrollada aumenta el tamaño del kernel. Un código más grande puede ejercer presión sobre la caché de instrucciones, por lo que desenrollar por completo bucles enormes puede ser contraproducente en el hardware real.

Mida antes de confiar

El desenrollado es una sugerencia, no magia. Deje siempre que el profiler confirme que el factor elegido realmente acelera su kernel y su GPU.

Comprobación rápida

Quiere que el compilador desenrolle por completo un bucle pequeño y fijo. ¿Qué escribe?

Recapitulación: cambie conteo por velocidad

Ha aprendido que #pragma unroll reduce la sobrecarga del bucle y expone ILP, pero debe vigilar el coste en registros y tamaño del código. Mida cada factor para asegurarse. 🧩

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 «Desenrollado de bucles con #pragma unroll» es gratis?

Sí — el texto completo de «Desenrollado de bucles con #pragma unroll» 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 «Desenrollado de bucles con #pragma unroll»?

Reduzca la sobrecarga de los bucles y exponga el ILP. 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 2 de 4.

¿Cuánto tiempo toma la lección «Desenrollado de bucles con #pragma unroll»?

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. Paralelismo a nivel de instrucción
  2. Desenrollado de bucles con #pragma unroll
  3. Cargas vectorizadas con float4
  4. Presión de registros y derrames
← Volver a CUDA Academy