# Rúbrica · Evaluación de Código Fuente CUDA — Módulo 4 (EC4)

**Instrumento del programa:** Evaluación de código CUDA (rúbrica) (§18.2)  
**Evidencia:** Kernels CUDA de complejidad creciente (§16)  
**Elemento de competencia:** EC4 · **Módulo:** M4 · **Semanas:** 11–12 · **Ponderación:** 40 % de EC4 (8.8 % de la asignatura)  

---

## 1. Qué se entrega

Repositorio de código Git con la **serie de kernels CUDA en C/C++** desarrollados para la resolución eficiente de problemas computacionales masivos, acompañado de un `Makefile` y `README.md` que detalle las opciones de compilación con `nvcc`.

**Programas requeridos:**
1. Suma de vectores y producto escalar con control de dimensiones de grilla y bloques unidimensionales.
2. Kernel 2D para convolución / filtrado espacial de matrices de datos.
3. Reducción paralela de suma acumulada implementada con memoria compartida (`__shared__`) y optimización para evitar divergencia de warps.
4. Multiplicación de matrices por bloques de teselas (*Tiled GEMM*) utilizando sincronización explícita con `__syncthreads()`.

---

## 2. Criterios de evaluación (100 puntos)

| # | Criterio | Descripción del desempeño esperado | Puntaje |
|---|---|---|---|
| 1 | Corrección matemática y consistencia | Coincidencia numérica exacta de los resultados del kernel frente al algoritmo de referencia en CPU. | 25 |
| 2 | Configuración de grillas y bloques | Dimensionamiento adecuado de `gridDim` y `blockDim` con protección de límites de memoria (`idx < N`). | 20 |
| 3 | Gestión de memoria y transferencias | Asignación y liberación correcta con `cudaMalloc`/`cudaFree`; comprobación sistemática de errores de la API CUDA. | 20 |
| 4 | Uso eficiente de memoria compartida | Uso justificado de `__shared__` para reutilización de datos y sincronización libre de carreras con `__syncthreads()`. | 20 |
| 5 | Calidad del código y reproducibilidad | Modularidad, comentarios explicativos en los kernels y scripts de compilación listos para ejecutar. | 15 |
| | **Total** | | **100** |

---

## 3. Rúbrica analítica por niveles

| Criterio | Destacado (4) | Competente (3) | En proceso (2) | No logrado (1) |
|---|---|---|---|---|
| **1. Corrección** | Validación automática frente a CPU en todos los kernels con tolerancia estricta | Coincide numéricamente; verificación manual | Discrepancias menores por precisión de float | Resultados incorrectos o divergentes |
| **2. Grillas/Bloques** | Configuración óptima de 128/256 hilos por bloque con manejo perfecto de restos de grilla | Configuración adecuada con guarda de límites | Límites de vector no verificados causando lecturas fuera de rango | Configuración errónea que provoca fallos de kernel |
| **3. Memoria/API** | Manejo impecable de punteros en device, verificación de errores en cada llamada | Memoria bien gestionada con verificación básica | Fugas de memoria en device o comprobación nula de errores | Fallos de segmentación o punteros inválidos |
| **4. Memoria Compartida** | Reducción libre de divergencia de warps y sincronización impecable | Uso correcto de shared memory con leve divergencia | Uso de shared memory con riesgo de condiciones de carrera | No utiliza shared memory o uso erróneo |
| **5. Calidad** | Repositorio estructurado, código limpio y medición precisa con eventos CUDA | Código legible y documentado con Makefile funcional | Código desordenado sin Makefile automatizado | Código confuso o no reproducible |
