La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Sistemas Operativos II MC. Daniel Fajardo Delgado INSTITUTO TECNOLÓGICO DE CD. GUZMÁN 30 de Mayo de 2004.

Presentaciones similares


Presentación del tema: "Sistemas Operativos II MC. Daniel Fajardo Delgado INSTITUTO TECNOLÓGICO DE CD. GUZMÁN 30 de Mayo de 2004."— Transcripción de la presentación:

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

3

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

10

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


Descargar ppt "Sistemas Operativos II MC. Daniel Fajardo Delgado INSTITUTO TECNOLÓGICO DE CD. GUZMÁN 30 de Mayo de 2004."

Presentaciones similares


Anuncios Google