150 likes | 386 Views
Curso introductorio intensivo de HPC con MPI. Bibliografía básica. Parallel programing with MPI. Peter Pacheco. USF. 1997. (Códigos C y F) http://www.usfca.edu/mpi
E N D
Bibliografía básica Parallel programing with MPI. Peter Pacheco. USF. 1997. (Códigos C y F) http://www.usfca.edu/mpi Using MPI: Portable Programming With the Message Passing Interface, W. Gropp, E. Lusk, and A. Skellum (MIT Press, Cambridge, 1994). MPI–The Complete Reference, Vol. 1, The MPI Core, M. Snir, S. Otto, S. Huss-Lederman, D. Walker, and J. Dongarra (MIT Press, Cambridge, 1998). MPI–The Complete Reference, Vol. 2, The MPI Extensions, W. Gropp, S. Huss-Lederman, A. Lumsdaine, E. Lusk, B. Nitzberg, W. Saphir, M. Snir, and J. Dongarra (MIT Press, Cambridge,1998). Writing Message-Passing Parallel Programs with MPI. “A two days course” Quick-reference The MPI Forum, http://www.mpi-forum.org Referencias online para subrutinas de MPICH 1.2 http://www-unix.mcs.anl.gov/mpi/www/www3
Que es MPI? MPI es una librería de funciones. • MPI 1.2 tiene 128 funciones!. • MPI 2.0 tiene 152 funciones!. • Buenas noticias: Se puede paralelizar todo usando sólo 6. • Con las 20 que vamos a ver en este curso ya tienen las herramientas para encarar cualquier problema de paralelización “Normal”. • Usamos MPICH (ANL) • LAM Local Area Multicomputer, (OSC/Notre Dame/IU. Licencia BSD) • Muchas implementaciones de muchos proveedores ( Sun, SGI, IBM, HP)
Que contiene cualquier programa de MPI? #Include “mpi.h” (headers files) (INCLUDE “MPIF.H”) Declaración de variables y estructuras de datos (main(int argc, char* argv[])) argumentos en C Inicialización de MPI MPI_Init(&argc, &argv); /* Inicio de MPI * MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); /* rango de procesos */ MPI_Comm_size(MPI_COMM_WORLD, &p); /* numero de procesos */ call MPI_Init(ierr) call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr) call MPI_Comm_size(MPI_COMM_WORLD, p, ierr) Ya esta habilitado el pasaje de mensajes en el main MPI_Finalize(); o call MPI_Finalize(ierr)
Funciones y tipos de datos Las funciones de MPI fueron diseñadas para ser lo mas independiente del lenguaje que fuera posible. Es por eso que todas comienzan con MPI (en MAYUSCULA). Y todos los handles o manejadores están en MAYUSCULA también. (No quiere decir que no lo entienda si no lo están!!) Ejemplo MPI_COMM_WORLD, MPI_REAL, MPI_DOUBLE, ... FORTRAN call MPI_XXXXXXX(parametro1, param2, ..., IERR) C Mezclado: ierr = MPI_Xxxxxxx(param1,param2, ...) Constantes MPI en C y FORTRAN: MPI_COMM_WORLD, MPI_REAL, MPI_DOUBLE, ... Errores C int ierr; ierr = MPI_INIT(&argc,&argv); if (ierr != MPI_SUCCESS) { sale con un error } FORTRAN integer :: ierr call MPI_INIT(ierr) if (ierr.ne.MPI_SUCCESS) STOP ’MPI_INIT fallo!!’
Funciones y tipos de datos Constantes y Códigos de retorno
Funciones y tipos de datos Tipos de datos en FORTRAN Estructura de datos provistas por la API de C MPI MPI Comm – Comunicador MPI Status – Una estructura que porvee info de status de menajeria MPI Datatype – los tipos vistos Se pueden construir nuevos datos con funciones especiales. (MPI_Pack, MPI_Unpack, MPI_Type_strutc + datos derivados)
Manejadores y tipos de datos MPI define sus propias estructuras de datos a las que nos referimos mediante manejadores (handles) handles van y vienen como argumentos en cada funcion de MPI. Ejemplos: MPI SUCCESS: Se usa para verificar error MPI COMM WORLD - Un comunicador (predefinido) que refiere a todos los procesos. Es un entero en FORTRAN, y un objeto MPI Comm en C. MPI define también sus propios tipos de datos (datatypes). Estos pueden enviarse entre las diferentes entornos paralelos Es posible construir tipos utilizando esos tipos MPI básicos utilizando una representación convencional en función de variables normales de C o FORTRAN y/o mediante el llamaodo a rutinas de MPI.
Comunicadores Un comunicador (communicator) es un grupo de procesos que se pueden comunicar entre si. Puede haber muchos comunicadores y un proceso puede pertenecer a múltiples comunicadores Dentro de un comunicador, el rango (rank) del proceso es el numero del proceso (comenzando por 0) que lo identifica de manera única en el comunicador El rango del proceso es utilizado para especificar fuentes o destinos del mensaje que se desea pasar. Un rango puede ser distinto para cada comunicador. MPI COMM WORLD es un comunicador predefinido que abarca a todos los procesos utilizados. Otros comunicadores pueden definirse en subconjuntos de este
El Primer programa en MPI #include <s t d i o . h> #include ”mpi . h ” int main ( int argc , char argv ) int i e r r , myid , numprocs ; MPI I n i t (&argc ,& argv ) ; MPI Comm size (MPI COMMWORLD,&numprocs ) ; MPI Comm rank (MPI COMM WORLD,&myid ) ; p r i n t f ( ” Hel lo World , I am Process %d of %dnn ” , myid , numprocs ) ; i e r r = MPI Final ize ( ) ; program Simp include ’ mpi f . h ’ integer i e r r , myid , numprocs c a l l MPI INIT ( i e r r ) c a l l MPI COMM SIZE(MPI COMM WORLD, numprocs , i e r r ) c a l l MPI COMM RANK(MPI COMM WORLD, myid , i e r r ) wr i te ( , ’ ( ” Hel lo World , I am Process ” , i8 , ” of ” , i 8 ) ’ ) myid ,$ numprocs c a l l MPI FINALIZE ( i e r r ) end program Simp
El Primer programa en MPI (con tiempo) MPI_Barrier(MPI_COMM_WORLD); // Sincroniza start= MPI_Wtime(); if (my_rank != 0) { sprintf(message, "Greetings from process %d!",my_rank); dest = 0; MPI_Send(message, strlen(message)+1, MPI_CHAR, dest, tag, MPI_COMM_WORLD); } else { for (source = 1; source < p; source++) { MPI_Recv(message, 100, MPI_CHAR, source, tag, MPI_COMM_WORLD, &status); printf("%s\n", message); } } MPI_Barrier(MPI_COMM_WORLD); // Sincroniza stop1= MPI_Wtime(); if (my_rank != 0) { printf("Tiempo empleado: %g\n",stop1-start); }
6 instrucciones 6 MPI INIT MPI COMM SIZE MPI COMM RANK MPI SEND MPI RECEIVE MPI FINALIZE
Como Conectarse y correr programas (esto si varia para cada SO!!)
Integración Trapecios h=(b-a)/N, xk=a+kh k=0,1,2,...,N Simpson h=(b-a)/(2m), xk=a+kh k=0,1,2,...,2m
Método de Monte Carlo El valor medio de la función f(x) en el intervalo [a,b] es Sean x1, x2, …xnn puntos cualesquiera en [a,b], Cuando los valores de xi son aleatorios, éste método es conocido como Método de Monte Carlo