# Rúbrica · Evaluación de Código Fuente MPI — Módulo 3 (EC3)

**Instrumento del programa:** Evaluación de código MPI (rúbrica) (§18.2)  
**Evidencia:** Aplicaciones MPI punto a punto y colectiva (§16)  
**Elemento de competencia:** EC3 · **Módulo:** M3 · **Semanas:** 7–8 · **Ponderación:** 40 % de EC3 (11.2 % de la asignatura)  

---

## 1. Qué se entrega

Repositorio Git con un conjunto de **programas MPI en C** que demuestran el dominio de la comunicación en memoria distribuida, acompañados de un `README.md` con instrucciones de compilación y ejecución mediante `mpirun`:

| N° | Programa | Requisitos técnicos clave |
|---|---|---|
| 1 | Comunicación en anillo (*token passing*) | Paso de mensajes punto a punto bloqueante (`MPI_Send` / `MPI_Recv`), cierre cíclico de anillo sin interbloqueos. |
| 2 | Anillo no bloqueante con solapamiento | Uso de `MPI_Isend` e `MPI_Irecv` con `MPI_Wait`, solapando cómputo aritmético local durante la transmisión. |
| 3 | Monte Carlo / Pi distribuido | Uso de `MPI_Bcast` para parámetros y `MPI_Reduce` (`MPI_SUM`) para agregación; semillas aleatorias disjuntas por rango. |
| 4 | Multiplicación de matrices distribuida | Particionamiento de filas de matriz con `MPI_Scatter`, difusión de la matriz completa con `MPI_Bcast`, y recolección de resultados con `MPI_Gather`. |

**Requisitos comunes obligatorios:**
1. Compilan sin advertencias con `mpicc -O2 -Wall`.
2. Verifican matemáticamente la coincidencia del resultado frente a una versión secuencial de referencia ($T_1$).
3. Manejan adecuadamente cualquier número de procesos $p \ge 2$.
4. Liberan recursos y buffers antes de invocar `MPI_Finalize()`.
5. Incluyen cabecera de autoría con datos del estudiante y fecha.

---

## 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 con la solución secuencial para diversos tamaños de problema. | 25 |
| 2 | Uso de primitivas punto a punto | Selección justificada entre bloqueante y no bloqueante; prevención total de condiciones de *deadlock*. | 20 |
| 3 | Eficiencia en comunicaciones colectivas | Uso correcto de `Bcast`, `Scatter`, `Gather` y `Reduce` en lugar de cadenas ineficientes de envíos individuales. | 20 |
| 4 | Particionamiento y balance de carga | Distribución equitativa de datos entre los procesos, gestionando restos de división ($N \pmod p$). | 15 |
| 5 | Modularidad y calidad de código | Código estructurado, libre de fugas de memoria, con medición rigurosa usando `MPI_Wtime()`. | 10 |
| 6 | Protocolo de entrega y reproducibilidad | Repositorio estructurado, historial de commits con estándar convencional y `Makefile` o script de compilación. | 10 |
| | **Total** | | **100** |

---

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

| Criterio | Destacado (4) | Competente (3) | En proceso (2) | No logrado (1) |
|---|---|---|---|---|
| **1. Corrección** | Todos los programas coinciden exactamente con la versión secuencial con verificación automática | Coinciden en su totalidad; verificación manual o informal | Discrepancias numéricas en casos borde o con $p$ impar | Resultados erróneos o cálculo no convergente |
| **2. Punto a punto** | Implementación impecable; demuestra solapamiento efectivo con `MPI_Isend`/`Irecv` sin deadlocks | Comunicaciones correctas sin bloqueos; solapamiento básico | Funciona pero presenta riesgo latente de deadlock en mensajes grandes | Código se bloquea por interbloqueo (*deadlock*) |
| **3. Colectivas** | Uso óptimo de operaciones colectivas con tipos de datos adecuados y árbol logarítmico aprovechado | Colectivas bien empleadas con detalles menores en tipos o buffers | Reemplaza colectivas por bucles secuenciales de `MPI_Send` | Invocación incorrecta que congela la ejecución |
| **4. Partición** | Particionamiento generalizado que soporta tamaños no múltiplos de $p$ (`Scatterv`/`Gatherv`) | Particionamiento correcto asumiendo que $N$ es múltiplo de $p$ | Partición desbalanceada que sobrecarga al rango 0 | Partición errónea con pérdida o solapamiento de datos |
| **5. Calidad** | Código modular, limpio, excelente documentación y uso preciso de `MPI_Wtime` | Código ordenado y legible con comentarios suficientes | Código desordenado, sin liberación de recursos o variables globales | Código ilegible, sin estructurar ni medir tiempos |
| **6. Entrega** | Repositorio impecable, script automatizado de compilación y prueba reproducible | Repositorio ordenado con instrucciones claras de ejecución | Repositorio incompleto o pasos manuales engorrosos | Entrega fuera de formato o sin instrucciones |
