Vous êtes sur la page 1sur 14

Algoritmos Paralelos para la

Multiplicaci on de Matrices
David Aparco C ardenas
ResumenLa multiplicaci on de matrices grandes
requiere mucho tiempo de computaci on como su
complejidad es O(n
3
). Debido a que la mayora de
aplicaciones actuales requieren un mayor rendimiento
computacional con el mnimo tiempo, muchos algoritmos
secuenciales y paralelos son desarrolados. Los algoritmos
paralelos reducen signicativamente el tiempo de ejecuci on
de los algoritmos secuenciales cuando son ejecutados con
varios procesadores. Este artculo presenta una exposici on
detallada y la correspondiente implementaci on en el
entorno de programaci on MPI de cuatro algoritmos
paralelos para la multiplicaci on de dos matrices A y B.
Los algoritmos primero y segundo son el algoritmo de
Descomposici on en bloques de rayas por columnas y el
algoritmo de Descomposici on en bloques de rayas por
las respectivamente, los cuales descomponen a la matriz
A en bloques de las y a la matriz B en bloques de
columnas para el primero y bloques de las para el
segundo. Los algoritmos tercero y cuarto son el algoritmo
de Fox y el algoritmo de Cannon respectivamente los
cuales descomponen las matrices A y B en bloques de
sub-matrices cuadradas las cuales luego son distribuidas
entre los procesadores, la diferencia entre ambas se
encuentra en el desplazamiento de los sub-bloques de
matrices el cual es diferente en cada algoritmo. El presente
estudio se realiza con el n de hallar experimentalmente
en una m aquina quad-core de 64 bits, el algoritmo
paralelo que presenta el menor tiempo de ejecuci on para
el producto de dos matrices A y B, donde el orden de las
matrices vara en el transcurso del experimento.
Palabras Clave: computaci on paralela, bloques
de rayas, fox, cannon, mpi, sub-bloques de matrices
I. INTRODUCCI

ON
L
A multiplicaci on de matrices es una de las
operaciones m as fundamentales del algebra
lneal, el cual tiene numerosas aplicaciones a la
teora y pr actica de la computaci on. En particular,
varias aplicaciones importantes se dan debido al
hecho que la multiplicaci on de matrices es una
parte sustancial de varios algoritmos conocidos
para otros problemas computacionales de algebra
lineal y combinatoria, tales como la soluci on de
un sistema de ecuaciones lineales, la inversi on de
una matriz, la evaluaci on de la determinante de
una matriz, multiplicaci on de matrices booleanas,
y el cierre transitivo de un grafo[5][11]. Como
otro ejemplo, algunas transformaciones usadas
en el procesamiento de se nales se basan en la
multiplicaci on de grandes matrices. Y as se
pueden mencionar muchas otras aplicaciones de
la multiplicaci on de matrices.[2] Por otra parte,
el tiempo de la computaci on requerido para la
multiplicaci on de matrices es la parte dominante del
tiempo total requerido para la computaci on de todos
esos problemas, los cual es, tales problemas pueden
ser reducidos a la multiplicaci on de matrices y
pueden ser resueltos r apidamente si la multiplicaci on
de matrices es resuelta r apidamente[4]. El algoritmo
m as sencillo para la multiplicaci on de matrices
realiza O(n
3
) operaciones. Strassen [9]fue el primero
en demostrar que este algoritmo no es optimo,
dando un algoritmo de complejidad O(n
2.81
) para el
problema. Muchas mejoras le siguieron. El algoritmo
para la multiplicaci on de matrices m as r apido que
existe actualmente, con una complejidad de O(n
2.38
)
fue obtenido por Coppersmith y Winograd[8].
Incluso luego de estas mejoras estos algoritmos han
demostrado limitaciones en su rendimiento. Por esta
raz on, aproximaciones paralelas han sido examinadas
por d ecadas. La mayora algoritmos paralelos para la
multiplicaci on de matrices usan la descomposici on
de matrices que se basa en el n umero de procesadores
disponibles. Esto incluye la descomposici on en
bloques de rayas, el algoritmo de Cannon y el
algoritmo de Fox. El algoritmo de Cannon y
el algoritmo de Fox usan la descomposici on de
matrices en submatrices. Durante la ejecuci on del
proceso, un procesor calcula un resultado parcial
utilizando las submatrices que est an actualmente
siendo accedidas por el. Luego sucesivamente este
procesador realiza el mismo c alculo en nuevas
submatrices, a nadiendo el nuevo resultado al previo.
Cuando los subprocesos de multiplicaci on han
1
sido completados, el procesador raz ensambla los
resultados parciales y genera el resultado completo
de la multiplicaci on de matrices[2].
II. CONSIDERACIONES INICIALES
Consideraremos que el n umero de procesadores
de una m aquina es p,
Por simplicidad trabajaremos con matrices
cuadradas,
Las matrices a multiplicar A y B, ser an tratadas
como matrices densas (esto es con poca cantidad
de 0s),
T
p
es el tiempo que emplean p procesadores
para resolver el problema.
En el coste de comunicaciones, el tiempo
para transmitir n datos entre dos procesadores
conectados es dado por t
s
+ nt
w
, donde t
s
es el tiempo empleado para establecer la
comunicaci on y t
w
es el tiempo que tarda en
transmitir un dato.
III. MULTIPLICACI

ON SECUENCIAL DE
MATRICES
A. Iterativo, Algoritmo Orientado a Filas.
El producto de una matriz A de orden lm y de
una matriz B de orden mn es una matriz C de
orden ln cuyos elementos est an denidos por
c
i,j
=
m1

