# Rúbrica · Evaluación de código fuente OpenMP — Módulo 2 (EC2)

**Instrumento del programa:** Evaluación de código fuente (rúbrica) (§18.2)
**Evidencia:** Conjunto de programas OpenMP que implementan patrones de paralelización (§16)
**Elemento de competencia:** EC2 · **Módulo:** M2 · **Semanas:** 4–5 · **Ponderación:** parte de EC2 (24 %)

---

## 1. Qué se entrega

Repositorio Git con la **serie de cinco programas OpenMP de complejidad creciente** que pide el
apartado 20.2 del programa, más un documento que los describa.

| N° | Programa | Qué debe demostrar |
|---|---|---|
| 1 | Suma de dos vectores | `parallel for` básico, sin datos compartidos escritos |
| 2 | Búsqueda lineal con conteo de apariciones | `reduction(+:contador)` |
| 3 | Reducción de máximo | `reduction(max:...)` y comparación con `atomic` |
| 4 | Aplicación de una función sobre una matriz | `collapse`, cuidado con la localidad de memoria |
| 5 | Bucle con coste irregular | Elección razonada de `schedule` |

**Requisitos comunes a los cinco:**

1. Compilan sin errores con `gcc -O2 -fopenmp -Wall`.
2. El resultado numérico coincide con la versión secuencial, verificado numéricamente.
3. Verifican el número de hilos con `omp_get_num_threads()`.
4. Llevan la cabecera de identificación personal (glosario, apartado 4.1).
5. Cada uno es ejecutable de forma independiente y acepta el tamaño por línea de órdenes.

---

## 2. Criterios de evaluación

| # | Criterio | Descripción del desempeño esperado | Puntaje |
|---|---|---|---|
| 1 | Corrección numérica | Los cinco programas producen exactamente el mismo resultado que la versión secuencial | 25 |
| 2 | Uso correcto de directivas | `parallel for` bien aplicado; `collapse` solo cuando el bucle es paralelizable en bloque | 20 |
| 3 | Sincronización | Ninguna condición de carrera. `reduction` bien usado; `atomic` y `critical` solo cuando aportan | 20 |
| 4 | Ámbitos de variables | `private`, `firstprivate`, `lastprivate` y `shared` declarados de forma explícita donde hacen falta | 15 |
| 5 | Calidad del código | Legible, comentado en los puntos críticos, sin variables globales ni memoria sin liberar | 10 |
| 6 | Protocolo de entrega | Repositorio público, 3 o más commits con Conventional Commits, README con instrucciones | 10 |
| | **Total** | | **100** |

---

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

| Criterio | Destacado (4) | Competente (3) | En proceso (2) | No logrado (1) |
|---|---|---|---|---|
| **1. Corrección** | Los 5 coinciden con la secuencia, con verificación numérica explícita | Todos coinciden; la verificación es informal | 1 o 2 programas con resultado distinto | La mayoría no coincide |
| **2. Directivas** | Usa la directiva más adecuada en cada caso y justifica el criterio de elección | Usa directivas válidas, alguna suboptimal | Paraleliza de forma mecánica sin criterio | Directivas mal usadas o ausentes |
| **3. Sincronización** | Sin carreras; elige `reduction` sobre `critical` y explica por qué | Sin carreras; `reduction` correctamente aplicado | Sin carreras pero con sincronización innecesaria | Presenta condiciones de carrera |
| **4. Ámbitos** | Declara los ámbitos de forma explícita y correcta en todos los casos | Correcto en la mayoría de los casos | Ámbitos implícitos que funcionan por casualidad | Ámbitos incorrectos |
| **5. Calidad** | Código limpio, comentado donde importa, sin fugas ni estado global | Limpio con algún comentario de más | Confuso o con fugas de memoria | Ilegible o descuadrado |
| **6. Entrega** | Repositorio limpio, commits significativos, README reproducible | Repositorio con los commits mínimos | Commits múltiples pero sin convención | Sin repositorio |

*Cada criterio se convierte en puntos según el nivel: 4 = 100 %, 3 = 75 %, 2 = 50 %, 1 = 25 % del peso
que tiene en la tabla 2.*

---

## 4. Errores frecuentes y penalizaciones

| Error | Por qué importa | Penalización |
|---|---|---|
| Compilar sin `-fopenmp` | El programa funciona pero no paraleliza, sin ningún aviso | −15 puntos |
| Usar `critical` donde bastaba `reduction` | Serializa el programa y contradice el objetivo del módulo | −10 puntos |
| `collapse` sobre un bucle con dependencia interna | Resultado incorrecto o comportamiento no definido | −15 puntos |
| Variable compartida no declarada | Puede funcionar en una ejecución y fallar en otra | −10 puntos |
| No verificar el resultado frente a la versión secuencial | Impide detectar errores | −10 puntos |
| `for` fuera de una región `parallel` | No hace nada; el código aparenta paralelismo | −15 puntos |

---

## 5. Nota mínima

60 %. Un programa que no compile no se evalúa, y su nota es cero para ese entregable.

---

*Instrumento derivado de `00-marco/programa-docente-TEL420-V2.docx`, apartados 16, 18.2 y 18.3.*
