Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Punto
Send y Receive para pasaje de mensajes
Un comunicador: es una colección de procesos, los cuales se
comunican a través del envío y recepción de mensajes.
4
0
1
3 MPI_COMM_WORLD este seria el comunicador, se usa en gral para
problemas grandes, donde agrupo distintos tipos de
2 procesos segun alguna caracteristicas, en gral, por
que es lo que resuelve.
Send(data)
Receive(data)
necesito datos
• Necesitamos especificar:
• ¿Cómo será inicializado “data” ?
• ¿Cómo serán identificados los procesos?
• ¿Cómo lo reconocerá el receptor?
• ¿Qué significará que se completen estas operaciones?
4
¿Qué es el pasaje de mensajes?
• Transferencia de datos más sincronización (de que manera el otro se sincroniza cuando voy a
recibirlo)
Data Proceso 1
Proceso 0 Data Puedo enviar? Data
Data
Data Data consumidor
productor Data Data
Data Data
Data
Data Data
Data Si
Tiempo
Preguntas:
int MPI_Send (void *buf, int count, MPI _Datatype datatype, int dest, int tag,
MPI _Comm comm)
int MPI _Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag,
MPI_Comm comm, MPI_Status *status)
Estructura MPI_Status:
typedef struct MPI_Status {
int MPI_SOURCE;
int MPI_TAG; ----> el tag indica el numero de send y recv corresp
int MPI_ERROR;
}
Sintaxis Send/Recv
Objeto Status y MPI_Get_count
int MPI _Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag,
MPI_Comm comm, MPI_Status *status)
Estructura MPI_Status:
typedef struct MPI_Status {
int MPI_SOURCE;
int MPI_TAG;
int MPI_ERROR;
}
9
MPI Basic (Blocking) Receive
10
Información sobre el mensaje: Status
Ejemplo:
---------------------------> como puse que recibo de cualquier con cualquier tag, esto
recv_tag = status.MPI_TAG; desp me permite saber de quién vino y con que tag
recv_from = status.MPI_SOURCE;
MPI es simple
• MPI_INIT
• MPI_FINALIZE
• MPI_COMM_SIZE
• MPI_COMM_RANK
• MPI_SEND
• MPI_RECV
Ejercicio 1
➢ Queremos hacer un programa paralelo que encadene el envío y recepción de un
mensaje, en nuestro caso el mensaje será el rank (identificador) del proceso que
envía.
➢ Los mensajes se enviarán de forma encadenada, lo que quiere decir que el
primero enviará un mensaje al segundo, el segundo recibirá uno del primero y
enviará uno al tercero, y así sucesivamente para todos los procesos lanzados.
➢ Todo proceso que reciba un mensaje debe imprimirlo de la forma
"Soy el proceso X y he recibido M",
siendo X el rango del proceso y M el mensaje recibido.
P0 envía 0 + 0 a P1 P1 envía 0 + 1 a P2
P2 envía 1 + 2 a P3
Ejercicio 2
➢ El proceso 0 envía un vector al proceso 1
➢ El arreglo estático se declara e inicializa en 0 - El proceso 0 cambia los elementos
tal que Vec[i] = i
➢ El proceso 1 recibe el arreglo y lo muestra antes de recibir los datos de P0 y
luego de recibirlos.
➢ Los mensajes deben tener los carteles que correspondan en cada caso indicando
que proceso lo escribe.
➢ La dimensión del arreglo se ingresa como #define N xx
Ejercicio 3