k=0
a
i,k
b
k,j
Un algoritmo secuencial implementando la
multiplicaci on de matrices de forma secuencial se
muestra en la gura 1. El algoritmo requiere lmn
adiciones y el mismo n umero de multiplicaciones.
Por lo tanto la complejidad al multiplicar dos
matrices de orden nn usando este algoritmo
secuencial es (n
3
)
Input :
a[0..l 1, 0..m1]
b[0..m1, 0..n 1]
Output :
c[0..l 1, 0..n 1]
1: for i 0, l 1 do
2: for j 0, n 1 do
3: c[i, j] 0
4: for k 0, m1 do
5: c[i, j] c[i, j] + a[i, j] b[j, k]
6: end for
7: end for
8: end for
Fig. 1. Multiplicaci on de Matrices Secuencial
Considere la gura 2. Durante cada iteraci on del
bucle externo indexado por i, cada elemento de la
matriz B es ledo. Si la matriz B es demasiado
grande para el cach e, entonces los elementos ledos
posteriormente en cach e desplazaran a los elementos
ledos anteriormente en cach e, sigicando que en
la siguiente iteraci on del loop indexado por i,
todos los elementos de B necesitar an ser ledos en
cach e nuevamente. Por lo tanto una vez que las
matrices alcancen un determinado tama no, la tasa de
aciertos de la memoria cach e cae dramaticamente,
disminuyendo el rendimiento de la CPU.[2]
Fig. 2. En cada iteraci on del bucle indexado por i, la la i de la
matriz A y toda la matriz B son ledas, mientras la la i de C es
escrita.
IV. ALGORITMOS PARALELOS PARA LA
MULTIPLICACI

ON DE MATRICES
A. Descomposici on en bloques de rayas.
Es una aproximaci on de grano no, donde la
subtarea b asica es el c alculo de un elemento de
la matriz C.
c
ij
= (a
i
, b
T
j
)
a
i
= (a
i0
, a
i1
, ..., a
i(n1)
), b
T
j
= (b
0j
, b
1j
, ..., b
(n1)j
)
T
2
El n umero de subtareas b asicas es igual a n
2
, como
regla el n umero disponible de procesadores es menor
a n
2
(p < n
2
), as que ser a necesario realizar el
escalamiento de la subtarea.
La subtarea agregada es el c alculo de una la de la
matriz C (el n umero de subtareas es n).
La distribuci on de datos sera la descomposici on
en bloques de rayas por las para la matriz A y la
descomposici on en bloques de rayas por columnas
para la matriz B.[1]
Fig. 3. Descomposici on en bloques de rayas por las en las matriz
A, y por columnas en la matriz B.
An alisis de las Dependencias de Informaci on.
Cada subtarea tiene una la de la matriz A y
una columna de la matriz B.
En cada iteraci on cada subtarea realiza el
c alculo del producto interno de su la
y columna, como resultado el elemento
correspondiente de la matriz C es obtenido.
Luego cada subtarea i, 0 i < n, enva su
columna de la matriz B a la subtarea con el
n umero (i + 1) mod n.
Luego de todas las iteraciones del algoritmo,
todas las columnas de la matriz B estuvieron
dentro de cada subtarea una despu es de otra.
Fig. 4. Primera etapa, a cada procesador se le entrega una la y una
columna de la matriz A y B respectivamente, y luego se procede a
obtener el resultado del producto de la por columna.
Fig. 5. Segunda etapa, se envian los bloques de columnas de la matriz
B en sentido horario, y luego se procede a obtener el resultado del
producto la por columna.
Fig. 6. Tercera etapa, se procede a realizar los mismo que la segunda
etapa.
Fig. 7. Cuarta etapa, se procede a realizar los mismo que la tercera
etapa.
Agregaci on y Distribuci on de las Subtareas entre
los Procesadores.
En el caso en el que el n umero de procesadores
p es menor que el n umero de subtareas b asicas
n, los c alculos pueden ser agregados de tal
manera que cada procesador ejecutara varios
productos internos entre las de la matriz A
y columnas de la matriz B. En este caso
luego de completar el c alculo, cada subtarea
agregada b asica determina varias las de la
matriz resultante C.
Bajo tales condiciones la matriz inicial A es
descompuesta en p rayas horizontales y la
matriz B es descompuesta en p rayas verticales.
La distribuci on de las subtareas entre
los procesadores tiene que vericar los
requerimientos de una representaci on efectiva
de la estructura del anillo de las dependencias
de informaci on de las subtareas.
Otra posible aproximaci on para la distribuci on de
datos es la descomposici on en bloques de rayas
3
para las matrices A y B.
Fig. 8. Descomposicon en bloques de rayas por las en las matriz
A y en la matriz B.
An alisis de las Dependencias de Informaci on.
Cada subtarea tiene una la de la matriz A y
una la de la matriz B.
En cada iteraci on las subtareas realizan la
multiplicaci on elemento a elemento de las las;
como resultado la la de resultados parciales
para la matriz C es obtenida.
Luego cada subtarea i, 0 i < n, enva su la
de la matriz B hacia la subtarea con el n umero
(i + 1) mod n.
Luego de todas las iteraciones todas las las de
la matriz B estuvieron dentro de cada subtarea
una despu es de otra.
Fig. 9. Primera etapa, a cada procesador se le entrega una la de la
matriz A y una la de la matriz B, y luego se procede a obtener el
resultado parcial del producto de la por la.
Fig. 10. Segunda etapa, se envian los bloques de las de la matriz B
en sentido horario a los procesadores, y luego se procede a obtener
el resultado del producto parcial la por la.
Fig. 11. Tercera etapa, se procede a realizar los mismo que la segunda
etapa.
Fig. 12. Cuarta etapa, se procede a realizar los mismo que la tercera
etapa.
B. Algoritmo de Fox.
La distribuci on de datos presenta un esquema de
tablero de damas.
Fig. 13. Esquema de tablero de damas.
La subtarea b asica es un procedimiento que calcula
todos los elementos de un bloque de la matriz C.

A
00
...A
0(q1)
...
A
(q1)0
...A
(q1)(q1)

B
00
...B
0(q1)
...
B
(q1)0
...B
(q1)(q1)

C
00
...C
0(q1)
...
C
(q1)0
...C
(q1)(q1)

C
ij
=
q1

