programación en mpi capítulo 4. 4–2 not gate 4–3 and gate

31
Programación en MPI Capítulo 4

Upload: sandalio-andrada

Post on 23-Jan-2016

220 views

Category:

Documents


0 download

TRANSCRIPT

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

Programación en MPI

Capítulo 4

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

4–2

NOT Gate

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

4–3

AND Gate

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

4–4

OR Gate

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

Circuitos Lógicos

• Los gates se combinan en circuitos usando la salida de un gate como la entrada de otra.

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

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.

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

Determinar la combinaciones de entradas que satisfacen el circuito

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

Método de Solución

• El problema es NP completo

• Ningun algorítmo polinomial se sabe

• Resolvemos el problema cotejando cada una de las 216 =65536 posibilidades

• Buscaremos todas las soluciones que existen.

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

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.

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

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.

.

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

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)

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

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

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

Todo programa de MPI contiene

#include <mpi.h>#include<stdio.h>int main (int argc,char *argv[])..MPI_Init(&argc,&argv);

MPI_Finalize();return 0;

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

Satisfacer Circuito#include <mpi.h>

#include <stdio.h>

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;}

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

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

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

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

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

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); }}

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

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

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

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.

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

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.

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

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;}

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

Cambios a main• #include <mpi.h>• #include <stdio.h>• 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;• }

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

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 */ )

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

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

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

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

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

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

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

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

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

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();

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

Tiempos de Ejecutación de SAT2

Núm. de procs. p

Tiempo

(tP )

Speedup

( t1/ tp)

1 0.007943

2 0.006409 1.239

4 0.002397 3.314

8 0.001090 7.287

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

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/ParallelProgramming

• Hand in a table with the speedups in class on Thursday, February 1

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