Monografias.com > Computación > Programación
Descargar Imprimir Comentar Ver trabajos relacionados

Programación basada en paso de mensajes




Enviado por Pablo Turmero



Partes: 1, 2

    Monografias.com

    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

    Monografias.com

    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

    Monografias.com

    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

    Monografias.com

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

    Monografias.com

    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

    Monografias.com

    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

    Monografias.com

    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

    Monografias.com

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

    Monografias.com

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

    Monografias.com

    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

    Monografias.com

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

    Monografias.com

    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 

    Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

    Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

    Categorias
    Newsletter