s=0
A
is
B
sj
An alisis de las Dependencias de Informaci on.
Las subtareas con el n umero (i,j) calculan
el bloque C
ij
, de la matriz resultante C.
Como resultado, la subtareas forman la malla
bidimensional q q.
Cada subtarea tiene 4 bloques de matrices:
4
El bloque C
ij
de la matriz resultante C, el
cual es calculado en la subtarea.
El bloque A
ij
de la matriz A, el cual fue
ubicado en la subtarea antes de que el
c alculo empiece.
Los bloques A

ij
y B

ij
de la matriz A y de
la matriz B, los cuales son recibidos por
la subtarea durante los c alculos.[3]
- durante la iteracion l, 0 l < q, el algoritmo
realiza:
La subtarea (i,j) enva su bloque A
ij
de la
matriz A a todas las subtareas de la misma
la horizontal i de la malla; el ndice j, el cual
determina la posici on de la subtarea en la la,
puede ser obtenido usando la ecuaci on:
j = (i + l) mod q,
Cada subtarea realiza la multiplicaci on de los
bloques recibidos A

ij
y B

ij
y luego a nade el
resultado al bloque C
ij
.
C
ij
= C
ij
+ A

ij
B

ij
Cada subtarea (i,j) enva su bloque B

ij
a su
vecino, el cual est a previamente en la misma
lnea vertical (los bloques de las subtareas de
la primera la son enviadas a las subtareas de
la ultima la de la malla).[3]
Fig. 14. Se procede a enviar el bloque de matriz correspondiente de
la matriz A a trav es de su la, luego se calcula el producto con la
matriz B.
Fig. 15. Se procede a desplazar las las de la matriz B una posici on
hacia arriba en forma circular.
Fig. 16. Se procede a enviar los siguientes bloques de matrices de la
matriz A a trav es de sus las.
Fig. 17. Se procede a hallar el producto de la matriz A y la matriz
B, mediante los bloques de matrices.
Escalando y Distribuyendo las Subtareas entre
los Procesadores.
Los tama nos de los bloques de matrices pueden
ser seleccionados de tal manera que el n umero
de subtareas puede coincidir con el n umero
disponible de procesadores p,
La ejecuci on m as eciente del algoritmo
paralelo de Fox puede ser provista cuando la
5
topologa de la red de comunicaci on es una
malla bidimensional.
En este caso las subtareas pueden ser
distribuidas entre los procesadores en una forma
natural: La subtarea (i,j) tiene que ser ubicada
en el procesador p
i,j
.
C. Algoritmo de Cannon.
La distribuci on de datos presenta un esquema de
tablero de damas.
Fig. 18. Esquema de las Dependencias de Informaci on.
La subtarea b asica es un procedimiento, que
calcula todos los elementos de un bloque de la matriz
C.

A
00
...A
0(q1)
...
A
(q1)0
...A
(q1)(q1)

B
00
...B
0(q1)
...
B
(q1)0
...B
(q1)(q1)

C
00
...C
0(q1)
...
C
(q1)0
...C
(q1)(q1)

C
ij
=
q1

s=0
A
is
B
sj
An alisis de las Dependencias de Informaci on.
La subtarea con el n umero (i, j) calcula
el bloque C
ij
de la matriz resultante C.
Como resultado, las subtareas forman la malla
bidimensional q q.
La distribuci on inicial de los bloques de
matrices en el algoritmo de Cannon es
seleccionado de tal manera que la multiplicaci on
del primer bloque puede ser realizada sin envo
de datos adicionales:
Al inicio cada subtarea (i, j) tiene los
bloques A
ij
y B
ij
,
Para la i- esima la de la malla de subtareas
los bloques de la matriz A son desplazados
(i 1) posiciones a la izquierda,
Para la j- esima columna de la malla de
subtareas los bloques de la matriz B son
desplazadas (j 1) posiciones hacia arriba,
La operaci on de envo de datos es un ejemplo
de comunicaci on de desplazamiento circular,
Fig. 19. Redistribuci on de los bloques de matrices en la primera
etapa del algoritmo
Luego de la redistribuci on, el cual ha sido
efectuado en la primera etapa, los bloques de
matrices pueden ser multiplicados sin ning un
envo de datos adicional,
Para obtener el resto de bloques luego de la
operaci on de multiplicaci on de bloques:
Los bloques de la matriz A son desplazados
una posici on a la izquierda a lo largo de
las la de la malla,
Los bloques de la matriz B son desplazados
un posici on hacia arriba a los largo de las
columnas de la malla.
Escalando y Distribuyendo las Subtareas entre
los Procesadores.
Los tama nos de los bloques de matrices
pueden ser seleccionados de tal manera que
el n umero de subtareas coincida con el n umero
de procesadores disponibles p,
6
La ejecuci on m as eciente del algoritmo
paralelo de Cannon puede ser proveida cuando
la topologa de la red de comunicaciones es una
malla bidimensional.
En este caso las subtareas pueden ser
distribuidas entre los procesadores de una
manera natural: la subtarea (i, j) tiene que ser
ubicada en el procesador p
ij
[2].
V. IMPLEMENTACI

