La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Arquitecturas Paralelas IF - EHU Arquitecturas Paralelas 9. Herramientas para la programación de aplicaciones paralelas: OpenMP y MPI (introducción). Computadores.

Presentaciones similares


Presentación del tema: "Arquitecturas Paralelas IF - EHU Arquitecturas Paralelas 9. Herramientas para la programación de aplicaciones paralelas: OpenMP y MPI (introducción). Computadores."— Transcripción de la presentación:

1 Arquitecturas Paralelas IF - EHU Arquitecturas Paralelas 9. Herramientas para la programación de aplicaciones paralelas: OpenMP y MPI (introducción). Computadores de alta velocidad (la lista top500).

2 A rquitecturas P aralelas IF - EHU 29 Como sabemos, los sistemas paralelos MIMD presentan dos arquitecturas diferenciadas: memoria compartida y memoria distribuida. El modelo de memoria utilizado hace que la programación de aplicaciones paralelas para cada caso sea esencialmente diferente. Programación aplicaciones paralelas

3 A rquitecturas P aralelas IF - EHU 39 Para los sistemas de memoria distribuida (MPP), el estándar de programación, mediante paso de mensajes, es MPI. Para los sistemas de memoria compartida tipo SMP, la herramienta más utilizada es OpenMP. Otras opciones: UPC (Unified Parallel C) shrmem (Cray) Tarjetas gráficas: CUDA / OpenCL Programación aplicaciones paralelas

4 A rquitecturas P aralelas IF - EHU 49 Earth Simulator Programación aplicaciones paralelas

5 A rquitecturas P aralelas IF - EHU 59 OpenMP una pequeña introducción

6 A rquitecturas P aralelas IF - EHU OpenMP 69 OpenMP es el estándar actual para programar aplicaciones paralelas en sistemas de memoria compartida. Introducción No se trata de un nuevo lenguaje de programación, sino de un API (application programming interface) formado por: directivas para el compilador (C) #pragma omp unas pocas funciones de biblioteca algunas variables de entorno

7 A rquitecturas P aralelas IF - EHU OpenMP 79 El modelo de programación paralela que aplica OpenMP es Fork - Join. En un determinado momento, el thread master genera P threads que se ejecutan en paralelo. thread master FORK JOIN región paralela thread master Introducción

8 A rquitecturas P aralelas IF - EHU OpenMP 89 Todos los threads ejecutan la misma copia del código (SPMD). A cada thread se le asigna un identificador ( tid ). Para diferenciar las tareas ejecutadas por cada thread: if (tid == 0) then... else... constructores específicos de reparto de tareas (work sharing). Introducción

9 A rquitecturas P aralelas IF - EHU OpenMP 99 En resumen, partiendo de un programa serie, para obtener un programa paralelo OpenMP hay que añadir: directivas que especifican una región paralela (código replicado), reparto de tareas (específicas para cada thread), o sincronización entre threads. funciones de biblioteca ( include ): para gestionar o sincronizar los threads.. Introducción

10 A rquitecturas P aralelas IF - EHU OpenMP 109 main () { for (i=0; i<1000; i++) {A[i] = A[i] + 1; B = B + A[i]; } printf( B = %d \n, B); } #pragma omp parallel private(tid) { } tid = omp_get_thread_num(); printf ( thread %d en marcha \n, tid); #pragma omp for schedule(static) reduction(+:B) if (tid==0) Ejemplo

11 A rquitecturas P aralelas IF - EHU OpenMP Procesos paralelos (threads). 1 REGIONES PARALELAS. Ámbito de las variables. 2 REPARTO DE TAREAS. Datos: bucles for. Reparto de iteraciones. Funciones: sections / single /... 3 SINCRONIZACIÓN. Secciones críticas, cerrojos, barreras. Conceptos básicos

12 A rquitecturas P aralelas IF - EHU OpenMP Número de threads estático, una variable de entorno:: > export OMP_NUM_THREADS = 10 dinámico, mediante una función: omp_set_num_threads (10); 0 ¿Quién soy / cuántos somos? tid = omp_get_thread_num(); nth = omp_get_num_threads(); Conceptos básicos

