Esquemas de comunicación tipos de comunicación Maestro-esclavo o comunicación global Esquema SPMD o comunicación local Maestro-esclavo o comunicación global Consiste en la implementación de un componente principal llamado maestro que se encarga de recolectar la información procesada por cada esclavo (componente secundario) y de distribuirla en su totalidad a cada uno de ellos. Permite el procesamiento en paralelo, pues cada esclavo trabaja independientemente de los demás. También, se le conoce como comunicación global, porque la información se concentra en un procesador (maestro). Maestro-esclavo o comunicación global Esquema SPMD o comunicación local Este esquema utiliza el modelo Single Program Multiple Data (Programas Simples Múltiples Datos). Se escribe únicamente un programa y todos los procesadores ejecutarán el mismo programa. Múltiples datos (MD) se refiere a que los datos se dividen en pedazos, y se le asigna un pedazo a cada procesador. A diferencia de la comunicación global, al aplicarse este esquema a las estrategias de particionamiento, no existe un proceso maestro. Esquema SPMD o comunicación local La comunicación del procesador N es sólo con sus vecinos más cercanos, es decir, con el N - 1 y el N + 1 si no es el procesador 0 o el último. Si es el procesador 0 éste sólo se comunica con el procesador 1 y el último procesador sólo se comunica con el anterior. Esquema SPMD o comunicación local Una de las características principales para la aplicación eficientemente del paralelismo es que no deben existir dependencias de datos entre los procesadores, de lo contrario se tendría que usar sincronización para que la evaluación del problema sea correcto. Por lo tanto, se requiere tener una buena orquestación del problema a paralelizar. Alcances de las comunicaciones Punto a punto Involucra dos tareas, donde una tarea actúa como el transmisor/productor de datos y el otro actúa como el recibidor/consumidor. Colectiva Involucra compartir datos entre más de dos tareas, las cuales se especifican como miembros de un grupo común o colectivo. Broadcast Scatter Gather Reduction Etc. MPI_Bcast (Broadcast) Difunde un mensaje desde el proceso root a todos los otros procesos en el grupo (incluyendo root). Sintaxis: #include <mpi.h> int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm) Parámetros buffer : Dirección de inicio del buffer. Count: Numero de entradas en el buffer. Datatype: Tipo de datos del buffer. Root: Rank of broadcast root (integer). Comm: Comunicador. Ejemplo Broadcast 100 enteros desde el proceso 0 a cada proceso en el grupo. MPI_Comm comm; int array[100]; int root=0; ... MPI_Bcast( array, 100, MPI_INT, root, comm); MPI_Gather Reúne los valores desde un grupo de procesos. Sintaxis: #include <mpi.h> int MPI_Gather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) Parámetros Sendbuf: Dirección de inicio del buffer a enviar. Sendcount: Numero de elementos en el buffer de envío. Sendtype: Tipo de datos del buffer de elementos de envío. Recvcount: Numero de elementos para el recibo. Recvtype: Tipo de datos del buffer de elementos. Root: Rank del proceso que recibe. Comm: Comunicador. Ejemplo Reúne 100 enteros desde cada proceso en el grupo al raíz. MPI_Comm comm; int gsize,sendarray[100]; int root, *rbuf; ... MPI_Comm_size( comm, &gsize); rbuf = (int *)malloc(gsize*100*sizeof(int)); MPI_Gather( sendarray, 100, MPI_INT, rbuf, 100, MPI_INT, root, comm); MPI_Scatter Envía datos desde una tarea a todas las tareas en un grupo. Sintaxis: #include <mpi.h> int MPI_Scatter(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) Parámetros sendbuf : Dirección del buffer de envío. Sendcount : Numero de elementos de envío a cada proceso. sendtype : Tipo de datos del buffer de elementos de envío. recvcount : Numero de elementos del buffer de recibo. recvtype : Tipo de datos del buffer de recibo. root : Rank del proceso de envío. Comm : Comunicador. Ejemplo Lo contrario del ejemplo de MPI_Gather. Dispersión de conjuntos de 100 enteros desde la raíz a cada proceso en el grupo. MPI_Comm comm; int gsize,*sendbuf; int root, rbuf[100]; ... MPI_Comm_size(comm, &gsize); sendbuf = (int *)malloc(gsize*100*sizeof(int)); ... MPI_Scatter(sendbuf, 100, MPI_INT, rbuf, 100, MPI_INT, root, comm); MPI_Reduce Reduce los valores de todos los procesos dentro de un grupo. Sintaxis: #include <mpi.h> int MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) Parámetros sendbuf : Dirección del buffer de envio. count : Numero de elementos en el buffer de envío. Datatype : Tipo de dato de los elementos del buffer de envio. op : Operación de reducción. root : Rank del proceso raíz. comm : Comunicador. Operaciones MPI_MAX máximo MPI_MIN mínimo MPI_SUM suma MPI_PROD producto MPI_LAND and lógico MPI_LOR or lógico MPI_LXOR xor lógico Programas paralelos Problema: Problema: producto de matrices Referencias http://www.open-mpi.org/doc/v1.8/ http://wwwusers.cs.umn.edu/~karypis/parbook/ https://computing.llnl.gov/tutorials/parallel_co mp/#Designing https://computing.llnl.gov/tutorials/parallel_co mp/