La taxonmía más famosa en cómputo paralelo es la de Flynn que se basa en el flujo de información (instrucciones y datos) en una computadora. Esta información solo tiene dos valores: uno(single) o varios(multiple). Instruction stream: se refiere a la progresión de instrucciones que se ejecutan en la computadora. Data stream: se refiere a la progresión de los valores de los datos que son llevados a la memoria del CPU.
MPIIntroducción. Taxonomía de Flynn Taxonomía de Flynn SISD (Single Instruction, Single Data) : Computadora de von Neumann. SIMD (Single Instruction, Multiple Data) : En estas computadoras se aplica una instrucción a un grupo de datos simultáneamente. MISD (Multiple Instruction, Single Data) : Ningún tipo de arquitectura cae dentro de este tipo. MIMD (Multiple Instruction, Multiple Data) : Los procesadores obedecen automáticamente sus propias secuencias de instrucciones y las aplican a sus propios datos.
MPIIntroducción. Taxonomía de Flynn Flujo de información
MPIIntroducción. Taxonomía de Flynn Memoria
MPIIntroducción. Taxonomía de Flynn Memoria y procesadores
MPIIntroducción. ¿Qué es MPI? Biblioteca estándar para programación paralela bajo el paradigma de comunicación de procesos mediante pasaje de mensajes.
Biblioteca, no lenguaje. Proporciona funciones.
Propuesta por un comité conformado de especialistas, vendedores y usuarios de HPC: IBM, Intel, TMC, Meiko, Cray, Convex, Ncube PVM, p4, Zipcode, TCGMSG, Chameleon, Express, Linda Especialistas: ARCO, ANL, UC Santa Barbara, Convex, GMD, Syracuse University, Cray Research, LANL, Michigan State University, IBM, Oregon Grad Inst, Intel, NOAA, University of New Mexico, KAI, NSF, Mississippi State University, Meiko, ORNL, U of Southampton, NAG, PNL, Univeristy of Colorado, nCUBE, Sandia, Yale U, ParaSoft, SDSC, University of Tennessee, Shell, SRC, University of Maryland, TMC, Western Michigan Univeristy, University of Edinburgh, Cornell University, Rice University, University of San Francisco
Objetivo: desarrollar un estándar portable y eficiente, para programación paralela.
MPIIntroducción. ¿Qué es MPI? Fue diseñado para HPC sobre computadoras masivamente paralelas y clusters.( Memoria distribuida).
Paralelismo explícito ( definido y controlado en su totalidad por el programador)
Modelo de programa: SPMD
Único mecanismo de comunicación: MP.
Existen implementaciones libres y algunas particulares para ciertas plataformas. MPICH, LAM, OpenMPI, winmpich.
MPI se puede usar con: C, C++, Fortran 77/90/95.
Java(?), más información : mpiJava, Java grande.
MPIIntroducción. ¿Qué es MPI? Actualmente es muy maduro, fácil de entender, eficiente y existe mucho software alrededor de MPI.
Características de MPI-1.1 (1995) Modular, portable, heterogeneo, comunicaciones seguras, subgrupos, topologías, herramientas para medición de desempeño, comunicación punto a punto, comunicación colectiva.
Características de MPI-1.2 y MPI-2 (1997) Extensiones, aclaraciones y correcciones de MPI-1.1. MPI-2: manejo y creación de procesos, operaciones colectivas extendidas, interfases externas, entrada/salida, language bindings.
MPICH2 (http://www.mcs.anl.gov/research/projects/mpich2)
MPIIntroducción. ¿Qué es MPI? ¿Cuando usar MPI? Si se requiere un programa paralelo, portable y de buen desempeño.
¿Cuando NO usar MPI? No se requiere paralelismo. Cuando se puede usar HPF, OpenMP, Threads (POSIX, Java, etc.).
MPIGetting started C : Los nombres de todas las funciones de MPI comienzan con el prefijo MPI_. Los tipos y funciones definidas en MPI tienen una letra mayúscula después del prefijo; las letras siguientes son minúsculas.
C++ : Todas las funciones y clases estan en el espacio de nombres MPI, de tal manera que para referirnos a una función de MPI se usa MPI::Xxxxx.
Fortran : Los nombres de todas las funciones de MPI comienzan con el prefijo MPI_ y todas las demás letras son mayúsculas.
MPIGetting started mpi.h y mpif.h proveen de las definiciones básicas de MPI (funciones y tipos).
Para iniciar MPI se usa: int MPI_Init(int *argc, char **argv); (C) void MPI::Init(int& argc, char**& argv); (C++) INTEGER IERR y MPI_INIT(IERR) (Fortran)
Para finalizar MPI se usa: int MPI_Finalize(void); (C) void MPI::Finalize(); (C++) INTEGER IERR y MPI_FINALIZE(IERR) (Fortran)
MPIGetting started. Hello world con C #include #include int main(int argc, char *argv[]) { int rank, size,tam; char Name[MPI_MAX_PROCESSOR_NAME]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Get_processor_name(Name,&tam); printf("Hello world from %s! I am %d of %dn", Name, rank, size); MPI_Finalize(); return 0; }
MPIGetting started. Hello world con C++ #include #include using namespace std; int main(int argc, char *argv[]) { int rank, size; MPI::Init(argc, argv); rank = MPI::COMM_WORLD.Get_rank(); size = MPI::COMM_WORLD.Get_size(); cout << "Hello world! I am " << rank << " of "<< size << endl; MPI::Finalize(); return 0; }
MPIGetting started. Hello world con F program main include ’mpif.h’ integer rank, size, ierr call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) print *, ’Hello world! I am ’, rank , ’ of ’, size call MPI_FINALIZE(ierr) stop end
MPIGetting started. MPI_INIT : La versión de C/C++ acepta los argumentos argc y argv que proveen de argumentos main().
Casi todas las rutinas de Fortran tienen un código entero de error como su último argumento.
En el caso de C/C++ dichas funciones regresan un entero como código de error.
No se garantiza interoperabilidad entre lenguajes.
Programas que mezclan lenguajes funcionarán siempre y cuando solo uno de ellos use MPI.
Todas las funciones que no son de MPI corren de manera local: Por ejemplo: printf() se ejecuta sobre cada procesador
MPIGetting started. Al momento de correr el programa una copia del programa empieza a ejecutarse en cada uno de los nodos seleccionados. En la figura corre en size=3 nodos. Cada proceso obtiene un número de rank individual, entre 0 y size-1. En general podría haber más de un “proceso” en cada “procesador”.
MPIGetting started. ¿Cuantos procesadores hay? MPI_COMM_SIZE
¿Quién soy yo? MPI_COMM_RANK El rango está en [0,SIZE – 1]
MPI_COMM_WORLD La comunicación en MPI toma lugar con respecto a grupos de procesos (comunicadores). El grupo MPI_COMM_WORLD se crea cuando se inicia MPI y contiene todos los procesos de MPI. MPI_COMM_WORLD es el grupo de procesos por omisión. Puede haber subgrupos de procesos.
MPIGetting started. /* Iniciar MPI */ MPI_Init(&argc, &argv);
/* Saber el número que tengo de proceso*/ MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
/* Saber el número de procesos totales */ MPI_Comm_size(MPI_COMM_WORLD, &p);
MPIComunicación punto a punto. Un buen número de funciones de MPI están dedicadas a la comunicación entre pares de procesos (comunicación punto a punto).
Existen múltiples formas distintas de intercambiar un mensaje entre dos procesos, en función del modelo y el modo de comunicación elegido
MPIComunicación punto a punto. MPI define dos modelos de comunicación: bloqueante (blocking) y no bloqueante (nonblocking).
El modelo de comunicación tiene que ver con el tiempo que un proceso pasa bloqueado tras llamar a una función de comunicación, sea ésta de envío o de recepción. Una función bloqueante mantiene a un proceso bloqueado hasta que la operación solicitada finalice. Una función no bloqueante supone simplemente “encargar” al sistema la realización de una operación, recuperando el control inmediatamente. El proceso tiene que preocuparse, más adelante, de averiguar si la operación ha finalizado o no.
Página anterior | Volver al principio del trabajo | Página siguiente |