La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Programación en MPI Capítulo 4. 4–2 NOT Gate 4–3 AND Gate.

Presentaciones similares


Presentación del tema: "Programación en MPI Capítulo 4. 4–2 NOT Gate 4–3 AND Gate."— Transcripción de la presentación:

1 Programación en MPI Capítulo 4

2 4–2 NOT Gate

3 4–3 AND Gate

4 4–4 OR Gate

5 Circuitos Lógicos Los gates se combinan en circuitos usando la salida de un gate como la entrada de otra.

6 El Problema de Satisfacer un Circuito Es el problema de determinar de un circuito lógico con una salida si hay una combinación de entradas que hace la salida igual a 1.

7 Determinar la combinaciones de entradas que satisfacen el circuito

8 Método de Solución El problema es NP completo Ningun algorítmo polinomial se sabe Resolvemos el problema cotejando cada una de las 2 16 =65536 posibilidades Buscaremos todas las soluciones que existen.

9 Diseño del Algoritmo Descomposición funcional: Cada proceso (i.e., tarea) cotejará una combinación. No hay comunicaciones entre tareas. El tiempo para cotejar una combinación es variable. Balanceamos el cargo de computaciones asignando procesadores en una manera cíclica. Asignamos un proceso a un procesdaor.

10 Comunicadores Un comunicador provee el ambiente para pasar mensajes entre procesos. Si no se especifica, el comunicador es MPI_COMM_WORLD que incluye todos los procesos..

11 Rango Todo proceso de un comunicador tiene una identificación en ese comunicador, que se llama el rango (“rank”). MPI_Comm_rank(comunicador,&id) pone el rango del comunicador comunicador en id; Ejemplo: MPI_Comm_rank (MPI_COMM_WORLD,&id)

12 Tamaño El número de procesos en un comunicador se llama el tamaño (“size”) del comunicador.. MPI_Comm_size (comunicador,&p) pone en la variable p el tamaño del comunicador comunicador. Ejemplo: MPI_Comm_size (MPI_COMM_WORLD,&p);

13 Todo programa de MPI contiene #include int main (int argc,char *argv[]).. MPI_Init(&argc,&argv); MPI_Finalize(); return 0;

14 Satisfacer Circuito #include #include int main (int argc, char *argv[]) { int i; int id; int p; void check_circuit (int, int); MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &id); MPI_Comm_size (MPI_COMM_WORLD, &p); for (i = id; i < 65536; i += p) check_circuit (id, i); printf ("Process %d is done\n", id); fflush (stdout); MPI_Finalize(); return 0; }

15 Distribución de Trabajo Cada uno de los p procesadores coteja piso(65536/p) combinaciones. Proceso #id coteja las combinaciones i tales que i = id mod p Por ejemplo si p=8, Proceso #0 coteja combs. 0,8,16….,65528 Proceso #1 coteja combs 1,9,17,…,65529 ….… Proceso #7 coteja combs 7,15,22,…,65535

16 Para Cotejar una Combincación Dado el número i, extraer sus bits y guardarlos en un arreglo v[0],v[1],…,v[15] Expresar la salida del circuito como una expresión booleana E en las variables v[0],v[1],…,v[15] El cuerpo de la función check_circuit consistirá de if (E) imprimir (v[0]…v[15])

17 check_circuit /* Return 1 if 'i'th bit of 'n' is 1; 0 otherwise */ #define EXTRACT_BIT(n,i) ((n&(1<<i))?1:0) void check_circuit (int id, int z) { int v[16]; /* Each element is a bit of z */ int i; for (i = 0; i < 16; i++) v[i] = EXTRACT_BIT(z,i); if ((v[0] || v[1]) && (!v[1] || !v[3]) && (v[2] || v[3]) && (!v[3] || !v[4]) && (v[4] || !v[5]) && (v[5] || !v[6]) && (v[5] || v[6]) && (v[6] || !v[15]) && (v[7] || !v[8]) && (!v[7] || !v[13]) && (v[8] || v[9]) && (v[8] || !v[9]) && (!v[9] || !v[10]) && (v[9] || v[11]) && (v[10] || v[11]) && (v[12] || v[13]) && (v[13] || !v[14]) && (v[14] || v[15])) { printf ("%d) %d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d\n", id, v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9], v[10],v[11],v[12],v[13],v[14],v[15]); fflush (stdout); }

