MPI_COMM_WORLD que describe un conjunto de procesos

Anuncio
Una de las tareas de MPI_Init() es definir la estructura:
MPI_COMM_WORLD que describe un conjunto de
procesos/procesadores.
¿Quién soy yo?: La rutina
MPI_Comm_rank( MPI_COMM_WORLD, &p );
retorna en la variable entera p el identificador de
proceso.
¿Cuántos procesos hay en total?: La rutina
MPI_Comm_size( MPI_COMM_WORLD, &np );
retorna en la variable entera np cuantos procesos
paralelos hay.
La rutina MPI_Send() se usa para envio de datos, punto a
punto (con bloqueo):
MPI_Send( buffer, cantidad, tipo_dato, p_destino,
etiqueta, comunicador );
void *buffer -Puntero al mensaje a enviar
int cantidad -Numero de elementos a enviar
MPI_Datatype tipo_dato -Tipo de elementos a enviar:
MPI_INT, MPI_CHAR ..
int p_destino -ID del proceso destino
int etiqueta -Etiqueta para marcar mensajes
MPI_Comm comunicador -Comunicador usado:
MPI_COMM_WORLD
La rutina MPI_Recv() se usa para recibir datos punto a punto
(con bloqueo)
MPI_Recv( buffer, cantidad, tipo_dato, p_fuente,
filtro , comunicador, status);
void *buffer -Puntero a mensaje a recibir
int cantidad -Numero de elementos a recibir
MPI_Datatype tipo_dato; -Tipo de elementos a
recibir:
MPI_INT, MPI_CHAR ..
int p_fuente -ID del proceso fuente
int filtro -Filtro para selecionar
que mensajes
recibir/descartar
MPI_Comm comunicador -Comunicador usado:
MPI_COMM_WORLD
MPI_Status status -Estatus del mensaje que indica
como fue recibido el mensaje
Rutina para envio punto a punto sin bloqueo.
MPI_ISend( buffer, cantidad, tipo_dato, p_destino,
etiqueta, comunicador, request );
void *buffer -Puntero a mensaje a enviar
int cantidad -Numero de elementos a enviar
MPI_Datatype tipo_dato -Tipo de elementos a enviar:
MPI_INT, MPI_CHAR ..
int p_destino -ID del proceso destino
int etiqueta -Etiqueta para marcar mensajes
MPI_Comm comunicador -Comunicador usado:
MPI_COMM_WORLD
MPI_Request *request -Puntero a identificador de
envio solicitado
Broadcast
La rutina MPI_Bcast() permite comunicar datos en forma
masiva desde un
proceso a todo el resto de los procesos paralelos de un
contexto. En el ejemplo
siguiente se optimiza el input de datos para para el calculo
de la serie:
// Proceso p=0 lee valor del teclado
if ( p==0 ) {
printf("Ingrese M: ");
scanf("%d",&M);
}
// Los q={1, ..., np-1} procesos se enteran de M
MPI_Bcast( &M, 1, MPI_INT, 0, MPI_COMM_WORLD );
// e imprimen que valor recibieron
printf("proc(%d) Broadcast, carga total Mt:
%d\n",p,Mt);
Reduce
La operacion colectiva MPI_Reduce() permite realizar una
operacion colectiva de suma, multiplicacion, etc. en todos los
procesos de un contexto. Por ejemplo las sumas parciales de
la serie pueden acumularse en un total que se
almacena en el proceso 0 para el siguiente ejemplo
(terminal):
/* Se acumula totales parciales
* de cada proceso en proceso 0 */
MPI_Reduce(&suma,&sumatotal,1,MPI_DOUBLE,MPI_SUM,0,
MPI_COMM_WORLD);
/* Proceso 0 imprime resultado total*/
if (p==0)
printf("RESULTADO FINAL ES: %f\n",sumatotal);
Operaciones colectivas posibles son: MPI_SUM (suma),
MPI_PROD (multiplicación),
MPI_MAX (obtener el máximo), MPI_MIN (obtener el mínimo).
Descargar