Descargar

Comunicaciones colectivas y Tipos de datos derivados

Enviado por Pablo Turmero


Partes: 1, 2

    edu.red Comunicaciones colectivas Muchas aplicaciones requieren de la comunicación entre más de dos procesos.

    Esto se puede hacer combinando operaciones punto a punto, pero para que le resulte más cómodo al programador, y para posibilitar implementaciones optimizadas, MPI incluye una serie de operaciones colectivas:

    Barreras de sincronización Broadcast (difusión) Gather (recolección) Scatter (distribución) Operaciones de reducción (suma, multiplicación, mínimo, etc.) Combinaciones de todas ellas

    edu.red Comunicaciones colectivas Una operación colectiva tiene que ser invocada por todos los participantes, aunque los roles que juegen no sean los mismos.

    La mayor parte de las operaciones requieren la designación de un proceso como root, o raíz de la operación.

    edu.red Comunicaciones colectivas. Barreras y broadcast Dos de las operaciones colectivas más comunes son las barreras de sincronización (MPI_Barrier()) y el envío de información en modo difusión (MPI_Broadcast()).

    En MPI_Barrier no exige ninguna clase de intercambio de información. Es una operación puramente de sincronización, que bloquea a los procesos de un comunicador hasta que todos ellos han pasado por la barrera. Suele emplearse para dar por finalizada una etapa del programa, asegurándose de que todos han terminado antes de dar comienzo a la siguiente.

    int MPI_Barrier(MPI_Comm comm);

    edu.red Comunicaciones colectivas. Barreras y broadcast MPI_Broadcast() sirve para que un proceso, el raíz, envíe un mensaje a todos los miembros del comunicador.

    Esta función ya muestra una característica peculiar de las operaciones colectivas de MPI: todos los participantes invocan la misma función, designando al mismo proceso como raíz de la misma.

    Una implementación alternativa sería tener una función de envío especial, en modo broadcast, y usar las funciones de recepción normales para leer los mensajes.

    int MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm);

    edu.red Comunicaciones colectivas. Barreras y broadcast Este esquema representa el significado de un broadcast.

    En las filas representamos los procesos de un comunicador, y en las columnas los datos que posee cada proceso.

    Antes del broadcast, el procesador raíz (suponemos que es el 0) tiene el dato A. Tras realizar el broadcast, todos los procesos (incluyendo el raíz) tienen una copia de A0.

    edu.red Comunicaciones colectivas. Recolección (gather) MPI_Gather realiza una recolección de datos en el proceso raíz.

    Este proceso recopila un vector de datos, al que contribuyen todos los procesos del comunicador con la misma cantidad de datos.

    El proceso raíz almacena las contribuciones de forma consecutiva.

    int MPI_Gather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);

    edu.red Comunicaciones colectivas. Recolección (gather) Sólo el proceso raíz tiene que preocuparse de los parámetros recbuf, recvcount y recvtype.

    Sin embargo, todos los procesos (raíz incluido) tienen que facilitar valores válidos para sendbuf, sendcount y sendtype.

    edu.red Comunicaciones colectivas. Recolección (gather) Existe una versión de la función de recolección, llamada MPI_Gatherv(), que permite almacenar los datos recogidos en forma no consecutiva, y que cada proceso contribuya con bloques de datos de diferente tamaño .

    int MPI_Gatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm);

    La tabla recvcounts establece el tamaño del bloque de datos aportado por cada proceso, y displs indica cuál es el desplazamiento entre bloque y bloque

    edu.red Comunicaciones colectivas. Recolección (gather) Muchas veces interesa distribuir a todos los procesos el resultado de una recolección previa. (Esto se puede hacer concatenando una recolección con un broadcast).

    Existen funciones que se encargan de hacer todo esto en un único paso: MPI_Allgather() (si los bloques de datos son de tamaño fijo y se almacenan consecutivamete) y MPI_Allgatherv() (si los tamaños de los datos son variables y/o se almacenan de forma no consecutiva).

    int MPI_Allgather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm);

    int MPI_Allgatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype,void* recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, MPI_Comm comm);

    edu.red Comunicaciones colectivas. Recolección (gather)

    Partes: 1, 2
    Página siguiente