ON EN MPI
A. Algoritmos de Descomposici on en bloques de
rayas.
La implementaci on de los algoritmos de
descomposici on en bloques de rayas por columnas
y por las se realiza de la siguiente manera:
Primeramente en la implementaci on de la
descomposici on en bloques de rayas por columnas
se crea un nuevo tipo de variable con la funci on
MPI Type vector, lo cual nos permite poder crear
un tipo de variable en MPI que referencia a las
columnas de B.
Luego se procede a enviar los bloques de las de la
matriz A a todos los procesadores con la funci on
MPI Scatter, posteriormente se procede a enviar los
bloques de columnas de la matriz B a todos los
procesadores.
El envo de los bloques de rayas de B es
diferente seg un sea por columnas o por las. Si
la descomposici on por bloques de rayas para B
es por las entonces est a se realiza simplemente
con la funci on MPI Scatter, mientras que para
el algoritmo de descomposici on por bloques de
rayas por columnas, se utiliza la variable column
creada anteriormente para el envo y recepci on
de columnas. La implementaci on de la funci on
que permite enviar bloques de columnas de B se
presenta en el C odigo 1.
void desc_col_send(
float
*
matrix_A,
float
*
matrix_B,
float
*
local_A,
float
*
local_B,
MPI_Datatype column,
int n,
int my_rank,
int local_n
) {
int i, j;
/
*
Creacion de un nuevo tipo de variable
llamado column
*
/
MPI_Type_vector(n, 1, n, MPI_FLOAT, &column);
MPI_Type_commit(&column);
/
*
Enviar los bloques de filas de la matriz A
a todos los procesadores
*
/
MPI_Scatter(matrix_A, local_n
*
n, MPI_FLOAT,
local_A, local_n
*
n, MPI_FLOAT, 0,
MPI_COMM_WORLD);
/
*
Enviar los bloques de columnas de la matriz
B a todos los procesadores
*
/
if (my_rank == 0) {
for (i = 0; i < local_n; i++) {
MPI_Sendrecv(&matrix_B[local_n
*
my_rank+i],
1, column, 0, 0, &local_B[i
*
n], n, MPI_FLOAT,
0, 0, MPI_COMM_WORLD, &status);
}
for (i = 1; i < size; i++) {
for (j = 0; j < local_n; j++) {
MPI_Send(&matrix_B[local_n
*
i + j], 1,
column, i, 0, MPI_COMM_WORLD);
}
}
} else {
for(j = 0; j < local_n; j++) {
MPI_Recv(&local_B[j
*
n], n, MPI_FLOAT, 0,
0, MPI_COMM_WORLD, &status);
}
}
}
C odigo 1. Funci on para enviar los bloques de las de la matriz
A y los bloques de columnas de la matriz B en el algoritmo de
Descomposici on en bloques de rayas por columnas.
Luego se realiza la implementaci on del bucle
de etapas, el cual halla los productos parciales de la
matriz resultante C.
Finalmente, se recogen todos los bloques de los
resultados de la matriz C en un solo resultado
con la funci on MPI Gather. El algoritmo de la
descomposici on en bloques de rayas por las realiza
operaciones an alogas s olo que se envian las de B
en lugar de columnas.
Las implementaciones del algoritmo de
descomposici on en bloques de rayas por columnas
y del algoritmo de descomposici on en bloques de
rayas por las se encuentran en el C odigo 2 y el
C odigo 3 respectivamente.
void desc_columnas(
float
*
matrix_A,
float
*
matrix_B,
float
*
matrix_C,
float
*
local_A,
float
*
local_B,
float
*
local_C,
MPI_Datatype column,
int n,
int my_rank,
int size,
int local_n
) {
int stage, i, j, k, temp, q, source, dest, ind;
7
/
*
Envio de los valores de n y local_n a todos
los procesadores
*
/
MPI_Bcast(&local_n, 1, MPI_INT, 0, MPI_COMM_
WORLD);
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
desc_col_send(&matrix_A, &matrix_B, &local_A,
&local_B, column, n, local_n, my_rank);
/
*
Se definen el destino y la fuente del envio
de los bloques de columnas de la matriz B
*
/
source = (my_rank - 1 + size) % size;
dest = (my_rank + 1) % size;
q = n / local_n;
/
*
Se definen el bucle de etapas del
algoritmo
*
/
for (stage = 0; stage < q; stage++) {
for (i = 0; i < local_n; i++) {
for (k = 0; k < local_n; k++) {
temp = (my_rank - stage + size) % size;
ind = local_n
*
temp + i
*
n + k;
local_C[ind] = 0.0;
/
*
Realizar el producto de local_A y
local_B
*
/
for (j = 0; j < n; j++) {
local_C[ind] +=
local_A[j+i
*
n]
*
local_B[j+k
*
n];
}
}
}
/
*
Se envia y recibe los bloques de columnas
de la matriz B
*
/
MPI_Send(local_B, local_n
*
n, MPI_FLOAT,
dest, 0, MPI_COMM_WORLD);
MPI_Recv(local_B, local_n
*
n, MPI_FLOAT,
source, 0, MPI_COMM_WORLD, &status);
}
/
*
Recolectar los bloques de filas de local_C
de cada procesador en matrix_C
*
/
MPI_Gather(local_C, local_n
*
n, MPI_FLOAT,
matrix_C, local_n
*
n, MPI_FLOAT, 0,
MPI_COMM_WORLD);
}
C odigo 2. Implementaci on del algoritmo de descomposici on por
bloques de las para la matriz A y por bloques de columnas para la
matriz B en MPI.
void desc_filas(
float
*
matrix_A,
float
*
matrix_B,
float
*
matrix_C,
float
*
local_A,
float
*
local_B,
float
*
local_C,
int n,
int my_rank,
int size,
int local_n
) {
int stage, i, j, k, q, source, dest, ind;
/
*
Enviar los valores de local_n y n a todos
los procesadores
*
/
MPI_Bcast(&local_n, 1, MPI_INT, 0,
MPI_COMM_WORLD);
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
/
*
Enviar los bloques de filas de A a todos
los procesadores
*
/
MPI_Scatter(matrix_A, local_n
*
n, MPI_FLOAT,
local_A, local_n
*
n, MPI_FLOAT, 0,
MPI_COMM_WORLD);
/
*
Enviar los bloques de filas de B a todos
los procesadores
*
/
MPI_Scatter(matrix_B, local_n
*
n, MPI_FLOAT,
local_B, local_n
*
n, MPI_FLOAT,
0, MPI_COMM_WORLD);
/
*
Se definen el destino y la fuente del envio
de los bloques de columnas de la matriz B
*
/
source = (my_rank - 1 + size) % size;
dest = (my_rank + 1) % size;
q = n / local_n;
Set_to_zero(local_C);
/
*
Se definen el bucle de etapas del
algoritmo
*
/
for (stage = 0; stage < q; stage++) {
ind = (my_rank - stage + size) % size;
for (j = 0; j < local_n; j++) {
for (i = 0; i < n; i++) {
/
*
Realizar el producto de local_A y
local_B
*
/
for (k = 0; k < local_n; k++) {
local_C[i + j
*
n] +=
local_A[local_n
*
ind+k+j
*
n]
*
local_B[i+k
*
n];
}
}
}
/
*
Se envia y recibe los bloques de filas
de la matriz B
*
/
MPI_Send(local_B, local_n
*
n, MPI_FLOAT,
dest, 0, MPI_COMM_WORLD);
MPI_Recv(local_B, local_n
*
n, MPI_FLOAT,
source, 0, MPI_COMM_WORLD, &status);
}
/
*
Recolectar los bloques de filas de local_C
de cada procesador en matrix_C
*
/
MPI_Gather(local_C, local_n
*
n, MPI_FLOAT,
matrix_C, local_n
*
n, MPI_FLOAT, 0,
MPI_COMM_WORLD);
}
C odigo 3. Implementaci on del algoritmo de descomposici on por
bloques de las para la matriz A y por bloques de las para la matriz
B en MPI.
B. Algoritmos de Fox y Cannon.
Para la implementaci on de los algoritmos de
Fox y de Cannon, escribiremos una funci on que
crea varios comunicadores y asociaciones de datos.
Como esto requiere una gran cantidad de variables,
y adem as usaremos esta informaci on en otras
funciones, pondremos esto en una estructura para
facilitar el paso como par ametro.
La creaci on de una topologa cartesiana en
MPI nos va a permitir en las implementaciones
correspondientes a los algoritmos de Fox y de
Cannon, un manejo m as facil de los envos de
bloques a traves de las las y las columnas de
las respectivas mallas de procesos, ya que esto nos
permite crear subcomunicadores en las y columnas.
Para esto vamos a usar una estructura que identica
a cada proceso, incluyendo los comunicadores de los
8
cuales el proceso forma parte. La implementaci on
de la estructura se muestra en el C odigo 4.
typedef struct {
/
*
Total de procesos
*
/
int p;
/
*
Comunicador del grid
*
/
MPI_Comm comm;
/
*
Comunicador para la fila
*
/
MPI_Comm row_comm;
/
*
Comunicador para la columna
*
/
MPI_Comm col_comm;
/
*
Orden del grid
*
/
int q;
/
*
Numero de fila
*
/
int my_row;
/
*
Numero de columna
*
/
int my_col;
/
*
Rank en el comunicador del
grid
*
/
int my_rank;
} GRID_INFO_T;
C odigo 4. Implementaci on de la estructura que identica a cada
proceso.
Tambi en se va a utilizar una estructura que
representa a la matriz local en cada proceso, es decir
el sub-bloque de matriz que cada proceso recibe
luego de haber realizado la descomposici on en
sub-bloques de matrices y la respectiva distribuci on
entre los procesos.
El C odigo 5 muestra la implementaci on de la
estructura que representa a la matriz local en cada
proceso.
typedef struct {
// Indica el orden del sub-bloque
int n_bar;
/
*
Define un alias para el orden del sub-bloque
*
/
#define Order(A) ((A)->n_bar)
/
*
Vector que almacena los elementos del sub-bloque
*
/
float entries[MAX];
/
*
Define un alias para un elemento del subloque
*
/
#define Entry(A, i, j) (
*
(((A)->
entries) + ((A)->n_bar)
*
(i) + (j)))
} LOCAL_MATRIX_T;
C odigo 5. Implementaci on de la estructura que representa a la matriz
local en cada proceso.
En la implementaci on se dene un nuevo
tipo de datos llamado local matrix mpi t el cual
representa una matriz local en cada proceso a partir
de la estructura LOCAL MATRIX T lo que nos va
a permitir y facilitar el envo y recepci on de bloques
de matrices entre las y columnas conforme vaya
avanzando el algoritmo.
Luego de crear un comunicador de la topologa
cartesiana que se requiere para todos los
procesadores con la funci on MPI Cart create,
se procede a particionar la malla de procesos creada
en submallas, tanto para las las como para las
columnas, es decir, se crean comunicadores que
permitan comunicaci on entre los procesos de una
la o una columna en la malla de procesos global
con la funci on MPI Cart sub para el consecuente
envo y recepci on de bloques de submatrices a
trav es de las o columnas.
Las coordenadas de cada proceso en la malla de
procesos que se cre o se obtiene con la funci on
MPI Cart coords las cuales luego se guardan en
las variables grid.my row para la la y grid.my col
para la columna a la cual pertenece cada procesos,
las mismas que se encuentran en la estructura
mencionada en el C odigo 4.
Los algoritmos de Fox y de Cannon tienes similares
implementaciones, variando b asicamente en el
movimiento de los sub-bloques de matrices de la
matriz B en cada etapa.
Las implementaciones de los algoritmos de
Fox y de Cannon se muestran en el C odigo 6 y el
C odigo 7 respectivamente.
void Fox(
int n,
GRID_INFO_T
*
grid,
LOCAL_MATRIX
*
local_A,
LOCAL_MATRIX
*
local_B,
LOCAL_MATRIX
*
local_C
) {
LOCAL_MATRIX
*
temp_A;
int stage; /
*
Representa la
etapa del algoritmo
*
/
int bcast_root;
int n_bar;
int source;
int dest;
MPI_Status status;
n_bar = n/grid->q;/
*
Indica el orden del
sub-bloque (matriz local)
*
/
Set_to_zero(local_C);
/
*
Calcula las direcciones para el
desplazamiento circular de B
*
/
source = (grid->my_row + 1)%grid->q;
dest = (grid->my_row + grid->q - 1)%grid->q;
/
*
Almacena espacio para el envio del bloque
de A
*
/
temp_A = Local_matrix_allocate(n_bar);
/
*
Bucle de etapas
*
/
for (stage = 0; stage < grid->q; stage++) {
/
*
Calcula que bloque se va a enviar a
traves de las filas
*
/
bcast_root = (grid->my_row + stage)%grid->q;
/
*
Se encarga del envio de los bloques de A
a traves de sus filas
*
/
if (bcast_root == grid->my_col) {
MPI_Bcast(local_A, 1, local_matrix_mpi_t,
9
bcast_root, grid->row_comm);
Local_matrix_multiply(local_A, local_B,
local_C);
} else {
MPI_Bcast(temp_A, 1, local_matrix_mpi_t,
bcast_root, grid->row_comm);
Local_matrix_multiply(temp_A, local_B,
local_C);
}
/
*
Se encarga del desplazamiento de los
bloques de B a traves de sus columnas
*
/
MPI_Sendrecv_replace(local_B, 1,
local_matrix_mpi_t, dest, 0, source, 0,
grid->col_comm, &status);
} /
*
for
*
/
} /
*
Fox
*
/
C odigo 6. Implementaci on del algoritmo de Fox en MPI.
void Cannon(
int n ,
GRID_INFO_T
*
grid ,
LOCAL_MATRIX_T
*
local_A,
LOCAL_MATRIX_T
*
local_B,
LOCAL_MATRIX_T
*
local_C
) {
int stage;
int source_r, source_c;
int dest_r, dest_c;
MPI_Status status;
Set_to_zero(local_C);
for (stage = 0; stage < grid->q; stage++) {
if (stage == 0) {
source_r = (grid->my_col + grid->my_row)
% grid->q;
dest_r = (grid->my_col+grid->q-grid->my_row)
% grid->q;
source_c = (grid->my_row + grid->my_col)
% grid->q;
dest_c = (grid->my_row+grid->q-grid->my_col)
% grid->q;
MPI_Sendrecv_replace(local_A, 1,
local_matrix_mpi_t, dest_r, 0, source_r, 0,
grid->row_comm, &status);
MPI_Sendrecv_replace(local_B, 1,
local_matrix_mpi_t, dest_c, 0, source_c, 0,
grid->col_comm, &status);
Local_matrix_multiply(local_A, local_B,
local_C);
} else {
source_r = (grid->my_col + 1) % grid->q;
dest_r = (grid->my_col + grid->q - 1)
% grid->q;
source_c = (grid->my_row + 1) % grid->q;
dest_c = (grid->my_row + grid->q - 1)
% grid->q;
MPI_Sendrecv_replace(local_A, 1,
local_matrix_mpi_t, dest_r, 0, source_r,
0, grid->row_comm, &status);
MPI_Sendrecv_replace(local_B, 1,
local_matrix_mpi_t, dest_c, 0, source_c,
0, grid->col_comm, &status);
Local_matrix_multiply(local_A, local_B,
local_C);
}
} /
*
for
*
/
} /
*
Cannon
*
/
C odigo 7. Implementaci on del algoritmo de Cannon en MPI.
VI. EVALUACI

