Bloqueante vs no bloqueante
Comunicación bloqueada (standard)
Sección titulada «Comunicación bloqueada (standard)»- Mensaje menor que un umbral (KB–MB, eager):
MPI_Sendcopia el mensaje a un buffer y el emisor sigue; se entrega cuando el destino llama aMPI_Recv. Menos overhead para mensajes chicos. - Mensaje mayor que el umbral (rendezvous):
MPI_Sendfunciona como síncrono (espera al receptor), para no llenar el buffer.
En un anillo (todos Send al vecino derecho y luego Recv del izquierdo): con mensajes grandes o Ssend ⇒ BLOQUEO MUTUO; si un proceso rompe el ciclo ⇒ SECUENCIAL.
Comunicación no bloqueada
Sección titulada «Comunicación no bloqueada»Tres pasos: (1) iniciar (I = retorno inmediato) → (2) hacer cómputo u otra comunicación → (3) esperar a que se complete (Wait/Test).
MPI_Isend(buf, count, type, dest, tag, comm, &request)MPI_Irecv(buf, count, type, src, tag, comm, &request)MPI_Wait(&request, &status) // bloquea hasta completarMPI_Test(&request, &flag, &status) // solo consulta (flag = true/false)MPI_Waitall / Waitany / Waitsome // varias requestsSimulador
Sección titulada «Simulador»Prueba en orden: Send → Recv con mensaje grande (deadlock) y pequeño (funciona); Ssend → Recv (siempre deadlock); el maestro rompe el ciclo (secuencial: mira la escalera en la línea de tiempo); pares/impares (dos fases); Irecv + Isend (sin bloqueo); y el DAG del PD03.
Simulador de mensajes MPI
Simulación en JS (no ejecuta MPI real). Cada tic, cada proceso intenta avanzar una instrucción. Las insignias P0…P3 marcan la línea donde está cada proceso.
1prev = rank - 1;2next = rank + 1;3if (rank == 0) prev = numtasks - 1;4if (rank == (numtasks - 1)) next = 0;P0P1P2P356// COMUNICACION CICLICA7// 1. Cada proceso envía el buffer a su vecino derecho8// y recibe de su vecino izquierdo9MPI_Send(sbuf, N, MPI_INT, next, tag1, MPI_COMM_WORLD);10MPI_Recv(rbuf, N, MPI_INT, prev, tag1, MPI_COMM_WORLD, &status);
Suavizado: bloqueado vs no bloqueado
Sección titulada «Suavizado: bloqueado vs no bloqueado»Cada proceso tiene elementos (2 celdas fantasma). Versión bloqueada: suaviza todo y luego Send/Recv de los bordes (el proceso espera). Versión no bloqueada (Algoritmos 2–3 de U3.3):
A(1) := smooth(0, 1, 2) // primero los bordesA(n/p) := smooth(n/p-1, n/p, n/p+1)Isend(A(1) → j-1), Isend(A(n/p) → j+1) // iniciar comunicación de bordesIreceive(A(n/p) ← j-1), Ireceive(A(1) ← j+1)for i = 2 to n/p-1: A(i) := smooth(i-1, i, i+1) // el interior se calculaMPI_Wait() // mientras viajan los mensajesSolapa comunicación con cómputo: el costo de comunicación se esconde detrás del interior.
Ejercicio (PD03, Ej. 3): bloqueo en un DAG
Sección titulada «Ejercicio (PD03, Ej. 3): bloqueo en un DAG»Con el código ejercicio03.cpp (5 procesos, todos los envíos MPI_Ssend): (3.1) ¿hay algún problema? (3.2) DAG y correctitud. (3.3) Corrija. (3.4) ¿Puede un DAG correctamente construido ocasionar un bloqueo?
Ver solución
Resolución propuesta (verifícala con los escenarios «PD03 Ej.3» y «corregido» del simulador).
- 3.1 Deadlock: P2 primero espera
Recvde P3 (tag 2), pero P3 solo envía después de recibir elresultadode P2. P0 y P1 quedan colgados en suSsenda P2, y P4 esperando a P2. Además P2 recibe enados veces (pisa el valor). - 3.2 Aristas: P0→P2, P1→P2, P2→P3, P2→P4 y P3→P2: esta última forma un ciclo P2⇄P3 ⇒ el grafo de comunicación no es un DAG.
- 3.3 Mover el
Recvde P3 al final de P2 (y usar otra variable): P2 recibe de P0 y P1, calcula, envía a P3 y P4, y recién entonces recibe de P3. El grafo vuelve a ser acíclico en el tiempo. - 3.4 Un DAG bien construido no tiene ciclos de dependencia, así que la lógica no puede bloquear; pero la implementación sí: si el orden de las llamadas bloqueantes no respeta un orden topológico (p. ej. un proceso recibe antes de enviar lo que otro necesita, o
Ssend/mensajes grandes cruzados), aparece un ciclo de espera aunque el DAG de datos sea acíclico. Este ejercicio es el ejemplo: elRecvde P3 estaba primero.
Ejercicio (U3.5, Ej. 6): ping-pong
Sección titulada «Ejercicio (U3.5, Ej. 6): ping-pong»¿Es necesario usar comunicación no bloqueada? ¿Cómo se mide la latencia y el ancho de banda?
Ver solución
No: el patrón es alternado — cuando P0 envía, P1 ya está en su Recv, y viceversa; no hay espera circular (ni con Send ni con Ssend). Se itera 50 veces y el tiempo por mensaje es (en µs con *1e6), excluyendo las primeras iteraciones (calentamiento). Con tamaños 8 B, 512 B, 32 kB y 2 MB: el tiempo de los mensajes chicos ≈ latencia ; la pendiente de tiempo vs tamaño ≈ (1/ancho de banda). Ssend tiene más latencia que Send para mensajes chicos (no puede usar el buffer).
Autoevaluación
0/5 correctas · 0 respondidasMPI_Ssend al derecho y luego MPI_Recv del izquierdo.MPI_Send y mensajes de 4 bytes:MPI_Isend + MPI_Wait equivale a…Fuente ·U3.3 Paralelismo Distribuido- No bloqueado.pdf · session3/ejemplo01a–d · practica_pc3/2025II-Ej01pingpong.c · practica_3_ofi/ejercicio03.cpp · CS4052-PD03-S02.pdf (Ej. 3) · U3.5 Ejercicios de repaso.pdf (Ej. 6, 8)