13 A rquitecturas P aralelas IF - EHU OpenMP REGIÓN PARALELA (parallel regions) # pragma omp parallel [VAR,...] { código} Una región paralela es un trozo de código que se va a repetir y ejecutar en paralelo en todos los threads. Las variables de una región paralela pueden ser compartidas ( shared ) o privadas ( private ). Regiones paralelas

14 A rquitecturas P aralelas IF - EHU OpenMP 149 > Un ejemplo sencillo:... #define N 12 int i, tid, nth, A[N]; main ( ) { for (i=0; i

15 A rquitecturas P aralelas IF - EHU OpenMP REPARTO DE TAREAS: bucles Los bucles son uno de los puntos de los que extraer paralelismo de manera sencilla (paralelismo de datos (domain decomposition) de grano fino). Obviamente, la simple replicación de código no es suficiente. Por ejemplo, #pragma omp parallel shared(A) private(i) { for (i=0; i<100; i++) A[i] = A[i] + 1; } ? Reparto de tareas: bucles

16 A rquitecturas P aralelas IF - EHU OpenMP 169 Tendríamos que hacer algo así: #pragma omp parallel shared(A) private(tid,nth, ini,fin,i) {tid = omp_get_thread_num(); nth = omp_get_num_threads(); ini = tid * 100 / nth; fin = (tid+1) * 100 / nth; for (i=ini; i

17 A rquitecturas P aralelas IF - EHU OpenMP 179 #pragma omp parallel [...] { … #pragma omp for [clausulas] for (i=0; i<100; i++) A[i] = A[i] + 1; … } ámbito variables reparto iteraciones sincronización barrera Reparto de tareas: bucles