ON EXPERIMENTAL
Todos los experimentos fueron ejecutados en una
m aquina con un procesador dual-core IntelCore
TM
i3-2350M corriendo con 2.30 GHz, 4GB de RAM,
y 500 GB de disco duro. El procesador simula
un procesador quad-core mediante la tecnologa
hyperthreading. El sistema operativo utilizado fue
Ubuntu 13.10 de 64 bits.
Los experimentos se desarrollaron con un
n umero cuadrado perfecto de procesos, ya que
es el n umero requerido por los algoritmos de
Fox y Cannon. Adem as el orden de las matrices
fueron divisibles por la raz cuadrada del n umero
de procesos. Los algoritmos de descomposici on
por bloques de rayas por las y por columnas no
requieren este requisito, solo necesitan que el orden
de las matrices sean divisibles por el n umero de
procesos. Para la uniformidad en la realizaci on
del experimento se tomaron un n umero cuadrado
perfecto de procesos.
El primer experimento desarrollado fue la evaluaci on
de todos los algoritmos, tanto el secuencial como
los paralelos. El algoritmo secuencial se corri o
con s olo un proceso, mientras que los algoritmos
paralelos se corrieron con 4 procesos. obteniendo
los tiempos en segundos en la tabla 1. Se obtuvo
claramente una reducci on del tiempo de ejecuci on
en los algoritmos paralelos en comparaci on con el
algoritmo secuencial.
Esta diferencia se hizo mas evidente cuando el
orden de las matrices creca.
Tabla 1 : Algoritmos para la Multiplicaci on de Matrices, Secuencial
y Paralelos, desde el m as r apido al m as lento.
n Algoritmo
1 Desc. por Columnas
2 Desc. por Filas
3 Fox y Cannon
4 Secuencial
El segundo experimento desarrollado fue la
comparaci on de rendimiento entre los algoritmos
paralelos corridos con diferente n umero de procesos,
10
precisamente con 4 y 9 procesos.
Al realizar la ejecuci on de los algoritmos con
4 procesos, se obtiene como resultado que los
algoritmo de Fox y Cannon tienen un rendimiento
muy similar, los cuales son los m as lentos, luego
viene el algoritmo de Descomposici on en bloques
de rayas por las y siendo el algoritmo m as r apido
el algoritmo de Descomposici on en bloques de
rayas por columnas.
Tabla 2 : Algoritmos Paralelos para la Multiplicaci on de Matrices
desde el m as r apido al m as lento.
n Algoritmo
1 Desc. por Columnas
2 Desc. por Filas
3 Fox y Cannon
Al realizar la ejecuci on de los algoritmos con
9 procesos, se obtiene como resultado una
ralentizaci on del tiempo de ejecuci on de los
algoritmos lo cual se debe a la no existencia de
los 9 procesadores fsicos, ya que la m aquina
solo cuenta con un procesador quad-core simulado
mediante hyperthreading, adem as las operaciones
que realiza cada procesador es independiente de
otras operaciones, as que lo que sucede es que
cada procesaor realiza el trabajo de dos o m as
procesadores, consecuentemente ralentizando el
proceso. A un bajo esta deciencia de procesadores
se obtiene el mismo resultado que al correrlo con
4 procesadores, es decir los algoritmos de Fox
y Cannon muestran un rendimiento muy similar
siendo los algoritmos m as lentos, luego viene
el algoritmo por Descomposici on en bloques de
rayas por las y siendo el algoritmo m as r apido el
algoritmo de Descomposici on en bloques de rayas
por columnas.
Los tama nos de los sub-bloques de matrices
en los algoritmos de Fox y Cannon no se
modicaron debido a la necesidad de que el n umero
de procesadores debe ser siempre un cuadrado
perfecto, as que se necesitaran 4, 9, 16, 25, ...
procesadores, con lo cual la m aquina en la cual se
realiz o el experimento no cont o.
Si se realizaran las pruebas con un n umero cuadrado
perfecto de procesadores los resultados podran
variar, siendo la diferencia entre el tiempo de
ejecuci on de los algoritmos paralelos diferente.
Las Tabla 3 muestra los tiempos de ejecuci on
de los algoritmos secuencial, descomposici on en
bloques de rayas por columnas, descomposici on en
bloques de rayas por las, algoritmo de Fox y el
algoritmo de Cannon. Los tiempos se obtuvieron
para diferentes valores de n, donde n es el orden
de las matrices. La Tabla 4 y la Tabla 5 muestra
lo mismo que la Tabla 3 s olo que para algoritmos
paralelos, donde varian el orden de las matrices as
como tambi en el n umero de procesos usados.
Tabla 3 : Resultados de las pruebas con el algoritmo secuencial y
con los algoritmos paralelos con 4 procesos.
n secuencial fox cannon columnas las
100 0.013 0.007 0.004 0.011 0.003
200 0.115 0.036 0.034 0.037 0.027
300 0.421 0.109 0.106 0.106 0.085
400 1.020 0.266 0.253 0.263 0.195
500 2.197 0.515 0.509 0.520 0.380
600 4.905 0.945 0.914 0.906 0.651
700 8.316 1.556 1.572 1.489 1.042
800 12.744 2.472 2.341 2.353 1.560
900 19.459 3.772 3.920 3.685 2.254
1000 28.275 5.332 5.410 5.327 3.120
1100 37.625 7.383 6.967 7.535 4.138
1200 46.006 10.048 9.590 9.305 5.369
1300 63.223 13.148 13.079 13.265 6.816
1400 80.378 16.148 16.093 16.612 8.718
1500 102.166 21.094 20.721 21.134 10.365
1600 121.269 23.475 24.043 23.505 13.048
1700 155.612 30.737 30.700 31.229 15.219
1800 185.411 36.888 37.088 37.227 18.065
1900 223.159 43.847 43.436 44.885 21.516
2000 250.386 51.197 51.091 47.893 24.892
Nota : n indica el orden de las matrices; los tiempos obtenidos est an
en segundos.
Fig. 20. Gr aco comparativo entre los algoritmos para la
multiplicaci on de matrices.
11
Fig. 21. Gr aco comparativo entre los algoritmos para la multiplicaci on
de matrices.
Tabla 4 : Resultados de las pruebas de la comparaci on entre los
algoritmos paralelos con 4 procesos.
n fox cannon columnas las
500 0.555 0.562 0.413 0.594
1000 5.748 5.821 3.618 5.760
1500 24.694 22.441 12.188 22.466
2000 56.297 53.960 29.205 51.337
2500 115.826 109.863 55.995 109.901
3000 197.441 195.338 94.616 194.774
3500 333.874 335.016 149.720 307.527
4000 485.203 486.080 216.485 461.495
4500 747.743 746.517 312.831 687.361
5000 1057.940 1071.888 414.371 1010.247
Nota : n indica el orden de las matrices; los tiempos obtenidos est an
en segundos.
Fig. 22. Gr aco comparativo entre los algoritmos paralelos para la
multiplicaci on de matrices.
Fig. 23. Gr aco comparativo entre los algoritmos paralelos para la
multiplicaci on de matrices.
Tabla 5 : Resultados de las pruebas de la comparaci on entre los
algoritmos paralelos con 9 procesos.
n fox cannon columnas las
600 1.200 1.183 0.880 1.556
1200 9.774 9.972 5.867 9.639
1800 36.180 35.707 20.724 36.140
2400 88.718 86.349 43.916 79.492
3000 190.054 192.634 88.463 175.864
3600 309.693 308.910 147.635 300.138
4200 544.088 532.041 228.694 526.650
4800 809.645 810.702 341.534 780.368
5400 1237.267 1220.376 487.096 1091.212
Nota : n indica el orden de las matrices; los tiempos obtenidos est an
en segundos.
Fig. 24. Gr aco comparativo entre los algoritmos paralelos para la
multiplicaci on de matrices.
12
Fig. 25. Gr aco comparativo entre los algoritmos paralelos para la
multiplicaci on de matrices.
VII. DISCUSIONES
La reducci on del tiempo de ejecuci on entre el
algoritmo secuencial y los algoritmos paralelos se
fundamenta b asicamente en la reducci on signicativa
de la cantidad de bucles realizados por el algoritmo.
Si consideramos que el algoritmo secuencial tiene 3
bucles anidados con cada bucle de tama no n. Esto
toma mucho tiempo, especialmente si n es lo bastante
grande.
En el algoritmo de descomposici on en bloques de
rayas por columnas y por las existen tambi en 3
bucles anidados, pero solo uno de ellos es de tama no
n, mientras que los otros dos son de tama no local n,
donde local n depende de el n umero de procesos
usados, mientras mayor sea el n umero de procesos
entonces, menor ser a local n y por lo tanto menor
ser a el trabajo que realice cada proceso terminando
m as r apidamente.
En los algoritmos de Fox y Cannon hay un
bucle global de tama no igual al n umero de
etapas que necesita el algoritmo para nalizar su
ejecuci on. El bucle global engloba a la funci on
Local matrix multiply la cual es una funci on que
tiene tres bucles anidados de tama no igual al orden
de las sub-matrices en las cuales se ha dividido
las matrices A y B. Por lo tanto si el orden de
las sub-matrices es menor, entonces menor ser a
tambi en el tiempo de ejecuci on de los algoritmos.
Recordemos que el orden de las submatrices depende
del n umero de procesos que se escoja para correr el
programa, mientras mayor sea el n umero de procesos,
entonces menor ser a el orden de las sub-matrices y
por lo tanto se reducir a el tiempo de ejecuci on de
los algoritmos de Fox y Cannon.
En general si el n umero de procesadores aumenta
entonces el tama no de los bucles en los algoritmos
paralelos disminuye y por lo tanto el tiempo de
ejecuci on disminuye.
VIII. CONCLUSIONES
Los algoritmos paralelos para la multiplicaci on
de matrices permiten reducir el tiempo de ejecuci on
signicativamente respecto al algoritmo secuencial,
y esto se hace a un mas evidente cuando el orden de
las matrices empieza a crecer.
Los algoritmos paralelos m as r apidos obtenidos
experimentalmente fueron los algoritmos de
Descomposici on en bloques de rayas por columnas
y Descomposici on en bloques de rayas por
las, siendo el m as r apido el algoritmo de
Descomposici on en bloques de rayas por columnas.
La superioridad de los algoritmos de
Descomposici on en bloques de rayas por las
y de Descomposici on en bloques de rayas por
columnas sobre los algoritmos de Fox y Cannon se
deben b asicamente a los costos de comunicaci on
entre procesos, ya que en los algoritmos de Fox y
Cannon existe una mayor divisi on en sub-bloques
de las matrices a diferencia de los algoritmos
de Descomposici on en bloques de rayas, lo cual
implica una mayor cantidad de comunicaciones
entre los procesos.
Si el n umero de procesadores fsicos con los que se
cuenta no es muy grande entonces conviene m as
usar el algoritmo de descomposici on en bloques de
rayas por columnas, de otra manera convendra m as
usar el algoritmo de Fox o el algoritmo de Cannon.
Los c odigos de las implementaciones de
los algoritmos paralelos en MPI para
la multiplicaci on de matrices se pueden
encontrar en la siguiente direccion web :
https://github.com/DavidAparco/MatrixMultiplication
IX. TRABAJOS RELACIONADOS Y TRABAJOS A
FUTURO
Existen varios otros algoritmos paralelos adem as
de los mencionados en este artculo que presentan
una aproximaci on diferente a los tratados en este
13
artculo como el algoritmo de SUMMA [14],
PUMMA [15] y DIMMA[16].
En este trabajo hemos desarrollado los algoritmos
paralelos para la multiplicaci on de matrices, los
cuales fueron corridos en una m aquina quad-core
de 64 bits, lo cual limit o el an alisis experimental
de los algoritmos de Fox y Cannon, ya que no
se cont o con una mayor cantidad de procesadores.
Los trabajos a futuro buscaran poder correr los
algoritmos paralelos en m aquinas con un mayor
n umero de procesadores, adem as de aplicar los
algoritmos paralelos a problemas pr acticos como
la predicci on del clima, sistemas de bases de datos,
compresi on de datos y otros. Adem as un trabajo a
futuro podra ser la implementaci on en OpenMP de
los algoritmos tratados en este artculo.
REFERENCIAS BIBLIOGR

