150 likes | 313 Views
Mezclando MPI y OpenMP. Multicore Clusters. El diagrama siguiente (que se podria considerar de un diagrama de aquellos 4 procesadores de mathcluster que tienen 4 cores cada uno) ilustra dos maneras mediante lo cual se puede ejecutar programas paralelos en clusters con multicores:
E N D
Multicore Clusters El diagrama siguiente (que se podria considerar de un diagrama de aquellos 4 procesadores de mathcluster que tienen 4 cores cada uno) ilustra dos maneras mediante lo cual se puede ejecutar programas paralelos en clusters con multicores: • Crear un proceso MPI (P) para todo CPU (b) Crear un proceso MPI para todo multiprocesador y crear hilos (t) para ocupar los CPUs
C+MPI vs. C+MPI+OpenMP C + MPI C + MPI + OpenMP
C + MPI + OpenMPpueden ejecutarse mas rápidamente • Los gastos de comunicación pueden ser menor • Mas porciones del programa se podrían ser paralelizar • Podría hacer posible que se le traslapen mejor las comunicaciones y las computaciones
Ejemplo - El Problema de Todos Pares Distancias mas Cortas • Dado un grafo dirigido con pesos, ¿cuales son las trayectorias de largos mínimos (es decir “distancias mas cortas”) entre todos los pares de vértices?
A B C D E A 0 6 3 ∞ ∞ B 4 0 ∞ 1 ∞ C ∞ ∞ 0 5 1 D ∞ 3 ∞ 0 ∞ E ∞ ∞ ∞ 2 0 Ejemplo 4 A B 3 6 1 3 5 C 1 D 2 E Matríz de Adyacencias
El Algoritmo de Floyd for k 0 to n-1 for i 0 to n-1 for j 0 to n-1 a[i,j] min (a[i,j], a[i,k] + a[k,j]) endfor endfor endfor (donde a es la nXn matríz de adjacencias)
Computed in previous iterations La Idea del Algoritmo La trayectoria mas corta de i a k que pasa por 0, 1, …, k-1 i k La trayectoria mas corta de i a j que pasa por 0, 1, …, k-1 La trayectoria mas corta de k a j que pasa por 0, 1, …, k-1 j
Comunicaciones Poner al dia a[3,4] Cuando k=1 Primitive tasks Iteraciónk: Toda tarea en la fila k emite su valor a los procesos en la misma columna Iteración k: Toda tarea en la columna k emite su valor a los procesos en la misma fila
La implementación MPI de Floyd • Aglomerar tareas en filas. • Durante toda iteración k del bucle exterior, el dueño de k emiterá los n elementos de la fila k
La parte principal de la implementación • tmp = (dtype *) malloc (n * sizeof(dtype)); • for (k = 0; k < n; k++) • { root = BLOCK_OWNER(k, p, n); • if (root == id) • { offset = k - BLOCK_LOW(id, p, n); • for (j = 0; j < n; j++) • tmp[j] = a[offset][j]; • } • MPI_Bcast (tmp, n, MPI_TYPE, root, MPI_COMM_WORLD); • for (i = 0; i < BLOCK_SIZE(id, p, n); i++) • for (j = 0; j < n; j++) • a[i][j] = MIN(a[i][j], a[i][k] + tmp[j]); • } • free (tmp);
La introducción de OpenMP en el programa • Se puede paralelizar el segundo bucle for insertando #pragma omp parallel for private(j) antes del segundo for • Para asignar la cantidad de hilos al momento de ejecutar, insertamos omp_set_num_threads(atoi(argv[2])) • También, hay que incluir #include <omp.h>
Para compilar y link el nuevo programa MPI-OpenMP mpicc –fopenmp –c mixedfloyd.c (donde mixedfloyd.c es el archivo que contiene elnuevo programa). mpicc –c MyMPI.c Mpicc –fopenmp mixedfloyd.o MyMPI.o –o mixedf
Para ejecutarlo mpirun –hostfile hosts –np p ./mixedf arch h donde hosts es un hostfile, p es cualquier entero positivo, arch es un archivo que contiene la matriz de ajacencias del grafo (que se puede preparar usando el programa gen4Floyd.c), y h es el número de hilos.
¿Cual es el rendimiento mejor que se puede esperar? • Debido a la arquitectura de mathcluster, es interesante experimentar con el archivo hosts como sigue mathcluster slots=1 max_slots=4 compute-0-0 slots=1 max_slots=4 compute-0-1 slots=1 max_slots=4 compute-0-2 slots=1 max_slots=4 • Si usamos este hostfile, cuales son los valores optimos de p y h?