0Pricing
CUDA Academy · Lección

Memoria compartida dinámica

Defina el tamaño de la memoria compartida al lanzar el kernel.

Memoria compartida dinámica 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.

Cuando aún no se conoce el tamaño

A veces, el tamaño del array compartido depende de un valor de tiempo de ejecución, por lo que no puede establecerlo de forma fija. CUDA resuelve esto mediante la memoria compartida dinámica.

La declaración extern

Se declara con extern __shared__ y corchetes vacíos. No se indica ningún tamaño en el código, así que el compilador lo deja abierto.

extern __shared__ float sdata[];

El tamaño se establece al lanzar el kernel

Debe pasar la cantidad de bytes como el tercer parámetro de lanzamiento, entre la cantidad de hilos y los corchetes de cierre. Así se establece el tamaño durante la ejecución.

kern<<<blocks, threads, n * sizeof(float)>>>();

Siempre se expresa en bytes

Un error clásico: ese tercer argumento indica el tamaño en bytes, no en elementos. Multiplique siempre la cantidad por sizeof para obtener el valor correcto.

El valor predeterminado es cero bytes

Si omite el tercer argumento, CUDA reserva cero bytes de memoria compartida dinámica. Leer sdata provoca un comportamiento indefinido, así que no lo olvide.

Memoria estática y dinámica juntas

Puede usar ambos tipos en un mismo kernel. Los arrays estáticos conservan tamaños fijos, mientras que el bloque dinámico se adapta al argumento de lanzamiento.

Un búfer, muchos arrays

La memoria compartida dinámica le proporciona un único búfer plano. Para almacenar varios arrays, debe dividirlo usted mismo mediante desplazamientos de puntero. 🔪

Dividir mediante desplazamientos

Haga que un segundo array apunte a una posición intermedia del búfer. Solo debe asegurarse de alinear cada parte para que un float nunca comience a mitad de una palabra.

extern __shared__ float buf[];
float* a = buf;
float* b = &buf[blockDim.x];

Por qué usar memoria dinámica

Permite que un único kernel compilado admita muchos tamaños de tile. Puede ajustar el tamaño de la memoria compartida en cada lanzamiento sin recompilar para cada caso.

Tenga en cuenta el límite del hardware

Aun así, no puede superar el máximo por bloque. Si solicita demasiados bytes al lanzar el kernel, simplemente no se iniciará.

Activar asignaciones grandes

Para superar el límite predeterminado en las GPU más recientes, debe optar explícitamente mediante cudaFuncSetAttribute antes del lanzamiento. De lo contrario, se rechazarán las solicitudes grandes.

Comprobación rápida

Comprobemos cómo se establece el tamaño de la memoria compartida dinámica.

Repaso

Ha aprendido que los arrays extern __shared__ obtienen su tamaño en bytes durante el lanzamiento, que pueden dividirse en varios arrays y que respetan el límite por bloque. ¡Curso completado! 🎉

Preguntas frecuentes

¿La lección «Memoria compartida dinámica» es gratis?

Sí — el texto completo de «Memoria compartida dinámica» 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 «Memoria compartida dinámica»?

Defina el tamaño de la memoria compartida al lanzar el kernel. 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 «Memoria compartida dinámica»?

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. Declarar arrays __shared__
  2. Sincronizar con __syncthreads
  3. Evitar conflictos de bancos
  4. Memoria compartida dinámica
← Volver a CUDA Academy