Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porEssua Simon Modificado hace 10 años
1
Sistemas Operativos II MC. Daniel Fajardo Delgado INSTITUTO TECNOLÓGICO DE CD. GUZMÁN 30 de Mayo de 2004
2
COMPUTACIÓN PARALELA IV PRÁCTICAS MPI
4
// Programa que simula un anillo // (para 4 procesos) #include #define max 5 main(int argc, char *argv[]){ int rango; int nprocs; int etiqueta = 50; // Cualquier número entero int destino; int fuente; char cad1[] = "cero"; char cad2[] = "uno"; char cad3[] = "dos"; char cad4[] = "tres"; char msgEnt[max]; // Contendrá el mensaje que se recibe MPI_Status estado; // Se inicializa el ambiente paralelo MPI_Init(&argc,&argv); // Obtiene el # de procesadores y su rango MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rango);
5
// Verifica que el # de procesadores sea 4 if(nprocs!=4){ printf("El número de procesadores no es el requerido\n"); exit(1); } else{ switch(rango){ case 0: destino = 1; fuente = 3; // Envía cad1 a procesador 1 MPI_Send(cad1,strlen(cad1)+1,MPI_CHAR, destino,etiqueta,MPI_COMM_WORLD); // Recibe mensaje de procesador 3 MPI_Recv(msgEnt,max,MPI_CHAR,fuente, etiqueta,MPI_COMM_WORLD,&estado); // Imprime mensaje de resultado printf("Soy %d y recibí mensaje: %s\n", rango,msgEnt); break; case 1: destino = 2; fuente = 0; // Envía cad2 a procesador 2 MPI_Send(cad2,strlen(cad2)+1,MPI_CHAR, destino, etiqueta, MPI_COMM_WORLD); // Recibe mensaje de procesador 0 MPI_Recv(msgEnt,max,MPI_CHAR,fuente, etiqueta,MPI_COMM_WORLD,&estado); // Imprime mensaje con el resultado printf("Soy %d y recibí mensaje: %s\n", rango,msgEnt); break;
6
case 2: destino = 3; fuente = 1; // Envía cad3 a procesador 3 MPI_Send(cad3,strlen(cad3)+1,MPI_CHAR, destino, etiqueta, MPI_COMM_WORLD); // Recibe mensaje de procesador 1 MPI_Recv(msgEnt, max, MPI_CHAR, fuente, etiqueta,MPI_COMM_WORLD,&estado); // Imprime mensaje con el resultado printf("Soy %d y recibí mensaje: %s\n", rango,msgEnt); break; case 3: destino = 0; fuente = 2; // Envía cad4 a procesador 0 MPI_Send(cad4,strlen(cad4)+1,MPI_CHAR, destino,etiqueta, MPI_COMM_WORLD); // Recibe mensaje de procesador 1 MPI_Recv(msgEnt, max, MPI_CHAR, fuente, etiqueta, MPI_COMM_WORLD,&estado); // Imprime mensaje con el resultado printf("Soy %d y recibí mensaje: %s\n", rango,msgEnt); } // Finaliza el ambiente paralelo MPI_Finalize(); }
7
RESULTADOS EN PANTALLA
8
/* Programa que muestra como es el criterio de justicia de la implementacion de paso de mensajes. Todos los procesos (excepto el proceso 0) envian 100 mensajes al proceso maestro (proceso 0). Despues el proceso 0 imprimira todos los mensajes tal como los recibe. Se utiliza MPI_ANY_SOURCE y MPI_ANY_TAG dentro de MPI_Recv. Es la implementacion MPI justa? */ #include main(int argc, char *argv[]){ int rank, size, i, buf[1]; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if(rank==0){ // Si es el proceso maestro // recibe cerca de (n-1)*100 mensajes, donde n // es el # de procesadores for(i=0;i<100*(size-1);i++){ MPI_Recv(buf, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); printf("Mensaje proveniente del proceso %d con etiqueta %d\n", status.MPI_SOURCE, status.MPI_TAG); }
9
else{ // Si no es el proceso maestro for(i=0;i<100;i++) MPI_Send(buf, 1, MPI_INT, 0, i, MPI_COMM_WORLD); } MPI_Finalize(); return 0; } RESULTADOS EN PANTALLA
11
#include main(int argc, char *argv[]){ int rango, nprocs; // Se inicia el ambiente paralelo MPI_Init(&argc,&argv); // Se obtiene el # y rango de procesadores MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rango); // Se manda llamar a la función Bcast Bcast(rango, nprocs); // Finaliza ambiente paralelo MPI_Finalize(); } void Bcast(int mirango, int minprocs){ float a, b; int n, raiz=0; if(mirango == 0){ printf("Introduce 3 números (flotante flotante entero)\n"); scanf("%f %f %d",&a, &b, &n); }
12
// Broadcast del primer valor que está contenido en a MPI_Bcast(&a, 1, MPI_FLOAT, raiz, MPI_COMM_WORLD); printf("Rango: %d, recibí: %f\n", mirango, a); // Broadcast del segundo valor que está contenido en b MPI_Bcast(&b, 1, MPI_FLOAT, raiz, MPI_COMM_WORLD); printf("Rango: %d, recibí: %f\n", mirango, b); // Broadcast del tercer valor que está contenido en n MPI_Bcast(&n, 1, MPI_INT, raiz, MPI_COMM_WORLD); printf("Rango: %d, recibí: %d\n", mirango, n); } RESULTADOS EN PANTALLA
13
#include main(int argc, char *argv[]){ int rango, nprocs; // Inicializa el ambiente paralelo MPI_Init(&argc, &argv); // Obtiene # y rango de procesadores MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rango); // Se llama a la función Scatter Scatter(rango); // Finaliza el ambiente paralelo MPI_Finalize(); } void Scatter(int mirango){ int arreglo[8] = {3,5,7,9,11,13,15,17}; int recepcion = 0; int cont_recv = 1; int raiz = 0; // Función que distribuye un elemento del arreglo // a un procesador MPI_Scatter(&arreglo,sizeof(arreglo[0])/sizeof(int),MPI_INT, &recepcion,cont_recv,MPI_INT,raiz,MPI_COMM_WORLD); printf("rango: %d, elemento: %d\n",mirango,recepcion); }
14
RESULTADOS EN PANTALLA
15
#include main(int argc, char *argv[]){ int nprocs, rango; // Inicaliza el ambiente paralelo MPI_Init(&argc, &argv); // Obtiene el # y rango de los procesadores MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rango); // Llama a la función Gather Gather(rango, nprocs); // Finaliza el ambiente paralelo MPI_Finalize(); } void Gather(int mirango, int minprocs){ int arreglo[8] = {3,5,7,9,11,13,15,17}; int recepcion = 0; int arreglo1[sizeof(arreglo)/sizeof(int)]; int raiz = 0, i; }
16
// Se distribuye un elemento del arreglo a un procesador // hasta completar el número de elementos en un arreglo MPI_Scatter(&arreglo,sizeof(arreglo[0])/sizeof(int),MPI_INT, &recepcion,1,MPI_INT,raiz,MPI_COMM_WORLD); // Lee cada uno de los elementos que contiene cada procesador // y los envía al procesador raíz for(i=0;i<minprocs;i++){ MPI_Gather(&recepcion,1,MPI_INT,&arreglo1,1,MPI_INT, i,MPI_COMM_WORLD); } if(mirango == 0){ printf("Rango: %d\n",mirango); for(i=0;i<sizeof(arreglo1)/sizeof(int);i++) printf("%d\n",arreglo1[i]); }
17
RESULTADOS EN PANTALLA
18
PROYECTOS MPI 12 de Junio de 2004 ~> FFT (Fast Fourier Transform) EQUIPO #3 ~> Números primosEQUIPO #1 ~> Multiplicación de matricesEQUIPO #2 ~> Número PiEQUIPO #4
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.