Programación Pasando El Paradigma De Paso De Mensajes
noraluz.ce28 de Febrero de 2014
2.503 Palabras (11 Páginas)411 Visitas
PROGRAMACION USANDO EL PARADIGMA DE PASO DE MENSAJES
Temas:
- Principios de programación de paso de mensaje
- Construccion de bloques: enviar y recibir operaciones
- MPI: Interfaz de paso de mensaje (Message Passing Interface)
- Topologías e Incrustracion
- Superposición de comunicación con computación
- Comunicación colectiva y operaciones computacionales
- Grupos y comunicadores
PRINCIPIOS DE PROGRAMACION DE PASO DE MENSAJE
- La visión lógica de una maquina que soporta el paso de mensajes consiste en p procesos, cada uno con su espacio de dirección
- Cada elemento de dato debe pertenecer a una de las particiones del espacio, entonces los datos deben estar particionados y colocados explícitamente
- Todas las interacciones (solo lectura o lectura/escritura) requiere coperacion de dos procesos – el proceso que tiene los datos y el proceso que quiere accesar a los datos
- Estas dos restricciones, hacen que los costos subyacentes sean explicitos para el programador
CONSTRUCCION DE BLOQES: OPERCIONES DE ENVIO Y RECEPCION
Los prototipos de estas operaciones son los siguientes
- send(void *sendbuf, int nelems, int dest)
- receive(void *recvbuf, int nelems, int source (fuente) )
Considerando los siguientes segmentos del codigo:
P0 P1
a = 100; receive(&a, 1, 0)
send(&a, 1, 1); printf("%d\n", a);
a = 0;
La semantica de la operacion envio require que el valor recibido por el proceso P1 debe ser 100 en oposición a 0.
Esto motivo el diseño del protocolo de envío y recepción
OPERACIÓN DE PASO DE MENSAJE CON BLOQUES SIN BUFFER
- un método simple para forzar la semántica de envio/recepcion es que la operación envio solo regrese cuando sea seguro
- en el bloque (sin buffer) de envio, la operación no regresa hasta que la pareja del envio sea encontrada en el proceso de recepción
- ralentí y bloqueos son problemas mayores con los bloques (sin buffer) de envio
- en bloques de envio (con buffer), el remitente copia la información en el buffer de destinatario y regresa después de que la operación copia ha sido completada. La información es copiada en el buffer y termina hasta que la recepcion sea hecha
- el buffer alivia problemas de ralentí a expensas de los gastos generales de copiado
- hay
- hay un apretón de manos por el bloque (sin buffer) en operación de envio/recepcion
- es fácil observar que en los casos en los que el remitente y destinatario no alcanzan el punto de comunicacion en tiempos similares, puede haber un considerable gastos de ralentí
OPERACIONES DE PASO DE MENSAJES BLOQUES CON BUFFER
- Una solución simple al problema de ralentí y bloqueos antes mencionados es confiar en los buffer en los extremos de envio y recepcion
- El destinatario simplemente copia la información en el buffer designado y regresa después de que la operación copia ha sido completada
- La información debe estar en un buffer(buffereada) y después regresa después que la operación ha sido completada
- El buffer intercambia gastos de ralentí por gastos de copiado
- Protocolos de Bloques de transferencia: (a) en la presencia de un hardware de comunicación con buffers con extremos de envio y repecion; y (b) en la ausencia de hardware de comunicación, el remitente interrumpe al destinatario y deposita la información en un buffer del extremo de destinatario
- Buffer de tamaño limitado pueden tener un impacto significante en el rendimiento
P0 P1
for (i = 0; i < 1000; i++) { for (i = 0; i < 1000; i++){
produce_data(&a); receive(&a, 1, 0);
send(&a, 1, 1); consume_data(&a);
} }
- Que pasa si el consumidor fuse mucho mas lento que el productor?
- Bloqueos siguen siendo posibles con un buffer desde las operaciones del bloque de recepcion
P0 P1
receive(&a, 1, 1); receive(&a, 1, 0);
send(&b, 1, 1); send(&b, 1, 0);
OPERACIONES DE PASO DE MENSAJES SIN BLOQUES
- El programador debe asgurar la semántica de envio y repecion
- Esta clase de protocolos sin bloques regresan del envio o recepcion antes de que sea semánticamente seguro hacerlo
- Operaciones sin bloques generalmente vienen acompañados por una operación de chequeo del estatus (check-status)
- Cuando es usado correctamente, estos primitivos son capaces de superponerse a gastos de comunicación con útiles cálculos
- Librerías de paso mensajes típicamente proveen primitivos de bloques o sin bloques
- Sin bloques sin buffer operaciones de envio y repecion (a) en ausencia de un hardware de comunicación (b) en presencia de un hardware de comunicación
PROTOCOLOS DE ENVIO Y RECEPCION
- Espaco de posibles protocolos de operaciones de envio y recepción
MPI: INTERFACE DE PASO DE MENSAJES
- MPI define una librería estándar para el paso de mensajes que puede ser usada para desarrollar programas portables de paso de mensajes usando C o Fortran
- MPI estándar define una sintaxis asi como una semántica y un conjunto básico de rutinas de librerías
- Implementaciones del vendedor de MPI están disponibles en casi todos los computadores paralelos comerciales
- Es posible escribir programas de paso de mensajes completamente funcionales usando solo seis rutinas
- Conjunto minimo de rutinas de MPI
MPI_Init Initializes MPI.
MPI_Finalize Terminates MPI.
MPI_Comm_size Determines the number of processes.
MPI_Comm_rank Determines the label of calling process.
MPI_Send Sends a message.
MPI_Recv Receives a message.
EMPEZANDO Y TERMINANDO LIBRERIAS DE MPI
- MPI_Init es llamado antes de llamar a otras rutinas de MPI. El propósito es inicializar el entorno del MPI
- MPI_Finalize es llamado al final del calculo, y esto realiza varias tareas de limpieza (clean-up) para terminar el entorno del MPI
- Los prototipos de estas dos funciones son:
int MPI_Init(int *argc, char ***argv)
int MPI_Finalize()
- MPI_Init también se despoja de cualquier argumento relacionado al commando del MPI
- Todas las rutinas del MPI, tipos de datos, constantes tienen prefijo “MPI_”. El coddigo de retorno por una exitosa finalización es MPI_SUCCESS
COMUNICADORES
- Un comunicador define un dominio de comunicación – un conjunto de procesos que son permitidos para comunicarse con los otros
- Información acerca del dominio de la comunicación esta guardada en las variables de tipo MPI_Comm
- Comunicadores son usados como argumentos para todos las rutinas de transferencia de mensajes de MPI
- Un proceso puede pertenecer a diferentes dominios de comunicación (que posiblemente sean sobrepuestos)
- MPI define un comunicador por defecto llamado MPI_COMM_WORLD que incluye todos los procesos
CONSULTA DE INFORMACION
- Las funciones MPI_Comm_size y MPI_Comm_rank son usadas para determinar el numero de procesos y la etiqueta del nombre del proceso, respectivamente
- Las secuencias las rutinas de llamado son como las siguientes:
int MPI_Comm_size(MPI_Comm comm, int *size)
int MPI_Comm_rank(MPI_Comm comm, int *rank)
- El rango de un proceso es un numero entero que va desde el cero hasta el tamaño del comunicador menor uno
PRIMER PROGRAMA MPI
#include <mpi.h>
main(int argc, char *argv[])
{
int npes, myrank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &npes);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
printf("From process %d out of %d, Hello World!\n",
myrank, npes);
MPI_Finalize();
}
- Las funciones básicas para envio y recepcion de mensajes en MPI son MPI_Send y MPI_Recv respectivamente
- El llamado de secuencias de estas rutinas son seguidas por:
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)
- MPI prove equivalencies en los tipos de datos (datatype) para todos los tipos de datos en C. Esto es hecho por razones de portabilidad
- El tipo de dato MPI_BYTE corresponde a un byte(8 bits) y MPI_PACKED correspone a una colección de elementos que fueron creados por el embalaje de datos no contiguos
- Las etiquetas del mensaje pueden tomar valores que van de cero hasta la constante definida en MPI: MPI_TAG_UB
TIPOS DE DATOS DE MPI
MPI Datatype C Datatype
MPI_CHAR signed char
MPI_SHORT signed short int
MPI_INT signed int
MPI_LONG signed long int
MPI_UNSIGNED_CHAR unsigned char
MPI_UNSIGNED_SHORT unsigned short int
MPI_UNSIGNED unsigned int
MPI_UNSIGNED_LONG unsigned long int
MPI_FLOAT float
MPI_DOUBLE double
MPI_LONG_DOUBLE long double
MPI_BYTE
MPI_PACKED
ENVIO Y RECEPCION
...