Mezclando MPI y OpenMP

Download Report

Transcript Mezclando MPI y OpenMP

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:
(a) Crear un proceso MPI (P) para todo CPU
(b) Crear un proceso MPI para todo
multiprocesador y crear hilos (t) para ocupar
los CPUs
P
P
P
P
P
P
P
P
P
P
P
P
P
P
P
P
C + MPI
(a)
Interconnection Network
Interconnection Network
C+MPI vs. C+MPI+OpenMP
Pt
t
t
t
Pt
t
t
t
Pt
t
t
t
Pt
t
t
t
(b)
C + MPI + OpenMP
C + MPI + OpenMP
pueden 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?
Ejemplo
4
A
3
B
6
C 5
1
1
D
E
3
A
B
C
D
E
A
0
6
3
∞
∞
B
4
0
∞
1
∞
C
∞
∞
0
5
1
D
∞
3
∞
0
∞
E
∞
∞
∞
2
0
2
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)
La Idea del Algoritmo
La trayectoria mas corta de i a k
que pasa por 0, 1, …, k-1
i
La trayectoria mas corta
de i a j que pasa por
0, 1, …, k-1
Computed
in previous
iterations
j
k
La trayectoria mas corta
de k a j que pasa por
0, 1, …, k-1
Comunicaciones
Primitive tasks
Iteración k:
Toda tarea
en la fila k
emite su valor
a los procesos
en la misma
columna
Poner al dia
a[3,4]
Cuando k=1
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 el nuevo 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?