Академический Документы
Профессиональный Документы
Культура Документы
Implementacin distribuida de un
algoritmo paralelo de datos usando MPI
En esta prctica se aborda la implementacin paralela del algoritmo de Floyd para el clculo
de todos los caminos ms cortos en un grafo etiquetado. Se desarrollarn dos versiones paralelas
del algoritmo que dieren en el enfoque seguido para distribuir los datos entre los procesos. Por
simplicidad, se asume que las etiquetas de las aristas del Grafo de entrada son nmeros enteros.
Los objetivos de esta prctica son:
Comprender la importancia de la distribucin de los datos en la resolucin paralela de un
problema.
Adquirir experiencia en el uso de las funciones y mecanismos de la interfaz de paso de
mensajes al abordar la paralelizacin de un problema de anlisis de grafos.
Si i = j
0
long(vi , vj ) Si (vi , vj ) E
=
En otro caso
Camino desde un vrtice vi hasta un vrtice vj : secuencia de aristas (vi, vk ), (vk , vl ), . . . , (vm, vj )
donde ningn vrtice aparece ms de una vez.
Camino ms corto entre dos vrtices vi y vj : camino entre dicho par de vrtices cuya suma
Problema de todos los caminos ms cortos: consiste en encontrar los camino ms corto
desde todos los pares de vrtices del grafo.
El Algoritmo para calcular todos los caminos ms cortos toma como entrada la matriz de
incidencia del Grafo A y calcula una matriz S de tamao N N donde Si,j es la longitud
del camino ms corto desde vi a vj , o un valor si no hay camino entre dichos vrtices.
El k-simo paso del algoritmo considera cada Iij y determina si el camino ms corto conocido
desde vi a vj es mayor que las longitudes combinadas de los caminos desde vi a vk y desde vk a
vj , en cuyo caso se actualizar la entrada Iij . La operacin de comparacin se realiza un total de
N 3 veces, por lo que aproximamos el coste secuencial del algoritmo como tc N 3 siendo tc el coste
de una operacin de comparacin.
procedure floyd secuencial
begin
Ii,j = A
for k := 0 to N-1
for i := 0 to N-1
for j := 0 to N-1
k+1
k , Ik + Ik }
Ii,j
= min{Ii,j
k,j
i,k
end;
end;
En la iteracin k, cada proceso, adems de sus datos locales, necesita los valores Ik,0 , Ik,1 , . . . , Ik,N 1 ,,
es decir, la la k de I (vase gura 1.1). Por ello, el proceso que tenga asignada dicha la k debe
difundirla a todos los dems procesos (usando MPI_Bcast).
contiguas) con N/ P elementos cada uno (vase gura 1.2) y ejecuta el siguiente algoritmo:
procedure floyd paralelo 2
begin
Ii,j = A
for k := 0 to N-1
for i := local_i_start to local_i_end
for j := local_j _start to local_j _end
k+1
k , Ik + Ik }
Ii,j
= min{Ii,j
i,k
k,j
end;
En cada paso, adems de los datos locales, cada proceso necesita N/ P valores de dos procesos localizados en la misma la y columna respectivamente (vase gura 1.2). Por tanto, los
requerimientos de comunicacin en la etapa k son dos operaciones de broadcast:
3
Desde el proceso en cada la (de la malla de procesos) que contiene parte de la columna k
al resto de procesos en dicha la.
Desde el proceso en cada columna (de la malla de procesos) que contiene parte de la la k
al resto de procesos en dicha columna.
En cada uno de los N pasos, N/ P valores deben difundirse a los P procesos en cada la y
en cada columna d ela malla de procesos. Ntese que cada proceso debe servir de origen (root)
para al menos un broadcast a cada proceso en la misma la y a cada proceso en la misma columna
del malla lgica 2D de procesos.
consecutiva, de tal forma que al repartirlas (usando el tipo MPI_PACKED, se le asigna una submatriz cuadrada a cada proceso. A continuacin, se muestra la secuencia de operaciones necesarias
para empaquetar todos los bloques de una matriz N N de forma ordenada y repartirlos con un
MPI_Scatter entre los procesos:
MPI_Datatype MPI_BLOQUE;
......
......
raiz_P=sqrt(P);
tam=N/raiz_P;
/*Creo buffer de envo para almacenar los datos empaquetados*/
buf_envio=reservar_vector(N*N);
if (rank==0)
{
/* Obtiene matriz local a repartir*/
Inicializa_matriz(N,N,matriz_I);
/*Defino el tipo bloque cuadrado */
MPI_Type_vector (tam, tam, N, MPI_INT, &MPI_BLOQUE);
/* Creo el nuevo tipo */
MPI_Type_commit (&MPI_BLOQUE);
/* Empaqueta bloque a bloque en el buffer de envo*/
for (i=0, posicion=0; i<size; i++)
{
/* Calculo la posicion de comienzo de cada submatriz */
fila_P=i/raiz_P;
columna_P=i%raiz_P;
comienzo=(columna_P*tam)+(fila_P*tam*tam*raiz_P);
MPI_Pack (matriz_I(comienzo), 1, MPI_BLOQUE,
buf_envio,sizeof(int)*N*N, &posicion, MPI_COMM_WORLD);
}
MPI_Unpack
matriz-vector, las medidas debern excluir las fases de entrada/salida, as como la fase
de distribucin inicial de la matriz A desde el proceso P0 y la fase de reunin de la
matriz resultado en P0 .
Las medidas debern realizarse para diferentes tamaos de problema, para as poder
comprobar el efecto de la granularidad sobre el rendimiento de los algoritmos.
Se presentar una tabla con el siguiente formato:
Tiempo
P = 1 (secuencial)
P =4
Ganancia
n = 60
n = 240
n = ...
n = 1200