---
titulo: "Práctica P3b: Taller de operaciones colectivas y patrones distribuidos"
modulo: M3
ec: EC3
contenido: "3.4, 3.5"
semanas: "8"
horas: 4
tipo: "Taller en laboratorio"
asignatura: "Sistemas Paralelos"
sigla: TEL-420
docente: "Ing. Elias Cassal Baldiviezo"
institucion: "Universidad Autónoma Juan Misael Saracho — Facultad de Ciencias Integradas de Yacuiba / F.I.R.N.T."
---

# P3b · Taller de operaciones colectivas y cálculo paralelo distribuido

**Contenido del programa:** §20.3 · contenidos 3.4 y 3.5  
**Horas de laboratorio:** 4 · **Modalidad:** individual  

---

## 1. Objetivo

Diseñar e implementar algoritmos paralelos en memoria distribuida empleando las rutinas de comunicación colectiva de MPI (`MPI_Bcast`, `MPI_Scatter`, `MPI_Gather`, `MPI_Reduce` y `MPI_Allreduce`), aplicándolas al cálculo de Pi mediante el método estocástico de Monte Carlo y a la multiplicación de matrices dividida por bloques de filas, comparando la aceleración y la complejidad teórica de comunicación frente a bucles punto a punto.

---

## 2. Requisitos previos

- Haber estudiado los apartados 3.4 y 3.5 del contenido del módulo 3.
- Comprender la diferencia entre operaciones uno-a-todos, todos-a-uno y todos-a-todos.

---

## 3. Ejercicios guiados

### Ejercicio 1: Monte Carlo distribuido para aproximación de Pi
Implementar el cálculo estocástico de $\pi$:
1. El proceso 0 recibe por línea de comandos el número total de dardos $N_{total}$ y lo difunde a todos los procesos mediante `MPI_Bcast`.
2. Cada proceso calcula su porción local de muestras: $N_{local} = N_{total} / p$.
3. **Manejo crítico de números aleatorios:** Cada proceso debe inicializar su generador con una semilla independiente basada en su rango (`srand(time(NULL) + rank * 1000)` o generador reentrante `erand48`) para evitar que todos generen los mismos puntos.
4. Cada proceso cuenta cuántos puntos caen dentro del círculo unitario ($x^2 + y^2 \le 1.0$).
5. Se agregan los aciertos locales mediante `MPI_Reduce` con la operación `MPI_SUM` hacia el proceso 0.
6. El proceso 0 calcula la aproximación final: $\pi \approx 4 \times \frac{\text{aciertos\_totales}}{N_{total}}$ y mide el tiempo total de ejecución con `MPI_Wtime()`.

### Ejercicio 2: Multiplicación de Matrices $C = A \times B$ distribuida
1. El proceso 0 inicializa dos matrices densas cuadradas $A$ y $B$ de dimensión $N \times N$.
2. Particionar $A$ por filas contiguas: cada proceso recibe $N / p$ filas completas de $A$ mediante `MPI_Scatter`.
3. Transmitir la matriz $B$ completa a todos los procesos mediante `MPI_Bcast`.
4. Cada proceso calcula su bloque local de filas de la matriz resultante $C_{local}$.
5. Recombinar la matriz $C$ completa en el proceso 0 utilizando `MPI_Gather`.
6. Validar numéricamente que el resultado coincide elemento a elemento con la versión secuencial con un margen $|C_{mpi}[i][j] - C_{seq}[i][j]| < 10^{-9}$.

---

## 4. Preguntas de reflexión técnica
1. ¿Por qué es más eficiente `MPI_Bcast` que un bucle `for` con $p-1$ llamadas a `MPI_Send`?
2. Si la matriz $B$ fuera demasiado grande para caber en la memoria de un solo nodo ($N = 100.000$), ¿por qué falla este esquema y qué algoritmo alternativo se debe emplear (ej. Algoritmo de Cannon o Fox)?
