Descargar

Programación basada en paso de mensajes

Enviado por Pablo Turmero


Partes: 1, 2

    edu.red

    PROGRAMACIÓN BASADA EN PASO DE MENSAJES Recordar concurrencia pthreads: contar y descifrar Un modelo de paso de mensajes Opciones de programación Creación de procesos Rutinas genéricas de paso de mensajes MPI Introducción Procesos Envío y recepción de mensajes Comunicación colectiva Evaluación de programas paralelos Herramientas de depuración y monitorización

    edu.red

    Recordar concurrencia pthreads contarPar.c: Número de apariciones de un número en un vector (Gp:) 6 2 0 7 4 9 3 4 9 8 0 6 7 9 6 0 6 7 9 8 6 2 5 2 6 4 7 9 3 5 2 1 7 3 2 6 6 4 4 0 (Gp:) const N = 40; objetivo = 6; numCPUs = 4; var vector array[1..N] of integer;

    ¿ Algoritmo paralelo ? (Gp:) T1 (Gp:) T2 (Gp:) T3 (Gp:) T4

    (Gp:) 1 (Gp:) 3 (Gp:) 2 (Gp:) 2

    (Gp:) + (Gp:) 8

    edu.red

    Recordar concurrencia pthreads (Gp:) int longRodaja, numVecesLocal[MAX_ESCLAVOS], *vector;

    void *esclavo (void *parametro) { ….. }

    int main (int argc, char *argv[]) { int i, numVeces, cardinalidad = atoi (argv[1]); int numEsclavos = atoi (argv[2]); pthread_t pids[MAX_ESCLAVOS];

    // Pedir memoria e inicializar vector

    // Crear esclavos y esperar a que terminen su trabajo for (i = 0; i < numEsclavos; i++) pthread_create (&pids[i], NULL, esclavo, (void *) i); for (i = 0; i < numEsclavos; i++) pthread_join (pids[i], NULL);

    // Sumar los valores de todos e informar del resultado numVeces = numVecesLocal[0]; for (i = 1; i < numEsclavos; i++) numVeces = numVeces + numVecesLocal[i]; printf (“Veces que aparece = %dn”, numVeces); }

    (Gp:) %cuentaPar 1000000 4

    edu.red

    Recordar concurrencia pthreads // Variables globales int longRodaja, numVecesLocal[MAX_ESCLAVOS], *vector;

    void *esclavo (void *parametro) { int yo, inicio, fin, i, j, numVeces;

    yo = (int) parametro; inicio = yo * longRodaja; fin = inicio + longRodaja;

    // Buscar en mi parte del vector numVeces = 0; for (i = inicio, i < fin; i++) if (vector[i] == NUM_BUSCADO) numVeces++; numVecesLocal[yo] = numVeces; pthread_exit (NULL); }

    edu.red

    Recordar concurrencia pthreads (Gp:) 5 (Gp:) 1,286 (Gp:) 4,26 (Gp:) 0,85 (Gp:) 6 (Gp:) 1,127 (Gp:) 4,86 (Gp:) 0,81 (Gp:) 7 (Gp:) 1,113 (Gp:) 4,92 (Gp:) 0,70 (Gp:) 8 (Gp:) 0,998 (Gp:) 5,49 (Gp:) 0,69

    (Gp:) Esclavos (Gp:) Tiempo (Gp:) Aceleración (Gp:) Eficiencia (Gp:) 1 (Gp:) 5,480 (Gp:) 2 (Gp:) 2,721 (Gp:) 2,01 (Gp:) 1,01 (Gp:) 4 (Gp:) 1,408 (Gp:) 3,89 (Gp:) 0,97

    (Gp:) cuentaPar 400.000.000 1..8 // Recorriéndolo diez veces (Gp:) 2 Xeon E5520 Quad 2,26GHz • 8ML3 • 12GB • 500GB

    edu.red

    Recordar concurrencia pthreads descifra.c: Descifrar una clave basada en “crypt” (Gp:) char *crypt(const char *key, const char *salt); (Gp:) crypt (“abrir”, “aa”) => “aaHUVtmrCqHAw” crypt (“ajaja”, “aa”) => “aaCV68P63epR6” crypt (“clave”, “aa”) => “aa80JYxYfBfpI”

    (Gp:) claveCruda (Gp:) claveCifrada

    ¿ aaSjbUR3erIrQ ? (Gp:) if (crypt (claveCruda, “aa”) == claveCifrada) encontrada else siguiente (claveCruda) (Gp:) aaaaa .. zzzzz

    ¿ Paralelo ? (Gp:) 5 letras (Gp:) |a..z| = 26

    edu.red

    Recordar concurrencia pthreads descifraPar.c: Descifrar una clave basada en “crypt” 4 núcleos (Gp:) aaaaa (Gp:) zzzzz

    (Gp:) ¿Qué claves a cada proceso? (Gp:) 0 (Gp:) 1 (Gp:) 2 (Gp:) 3

    (Gp:) aaaaa .. fzzzz (Gp:) gaaaa .. lzzzz (Gp:) maaaa .. szzzz (Gp:) taaaa .. zzzzz

    (Gp:) ? (Gp:) ? (Gp:) ?

    (Gp:) aaaaa, aaaae, .. (Gp:) aaaab, aaaaf, .. (Gp:) aaaac, aaaag, .. (Gp:) aaaad, aaaah, ..

    saltoRana ¿Cómo terminar? (Gp:) encontrada (Gp:) varComún

    edu.red

    Recordar concurrencia pthreads #define MAX_ESCLAVOS 16 #define FRECUENCIA_MUESTREO 1000

    //————- VARIABLES GLOBALES ——————————— int encontrada, numEsclavos; char cifradaBuscada [LONG_CLAVE_CIFRADA+1];

    static void esclavo (int yo) { int i; int totalClaves, iMiPrimeraClave, clavesPorEsclavo; char clave [LONG_CLAVE_CRUDA+1]; char cifradaActual [LONG_CLAVE_CIFRADA+1];

    // Inicializaciones totalClaves = numClavesPosibles(); clavesPorEsclavo = totalClaves / numEsclavos; iMiPrimeraClave = (yo-1) * clavesPorEsclavo; if (yo == (numEsclavos)) clavesPorEsclavo = totalClaves – iMiPrimeraClave;

    // Busqueda en mi trozo del espacio de claves claveCrudaIesima (iMiPrimeraClave, clave); for (i=0; i< clavesPorEsclavo; i++) { if (((i%FRECUENCIA_MUESTREO) == 0) && encontrada) break; cifrar (clave, cifradaActual); if (strcmp (cifradaActual, cifradaBuscada) == 0) { encontrada = TRUE; printf ("%s ", clave); break; } siguienteClaveCruda (clave); } }

    edu.red

    Recordar concurrencia pthreads int main(int argc, char *argv[]) { int numClaves, i; struct timeval t0, tf, t; pthread_t pids[MAX_ESCLAVOS];

    numEsclavos = atoi(argv[2]); numClaves = abrir (argv[1]);

    // Inicializacion if (leerClaveCifrada (cifradaBuscada) != 0) { printf ("La clave no es correcta n"); return 0; } gettimeofday (&t0, NULL);

    encontrada = FALSE; // Crear esclavos y esperar a que terminen su trabajo for (i=1; i< =numEsclavos; i++) pthread_create (&pids[i], NULL, esclavo, (void *) i); for (i=1; i< =numEsclavos; i++) pthread_join (pids[i], NULL); gettimeofday (&tf, NULL);

    timersub (&tf, &t0, &t); printf ("Tiempo => %ld:%ld seg:msegn", t.tv_sec, t.tv_usec/1000); return 0; } ¡¡ No la encuentran !! (Gp:) No reentrante (Gp:) crypt()

    (Gp:) crypt_r()

    edu.red

    Recordar concurrencia pthreads (Gp:) 2 Threads (Gp:) 0:000 (Gp:) 11:114 (Gp:) 13:654 (Gp:) 23:208 (Gp:) 0:016 (Gp:) 5:635 (Gp:) 11:761 (Gp:) 11:991 (Gp:) 14:594 (Gp:) 23:487 (Gp:) 115:460

    (Gp:) 4 Threads (Gp:) 0:000 (Gp:) 10:905 (Gp:) 1:991 (Gp:) 11:735 (Gp:) 0:015 (Gp:) 5:042 (Gp:) 11:799 (Gp:) 0:109 (Gp:) 2:912 (Gp:) 11:857 (Gp:) 56:365

    (Gp:) claves (Gp:) aaaaa (Gp:) galas (Gp:) hojas (Gp:) musas (Gp:) nadas (Gp:) pumas (Gp:) tizas (Gp:) tomos (Gp:) vasos (Gp:) zzzzz (Gp:) Total (Gp:) secuencial (Gp:) 0:000 (Gp:) 10:819 (Gp:) 13:571 (Gp:) 23:065 (Gp:) 23:420 (Gp:) 28:406 (Gp:) 34:818 (Gp:) 35:196 (Gp:) 37:842 (Gp:) 46:796 (Gp:) 253:933 (Gp:) PC9: 2 Xeon E5520 Quad 2,26GHz

    edu.red

    Opciones de programación (Gp:) Entornos de programación paralela en los 90 “Tim Mattson – Intel”

    edu.red

    Opciones de programación (Gp:) 1 A Pattern Language for Parallel Programming 2 Background and Jargon of Parallel Computing 3 The Finding Concurrency Design Space 4 The Algorithm Structure Design Space 5 The Supporting Structures Design Space 6 The Implementation Mechanisms Design Space 7 A Brief Introduction to OpenMP 8 A Brief Introduction to MPI 9 A Brief Introduction to Concurrent Programming in Java (Gp:) 2005

    Partes: 1, 2
    Página siguiente