18 A rquitecturas P aralelas IF - EHU OpenMP 189 for (i=0; i

19 A rquitecturas P aralelas IF - EHU OpenMP 199 for (i=0; i

20 A rquitecturas P aralelas IF - EHU OpenMP 209 ¿Cómo se reparten las iteraciones de un bucle entre los threads? Puesto que el pragma for termina con una barrera, si la carga de los threads está mal equilibrada tendremos una pérdida (notable) de eficiencia. La cláusula schedule permite definir diferentes estrategias de reparto, tanto estáticas como dinámicas. Reparto de las iteraciones

21 A rquitecturas P aralelas IF - EHU OpenMP 219 > Ejemplo #pragma omp parallel for shared(A) private(i) schedule(static,2) for (i=0; i<32; i++) A[i] = A[i] + 1; Recuerda: estáticomenos coste / mejor localidad datos dinámicomás coste / carga más equilibrada pid iteraciones 0:0,1,8,9,16,17,24,25 1:2,3,10,11,18,19,26,27 2:4,5,12,13,20,21,28,29 3:6,7,14,15,22,23,30,31 Reparto de las iteraciones

22 A rquitecturas P aralelas IF - EHU OpenMP 229 #pragma omp parallel [clausulas] { #pragma omp sections [clausulas] { #pragma omp section fun1(); #pragma omp section fun2(); #pragma omp section fun3(); } 2 REPARTO DE TAREAS: funciones También puede usarse paralelismo de función (function decomposition), mediante la directiva sections. Rep.de tareas: funciones fun1 fun2 fun3 pragma omp sections

23 A rquitecturas P aralelas IF - EHU OpenMP REPARTO DE TAREAS: funciones Dentro de una región paralela, la directiva single asigna una tarea a un único thread. Sólo la ejecutará un thread, pero no sabemos cúal. Rep.de tareas: funciones

24 A rquitecturas P aralelas IF - EHU OpenMP SINCRONIZACIÓN Cuando no pueden eliminarse las dependencias de datos entre los threads, entonces es necesario sincronizar su ejecución. OpenMP proporciona los mecanismos de sincronización más habituales: exclusión mutua y sincronización por eventos. Sincronización de threads

25 A rquitecturas P aralelas IF - EHU OpenMP 259 a. Secciones críticas: pragma omp critical Por ejemplo, calcular el máximo y el mínimo de los elementos de un vector. #pragma omp parallel for for (i=0; iMAX) #pragma omp critical(SMAX) { if (A[i]>MAX) MAX = A[i]; } if (A[i]

26 A rquitecturas P aralelas IF - EHU OpenMP 269 a. Secciones críticas: pragma omp atomic Una sección crítica para una operación simple de tipo RMW. Por ejemplo, #pragma omp parallel... {... #pragma omp atomic X = X + 1;... } Sincronización de threads

27 A rquitecturas P aralelas IF - EHU OpenMP 279 b. Cerrojos - omp_set_lock (&C) espera a que el cerrojo C esté abierto; en ese momento, cierra el cerrojo en modo atómico. - omp_unset_lock (&C) abre el cerrojo C. - omp_test_lock (&C) testea el valor del cerrojo C ; devuelve T/F. Sincronización de threads

28 A rquitecturas P aralelas IF - EHU OpenMP 289 > Ejemplo #pragma omp parallel private(nire_it) { omp_set_lock(&C1); mi_it = i; i = i + 1; omp_unset_lock(&C1); while (mi_it

29 A rquitecturas P aralelas IF - EHU OpenMP 299 #pragma omp parallel private(tid) { tid = omp_get_thread_num(); A[tid] = fun(tid); #pragma omp for for (i=0; i

30 A rquitecturas P aralelas IF - EHU OpenMP 309 Variables de entorno y funciones (núm. de hilos, identificadores...) Directiva para definir regiones paralelas #pragma omp parallel [var…] Directivas de reparto de tareas #pragma omp for [var,sched…] #pragma omp sections [var] Directivas y funciones de sincronización #pragma omp critical [c] / atomic #pragma omp barrier cerrojos (set_lock, unset_lock, test_lock) Resumen

31 A rquitecturas P aralelas IF - EHU OpenMP 319 TEXTOS R. Chandra et al.: Parallel Programming in OpenMP Morgan Kaufmann, WEB (especificación 3.0, software…) COMPILADORES de pago libres: p. e., el compilador de C/C++ de Intel Más información

32 A rkitektura P araleloak IF - EHU 329 MPI una pequeña introducción

33 A rquitecturas P aralelas IF - EHU MPI 339 Si para los sistemas SMP la opción es OpenMP, el estándar actual de programación de los sistemas de memoria distribuida, mediante paso de mensajes, es MPI (message-passing interface). Introducción MPI es, básicamente, una librería (grande) de funciones de comunicación para el envío y recepción de mensajes entre procesos. MPI indica explicitamente la comunicación entre procesos, es decir: -- los movimientos de datos -- la sincronización

34 A rquitecturas P aralelas IF - EHU MPI 349 Dos tipos de comunicación: punto a punto global El modelo de paralelismo que implementa MPI es SPMD. if (pid == 1) ENVIAR_a_pid2 else if (pid == 2)RECIBIR_de_pid1 Recuerda: cada proceso dispone de su propio espacio independiente de direcciones. Tipos de comunicación

35 A rquitecturas P aralelas IF - EHU MPI 359 Modos de comunicación (1) síncrona La comunicación no se produce hasta que emisor y receptor se ponen de acuerdo. mediante un búfer El emisor deja el mensaje en un búfer y retorna. La comunicación se produce cuando el receptor está dispuesto a ello. El búfer no se puede reutilizar hasta que se vacíe. Tipos de comunicación

36 A rquitecturas P aralelas IF - EHU MPI 369 Modos de comunicación (2) bloqueante Se espera a que la comunicación se produzca. La comunicación síncrona es siempre bloqueante. En el caso buffered, existen ambas alternativas. no bloqueante Se retorna y se continúa con la ejecución. Más adelante, se comprueba si la comunicación ya se ha efectuado. Tipos de comunicación

37 A rquitecturas P aralelas IF - EHU MPI 379 Cada estrategia tiene sus ventajas e inconvenientes: > síncrona: es más rápida si el receptor está dispuesto a recibir; nos ahorramos la copia en el buffer. Además del intercambio de datos, sirve para sincronizar los procesos. Ojo: al ser bloqueante es posible un deadlock! > buffered: el emisor no se bloquea si el receptor no está disponible, pero hay que hacer copia(s) del mensaje (más lento). Tipos de comunicación

38 A rquitecturas P aralelas IF - EHU MPI 389 MPI gestiona los procesos estáticamente (número y asignación) (MPI2 también dinámicamente). Cada proceso tiene un identificador o pid. MPI agrupa los procesos implicados en una ejecución paralela en comunicadores. Un comunicador agrupa a procesos que pueden intercambiarse mensajes. El comunicador MPI_COMM_WORLD está creado por defecto y engloba a todos los procesos. Introducción

39 A rquitecturas P aralelas IF - EHU MPI 399 Aunque MPI consta de más de 300 funciones, el núcleo básico lo forman sólo 6: 2 de inicio y finalización del programa. 2 de control del número de procesos. 2 de comunicación. Sintaxis: MPI_Funcion(…) Funciones básicas

40 A rquitecturas P aralelas IF - EHU MPI Comienzo y final del programa: > MPI_Init(&argc, &argv); > MPI_Finalize(); Estas dos funciones son la primera y última función MPI que deben ejecutarse en un programa. F. básicas: Init / Finalize

41 A rquitecturas P aralelas IF - EHU MPI Identificación de procesos > MPI_Comm_rank(comm, &pid); Devuelve en pid el identificador del proceso dentro del comunicador comm especificado. Los procesos se identifican mediante dos parámetros: el pid y el grupo ( comm, p.e., MPI_COMM_WORLD ). > MPI_Comm_size(comm, &npr); Devuelve en npr el número de procesos del comunicador comm. F. básicas: Comm_rank / _size

42 A rquitecturas P aralelas IF - EHU MPI 429 Un ejemplo sencillo #include main (int argc, char *argv[]) { int pid, npr, A = 2; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &pid); MPI_Comm_size(MPI_COMM_WORLD, &npr); A = A + 1; printf(Proc. %d de %d activado, A = %d\n, pid,npr,A); MPI_Finalize(); } Funciones básicas

43 A rquitecturas P aralelas IF - EHU MPI Envío y recepción de mensajes La comunicación entre procesos necesita (al menos) de dos participantes: el emisor y el receptor. El emisor ejecuta la función de envío de mensajes, y el receptor la de recepción. A B enviar recibir La comunicación es un proceso cooperativo. Si una de las dos funciones no se ejecuta, la comunicación no tiene lugar (y podría producirse un deadlock!). F. básicas: Send / Receive

44 A rquitecturas P aralelas IF - EHU MPI 449 > MPI_Send(&mess, count, type, dest, tag, comm); - mensaje: [ mess count (tamaño), type ] - receptor: [ dest, comm (grupo) ] - tag : dato de control, de 0 a (tipo de mensaje, orden...) Función básica para enviar un mensaje: F. básicas: Send / Receive

45 A rquitecturas P aralelas IF - EHU MPI 459 > MPI_Recv(&mess, count, type, source, tag, comm, &status); - mensaje (espacio): [ mess, count, type ] - emisor: [ source, comm ] - tag : clase de mensaje... - status : información de control sobre el mensaje recibido Función básica para recibir un mensaje: Recv se bloquea hasta que se recibe el mensaje. F. básicas: Send / Receive

46 A rquitecturas P aralelas IF - EHU MPI #defineN 10 int main (int argc, char **argv) { int pid, npr, orig, dest, ndat, tag; int i, VA[N]; MPI_Status info; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD,&pid); for (i=0;i

47 A rquitecturas P aralelas IF - EHU MPI 479 Síncrono: MPI_Ssend (&mes,count,datatype,dest,tag,comm); Ssend no devuelve control hasta que el receptor comienza la lectura. Inmediato: MPI_Isend (...) ; Retorna nada más ejecutarse; luego, para saber si se ha producido o no la comunicación: MPI_Test (...) devuelve 0 o 1 MPI_Wait (...) espera a que finalice Más tipos de Send / Receive

48 A rquitecturas P aralelas IF - EHU MPI 489 Muchas aplicaciones requieren de operaciones de comunicación en las que participan muchos procesos. La comunicación es colectiva si participan en ella todos los procesos del comunicador. Ejemplo: un broadcast, envío de datos desde un proceso a todos los demás. ¿Uno a uno en un bucle? Comunicaciones colectivas

49 A rquitecturas P aralelas IF - EHU MPI 499 Las funciones de comunicación colectiva son bloqueantes. Todos los procesos que forman parte del comunicador deben ejecutar la función. Tres tipos 1 Movimiento de datos 2 Operaciones en grupo 3 Sincronización Comunicaciones colectivas

50 A rquitecturas P aralelas IF - EHU MPI 509 1aBroadcast: envío de datos desde un proceso ( root ) a todos los demás. A P0 P2P3 P1 A A A (implementación logarítmica en árbol) A P0 P2P3 P1 > MPI_Bcast (&mess, count, type, root, comm); CC: movimento de datos

51 A rquitecturas P aralelas IF - EHU MPI 519 ABCD P0 P2P3 P1 A B C DA B C D P0 P2P3 P1 1bScatter : reparto de datos desde un proceso al resto C B D A A P0 P2P3 P1 CD B A P0 P2P3 P1 CD B ABCD 1cGather: recolección de datos de todos los procesos CC: movimento de datos

52 A rquitecturas P aralelas IF - EHU MPI Reduce (en árbol) Allreduce: todos obtienen el resultado (Reduce + BC) KK: operaciones en grupo A P0 P2P3 P1 CD B A P0 P2P3 P1 CD B A+B+C+D

53 A rquitecturas P aralelas IF - EHU MPI Barreras de sincronización Sincronización global entre todos los procesos del comunicador. MPI_Barrier (comm); La función se bloquea hasta que todos los procesos del comunicador la ejecutan. CC: sincronización

54 A rquitecturas P aralelas IF - EHU MPI 549 > Ejemplo: V(i) = V(i) * V(j) sum = 0; for (j=0; j

55 A rquitecturas P aralelas IF - EHU MPI 559 #include #include mpi.h int main (int argc, char **argv) { int pid, npr, i, n; double PI = ; double h, ×, pi_loc, pi_glob, sum; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD,&pid); MPI_Comm_size(MPI_COMM_WORLD,&npr); if (pid == 0) { printf( Núm de intervalos; scanf("%d",&n); } MPI_Bcast (&n, 1, MPI_INT, 0, MPI_COMM_WORLD); h = 1.0 / (double) n; sum = 0.0; for (i=pid; i

56 A rquitecturas P aralelas IF - EHU MPI 569 De libre distribución: MPICH / LAM En general, previo a la ejecución en paralelo en un máquina tipo cluster, se necesita: - un fichero con la lista de máquinas que conforman el sistema (identificadores en la red). - unos daemons que se ejecuten en cada máquina. - indicar, al ejecutar, el número concreto de procesos que se desea generar: mpiexec -n 8 pi Implementaciones de MPI

57 A rquitecturas P aralelas IF - EHU MPI 579 TEXTOS P. S. Pacheco: Parallel Programming with MPI. Morgan Kaufmann, W. Groop et al.: Using MPI. Portable Parallel Programming with the Message Passing Interface (2. ed.). MIT Press, M. Snir et al.: MPI - The complete reference (vol. 1 y 2). The MIT Press, WEB www-unix.mcs.anl.gov/mpi/ (todo) Más información


Descargar ppt "Arquitecturas Paralelas IF - EHU Arquitecturas Paralelas 9. Herramientas para la programación de aplicaciones paralelas: OpenMP y MPI (introducción). Computadores."

Presentaciones similares


Anuncios Google