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).