18 Compilar y Ejecutar Si el programa reside en el archivo sat1.c, se compila con mpicc –o sat1 sat1.c Se ejecuta con mpirun –np número sat1 donde número es el número de procesadores

19 Problema Modificado Cambiar el problema de satisfacer para que en vez de determinar las soluciones, se determina el número de soluciones. Esto se hace utilizando reducción.

20 Cambios al Programa Devolver 1 si la combinacion satisface el circuito y devolver 0 si no. Cada proceso lleva cuenta del número de combinaciones que el ha encontrado que satisfacen el circuitos. Usar reducción para determinar el número total de combinaciones que funcionan.

21 Cambios a check_circuit int check_circuit (int id, int z) { #define EXTRACT_BIT(n,i) ((n&(1<<i))?1:0) int v[16]; /* Each element is a bit of z */ int i; for (i = 0; i < 16; i++) v[i] = EXTRACT_BIT(z,i); if ((v[0] || v[1]) && (!v[1] || !v[3]) && (v[2] || v[3]) && (!v[3] || !v[4]) && (v[4] || !v[5]) && (v[5] || !v[6]) && (v[5] || v[6]) && (v[6] || !v[15]) && (v[7] || !v[8]) && (!v[7] || !v[13]) && (v[8] || v[9]) && (v[8] || !v[9]) && (!v[9] || !v[10]) && (v[9] || v[11]) && (v[10] || v[11]) && (v[12] || v[13]) && (v[13] || !v[14]) && (v[14] || v[15])) return 1; else return 0; }

22 Cambios a main #include int main (int argc, char *argv[]) { int global_solutions; int i; int id; int p; int solutions; int check_circuit (int, int); MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &id); MPI_Comm_size (MPI_COMM_WORLD, &p); solutions = 0; for (i = id; i < 65536; i += p) solutions += check_circuit (id, i); MPI_Reduce (&solutions,&global_solutions,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD); printf("Process %d is done\n",id); fflush (stdout); MPI_Finalize(); if (id==0) printf ("There are %d different solutions\n",global_solutions); return 0; }

23 Prototipo de MPI_Reduce int MPI_Reduce ( void *operando, /* dir del primer elemento */ void *resultado /* dir del primer resultado */ int count, /* reducciones para llevar acabo */ MPI_Datatype tipo, /* type of elements */ MPI_Op operador, /* reduction operator */ int raiz, /* proceso que recibe resultado*/ MPI_Comm com /* comunicador */ )

24 La Llamada a MPI_Reduce MPI_Reduce (&solutions, &global_solutions, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD) if (id==0) printf ("There are %d different solutions\n", global_solutions);

25 Tipos de Dato MPI MPI_CHAR MPI_DOUBLE MPI_FLOAT MPI_INT MPI_LONG MPI_LONG_DOUBLE MPI_SHORT MPI_UNSIGNED_CHAR MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_UNSIGNED_SHORT

26 Operaciones de Reducción MPI_BAND MPI_BOR MPI_BXOR MPI_LAND MPI_LOR MPI_LXOR MPI_MAX MPI_MAXLOC MPI_MIN MPI_MINLOC MPI_PROD MPI_SUM

27 “Benchmarking” MPI_Barrier(comunicador) asegure que ninguno de los procesos en comunicador puedan avanzar despues de la barrera hasta que todos lleguen. MPI_Wtime() devuelve el número de segundos que han pasado después de un cierto momento.

28 El Código para Benchmarking double elapsed_time; … MPI_Init (&argc, &argv); MPI_Barrier (MPI_COMM_WORLD); elapsed_time = - MPI_Wtime(); … MPI_Reduce (…); elapsed_time += MPI_Wtime();

29 Tiempos de Ejecutación de SAT2 Núm. de procs. p Tiempo (t P ) Speedup ( t 1 / t p ) 10.007943 20.006409 1.239 40.002397 3.314 80.001090 7.287

30 Asignación Benchmark the circuit problem discussed in class by adding the appropriate timing commands to the program. Determine the speedup for 2, 4, and 8 processors. All programs in the text can be downloaded from http://fac- staff.seattleu.edu/quinnm/web/education/Parallel Programming http://fac- staff.seattleu.edu/quinnm/web/education/Parallel Programming Hand in a table with the speedups in class on Thursday, February 1

31


Descargar ppt "Programación en MPI Capítulo 4. 4–2 NOT Gate 4–3 AND Gate."

Presentaciones similares


Anuncios Google