AFICAS
[1] V. Kumar, A. Grama, A. Gupta, G. Karypis, Introduction to
Parallel Computing, 2nd ed. Addison-Wesley, 2003.
[2] M. J. Quinn, Parallel Programming in C with MPI and OpenMP.
New York,NY:McGraw-Hill, 2004.
[3] G. C. Fox, S. W. Otto, A. J. G. Hey, Matrix Algorithms on a
Hypercube I: Matrix Multiplication. Parallel Computing. 4H.
17-31
[4] M. Nakkeeran, R. M. Chandrasekaran, Parallel Matrix
Multiplication Implementation In Distributed Environment
Through RMI. Journal of Theoretical and Applied Information
Technology. 2005-2011. 73-78
[5] Ziad A. A. Alqadi, Musbah Aqel, Ibrahiem M. M. El
Emary, Performance Analysis and Evaluation of Parallel Matrix
Multiplication Algorithms. World Applied Sciences Journal.
2008. 211-214
[6] Yuster Raphael, Uri Zwick, Fast Sparse Matrix Multiplication.
12th Annual European Symposium on Algorithms. 2004
[7] V. Pan, How to multiply matrices faster. Lecture Notes in
Computer Science, Volume 179. Springer-Verlag. 1985
[8] D. Coppersmith, S. Winograd, Matrix multiplication via
arithmetic progressions. Journal of Symbolic Computation.
1990. 9:251-280
[9] V. Strassen, Gaussian elimination is not optimal. Numerische
Mathematik. 1969. 13:354-356
[10] R. Yuster, U. Zwick, Detecting short directed cycles using
rectangular matrix multiplication and dynamic programming. In
Proc. of 15th SODA. 2004. 247-253
[11] N. Alon, R. Yuster, U. Zwick, Finding and counting given length
cycles. Algorithmica. 1997. 17:209-223
[12] D. Kratsch, J. Spinrad, Between O(nm) and O(n

). In Proc.
of 14th SODA. 2003. 709-716
[13] A. Shpilka, Lower bounds for matrix product. SIAM Journal
on Computing. 2003. 32:1185-1200
[14] Robert A. van de Geijn, Jerrell Watts, SUMMA : Scalable
Universal Matrix Multiplication Algorithm. Concurrency Comput.
Practice Experience, 9 (1997), pp 255-274
[15] Choi J., J. J. Dongarra, and D. W. Walker, PUMMA :
Parallel Universal Matrix Multiplication Algorithms on distributed
memory concurrent computers. Concurrency: Practice and
Experiencce, Vol. 6(7), 543-570, 1994
[16] Jaeyooung Choi, , A New Parallel Matrix Multiplication
Algorithm on Distributed-Memory Concurrent Computers. High
Performance Computing on the Information Superhighway, 1997,
pp 224-229
14