La multiplicación de matrices es una de las operaciones más representativas para muchas aplicaciones, ya que involucran un elevado cálculo de datos con complejidad creciente de acuerdo a las dimensiones de las mismas. En la actualidad, dependiendo de las necesidades de cada aplicación, pueden encontrarse métodos variados para estos cálculos. En el presente trabajo se mostrará las diferencias entre un entorno paralelo, mediante una interfaz de paso de mensajes, tanto con un solo computador como con un arreglo de procesadores interconectados.
Los Nueve Principios del Desempeño de la Sostenibilidad
Multiplicacion de matrices: Implementacion en cluster
1. Programación paralela: implementación de clúster para la
resolución de multiplicación de matrices
1
1
1
Gonzalo R. Zenón & Ricardo G. Apaza & Walter C. Tejerina
(1) Grupo de investigación Clustear, Facultad de Ingeniería, Universidad Nacional de Jujuy.
zenewlight@hotmail.com, linux_perico@hotmail.com & walterct87@hotmail.com
RESUMEN: La multiplicación de matrices es una de las operaciones más representativas para muchas
aplicaciones, ya que involucran un elevado cálculo de datos con complejidad creciente de acuerdo a las
dimensiones de las mismas. En la actualidad, dependiendo de las necesidades de cada aplicación, pueden
encontrarse métodos variados para estos cálculos. En el presente trabajo se mostrará las diferencias entre
un entorno paralelo, mediante una interfaz de paso de mensajes, tanto con un solo computador como con
un arreglo de procesadores interconectados.
1
INTRODUCCIÓN
Casi desde el principio de la aplicación del
procesamiento paralelo a los problemas
numéricos se han estudiado, diseñado,
implementado y experimentado distintas formas
de paralelizar la multiplicación de matrices.
Desde el punto de vista del problema mismo, es
muy útil tener una optimización de esta operación
matricial, ya que siempre es posible encontrarla
en las distintas aplicaciones que se deben resolver
en el ámbito numérico.
Desde un punto de vista más cercano a la
investigación, este problema tiene muchas
características que lo hacen adecuado para su
estudio extensivo e intensivo. Las dos más
importantes son su simplicidad, y la posibilidad
de extender sus resultados a otras operaciones
similares.
La multiplicación de matrices es utilizada
ampliamente en distintas aéreas de computo,
donde la cantidad de cálculos en un corto tiempo
es crucial, ya que esto conlleva un alto costo de
procesamiento, y más si de estos cálculos
dependen otros sistemas por lo que se busca una
respuesta ágil a estas operaciones. En este ámbito
la búsqueda de la mayor eficiencia a partir de la
paralelización, ha sido el centro de un gran
esfuerzo en el tiempo.
El presente documento, fue realizado basándonos
en un algoritmo de cálculo de multiplicación de
matrices, mediante la interfaz de paso de
mensajes entre un proceso padre y los esclavos.
2
ESPECIFICACIÓN DE HARDWARE
Las características de las dos computadoras
utilizadas para la realización de dicho trabajo,
pueden observarse en la Tabla 1.
Tabla 1. Características más resaltantes de las
computadoras utilizadas durante las pruebas
realizadas.
Maquina1
Maquina2
Memoria
2GB
512 MB
Intel DualCore Intel Celeron
Procesador
1.86 Ghz
1.7 Ghz
Disco Duro
250 Gb
10 Gb
Los componentes utilizados para el armado de la
red de trabajo fueron, un router wifi TPLink de 4
salidas y 2 cable utp categoría 5 de 1 metro de
longitud cada uno.
2.1
Métricas utilizadas
Las métrica utilizada para nuestra comparación
de rendimiento en este trabajo fue el tiempo de
ejecución de multiplicación de matrices en cluster
y en una maquina común (notebook)
Para la realización de las pruebas se construyó
una red con dos computadoras, una de escritorio y
una
notebook obviamente
de
distintas
características interconectadas entre sí por medio
de una Lan Ethernet sencilla como se muestra en
la Figura 1. Se hicieron correr distintos procesos
en cada máquina, teniendo de esta manera un
2. total de 9 procesos para la realización de las
pruebas.
Para llegar a ciertas conclusiones con respecto al
tiempo lo primero que debemos hacer es analizar
los resultados obtenidos en las ejecuciones de los
algoritmos. Sólo de este modo podremos
demostrar la utilidad y potencialidad del
procesamiento paralelo ejecutado en redes. Cabe
resaltar que dicha configuración se realizó bajo el
entorno Linux
El diagrama de conexión utilizado para la
realización del cluster, es el que se muestra en la
Fig. 1.
para ejecutar el compilador de C++ (g++),
Openssh-Server
sirve
para
realizar
comunicaciones cifradas a través de la red entre
nodo maestro y nodos esclavos, usando el
protocolo ssh, Mpich2 es una implementación de
mpi, una norma estándar de paso de mensajes
para aplicaciones de memoria distribuida que
utilizan computación paralela, y Nfs-Common es
un paquete que se instala en los nodos esclavos,
para lograr que estos se conecten con los recursos
nfs del servidor.
4 PRESENTACIÓN DEL PROBLEMA:
MULTIPLICACIÓN DE MATRICES
Figura 1. Diagrama de conexión utilizado para la
comunicación entre las computadoras
3
La multiplicación de matrices no es muy
complicada, por lo que se detalla a continuación.
Dada una matriz A(m x r) de m filas y r columnas,
donde cada uno de sus elementos se define como
aij con 1 i m, y 1 j r; y una matriz B(r x n)
de r filas y n columnas, donde cada uno de sus
elementos se denota bij con 1 i r, y 1 j n;
la matriz C resultante de la operación de
multiplicación de las matrices A y B, C = A B,
es tal que cada uno de sus elementos que se
denota como cij con 1 i m, y 1 j n, y se
calcula a través de la ecuación (1).
CONFIGURACIÓN DE CLUSTER
Para la configuración del clúster se optó por un
modelo de clúster heterogéneo, debido a que se
disponía de computadores con diferentes
características de hardware, y con sistemas
operativos Linux de diferentes versiones (Ubuntu
12.04 y 11.10).
Además se utilizó el tipo de configuración
beowulf, debido a que este usa una red común
para realizar la comunicación. De esta forma se
obtuvo un clúster económico.
Para lograr la configuración del clúster, se
procedió con la ejecución de una serie de pasos,
como lo muestra la página web configuración de
un cluster y ejecución de aplicaciones paralelas.
Es importante aclara que cada instructivo, se
encontraba incompleto, es por ello que se
procedió con la combinación de algunos pasos de
dichos instructivos, logrando de esta forma
configurar el clúster.
Las herramientas necesarias para configurar el
clúster fueron, según lo muestra la página web
multiprocesamiento: Nfs-kernel-server es un
protocolo de sistemas de ficheros en red que
permite a un usuario en un ordenador cliente
acceder a ficheros en red. En este caso sirve para
que los nodos esclavos tengan acceso al nodo
servidor, Build-Essential es un paquete que sirve
(1)
Analizando, se puede observar que este tipo de
operaciones se adaptan perfectamente a
procesamientos paralelos porque los cálculos
necesarios para multiplicar matrices no son
totalmente dependientes de otros resultados.
En nuestro caso como estamos multiplicando
matrices cuadradas de orden n, podemos calcular
la cantidad de operaciones necesarias para llegar
a la matriz resultante, y es exactamente como lo
muestra Tinetti (2003):
Cantidad de operaciones = 2n3 - n2
Donde n es la dimensión de las matrices
cuadradas en este caso.
Esta cantidad de operaciones es la que
normalmente se conoce como complejidad de la
multiplicación de matrices. Esto es importante ya
que depende de esto el tiempo que un computador
necesitara para resolver esta multiplicación.
Si estas operaciones se realizarían en un
computador que ejecuta programas secuenciales
basados en asignaciones teniendo en cuenta que
la multiplicación se realiza como se indica en la
ecuación (2).
Cij = cij + aik x bkj;
(2)
Cij: Matriz resultante, i: número de fila y j:
número de columna.
3. Implicaría la ejecución de 2n3 operaciones
aritméticas. Como se observa generalmente no
siempre coinciden con la formula anterior cuando
de ejecuciones de programas se refiere, ya que
esta última tarda más en obtener los resultados.
El presente trabajo trata mejorar los tiempos de
respuestas en este tipo de problemas obteniendo
resultados óptimos en base a la ejecución
concurrente de procesos y computadores.
5
DISEÑO DEL ALGORITMO
Se utilizó la multiplicación de matrices comunes
NxN, una implementación se realizara en una
sola máquina y veremos si es posible agilizarlo
mediante la paralelización de tareas utilizando un
cluster maestro y otras Pcs llamadas nodos
esclavos. En dicho algoritmo definimos en forma
constante el número de filas y columnas de las
matrices, luego en distintas compilaciones le
damos distintos tamaños para obtener distintas
medidas de tiempos. Se realizaron los cálculos
con nueve procesos, a cada uno se reparte una
porción de la matriz y se realiza la multiplicación,
luego los resultados son devueltos al nodo
maestro que realiza la impresión de la matriz final
en un archivo de texto. Las funciones del estándar
Mpi como lo muestra Puerta (2003), para
realizar dichos cálculos fueron:
MPI_Comm_rank: Retorna el identificador de un
proceso dentro de un comunicador.
MPI_Comm_size: Determina el número de
procesos pertenecientes al grupo asociado a un
comunicador.
MPI_Get_processor_name: Retorna el nombre
del procesador donde está ubicado el proceso.
MPI_Isend: Inicializa el envío de un mensaje no
bloqueante a un proceso, esto quiere decir que la
ejecución del programa no se bloquea con la
ejecución de la llamada.
MPI_Recv: Esta función recibe mensajes de tipo
bloqueante, esto quiere decir que la ejecución del
programa se bloquea hasta que el mensaje ha sido
recibido.
En otras palabras, para que el proceso A mande
un mensaje al proceso B el argumento
comunicador que A usa en MPI_Isend() debe ser
idéntico al argumento que B usa en MPI_Recv().
MPI_Bcast: Envía un mismo mensaje desde un
proceso a todos los demás. Es una operación de
comunicación colectiva.
Habrá un proceso maestro con identificador cero,
que enviara las tareas a los esclavos, los cuales
tendrán un identificador distinto de cero.
Este programa utiliza el paradigma de maestroesclavo. En el paradigma maestro-esclavo
tenemos un thread/proceso distinguido, llamado
maestro, que pone en marcha otros procesos,
llamados esclavos, les asigna trabajo y recolecta
las soluciones parciales que generan. Estos
procesos son independientes unos de otros.
6
DISTRIBUCIÓN DEL TRABAJO
El proceso maestro es quien organiza el trabajo a
realizar, inicializando los operandos de
multiplicación y lo va distribuyendo entre los
procesos esclavos, es decir lo que realiza el
maestro es calcular la porción para cada uno de
los esclavos, sin incluirse. Si las filas de la matriz
A no son divisibles por la cantidad de esclavos,
el último esclavo recibe las filas excedentes, caso
contrario las filas serán repartidas de igual forma
para todos los procesos esclavos. A continuación
se envían los datos necesarios para calcular la
cantidad de filas en los procesos. Luego se
transmite los datos de la matriz B a todos los
procesos, se procede con la ejecución de los
procesos esclavos, en donde se recibirán los
datos necesarios para calcular la matriz C
resultante, iterando de acuerdo a los datos
recibidos y enviando los datos procesados al
maestro. El proceso maestro es quien reúne los
datos procesados por los esclavos, culminando
de esta forma con la multiplicación de las
matrices en forma paralela.
7
ANALISIS DEL PROBLEMA
Por lo general cuando se resuelve problemas de
multiplicación de matrices se realizan en forma
secuencial, tomando elementos de la primera
matriz y la segunda siguiendo un orden
determinado para obtener la matriz resultante.
Pero en nuestro caso de estudio la cuestión se
complica, cuando las dimensiones de las mismas
aumentan exponencialmente y más si se quiere
resolver mediante un programa computacional
con los paradigmas clásicos secuenciales.
Una solución al problema de ejecución secuencial
de una multiplicación de matrices seria,
aprovechar de la idea de un cierto paralelismo
que ofrecen los hilos, es decir, crear varios
procesos ligeros que comparten un espacio
común de memoria y asignar una porción de
trabajo a cada uno de ellos y de esta forma
resolver con un pequeño aumento en la velocidad
problemas con grandes dimensiones.
La otra solución y la que utilizamos en este
artículo viene planteado desde el punto de vista
del intercambio de mensajes entre procesos para
compartir los datos, realizar los cómputos
necesarios y unir los resultados de nuevamente en
un proceso padre o maestro. Para tal efecto hemos
utilizado la Interfaz de Paso de Mensajes (MPI)
4. que es una de las más utilizadas hoy en día para el
intercambio de mensajes a la hora de implementar
un algoritmo paralelo.
En el algoritmo propuesto se tiene en cuenta la
cantidad de procesos a distribuir los datos de las
matrices, para que estos calculen su parte
correspondiente y finalmente se unan en el
proceso padre o maestro en la matriz resultante.
Lo interesante de este algoritmo para el cálculo de
multiplicación de matrices, es que de acuerdo a la
cantidad de procesos que se requiera, estos se
ejecutan en las distintas maquinas del clúster
configurado, tratando de balancear la ejecución
entre los distintos procesadores disponibles.
Además, como las salidas son extensas se decidió
guardar en archivos separados a cada matriz.
Todos los datos obtenidos fueron analizados, y se
encuentran reflejados en el presente documento.
8
ANALISIS DE RESULTADOS
Cuando los procesos culminan su tiempo de
procesamiento, envían su resultado local al
proceso cero mediante un mensaje no bloqueante.
El proceso cero recoge dichos resultados locales,
los guarda en una matriz resultante e imprime el
resultado global en archivo de texto. Una vez
realizado esto el programa termina.
Al analizar los distintos tiempos obtenidos como
lo muestra en la Tabla 2, nos percatamos que se
encuentra una mejora en el tiempo de ejecución,
cuando los valores del tamaño de las matrices
empiezan a ser mayores, en el caso de una sola
maquina los valores de rendimiento tienden a
alejarse cada vez más significativamente, con lo
que el costo computacional en un entorno de una
sola maquina se vuelve inapropiado.
Otra observación con respecto al tiempo de
ejecución es que la versión que se ejecutó en
cluster en un principio tarda más como se muestra
en la Fig. 2 y por lo tanto el coste computacional
asociado también. Cuantos más nodos intervienen
en la ejecución menor es el tiempo de ejecución.
Sin embargo el coste aumenta gradualmente, por
lo tanto deberíamos emplear más o menos nodos
esclavos dependiendo de la necesidad que
tengamos de acelerar el procesamiento y de los
recursos que podamos utilizar, intentando llegar a
un compromiso entre rendimiento y coste que sea
óptimo para nuestras necesidades.
Tabla 2. Tiempos de ejecución en milisegundos –
Multiplicación de matrices.
Dimensión
de matrices
(NxN)
100
200
300
400
500
600
700
800
900
1000
1100
1200
1300
1400
1500
1600
1700
1800
1900
2000
2100
2200
2300
2400
2500
Tiempos de ejecución en
milisegundos (Ms)
Cluster
Maquina 1
65.437
11.576
216.238
117.490
660.619
591.061
1175.836
873.057
2832.324
1767.430
3340.276
2605.753
5635.443
4991.344
7060.987
6838.067
11293.440
11129.352
13489.475
13150.818
19382.907
25248.289
20827.049
30278.202
31591.461
33392.365
34233.110
36040.208
46169.254
48574.480
57988.904
68176.690
68686.980
82679.934
70906.676
98964.491
94716.344
120971.949
95382.402
130809.741
128816.283
173628.497
133977.829
204738.963
182178.878
248056.754
301571.432
384512.850
324535.481
391710.398
5. Figura 2. Tiempos de ejecución de la aplicación de multiplicación de matrices en la maquina 1 y cluster.
9
CONCLUSIONES
En este trabajo en donde se realizó una
distribución de datos y división de cómputo para
lograr la paralelización, se concluyó que el
tiempo de ejecución de una aplicación paralela
ejecutada en un cluster, no siempre es menor al de
una aplicación ejecutada en una sola máquina,
además esta depende de la complejidad del
problema de la aplicación.
Por lo cual concluimos que una aplicación
paralela no siempre es eficiente, ya que
dependería del número de procesos en que se
ejecuta y también de las dimensiones que tengan
las matrices. Mientras mayor sea el número de
procesos existentes, y menor sea la cantidad de
procesadores, puede tardar más tiempo la
ejecución de una aplicación paralela.
En cuanto al algoritmo utilizado para realizar la
multiplicación de matrices, puede verse de
acuerdo a los resultados obtenidos en la Tabla 2,
que no existe una diferencia demasiada marcada
entre la aplicación ejecutada en el cluster y en una
sola máquina, hasta antes de la dimensión 1600
de cálculo de las matrices. A partir de dicha
dimensión, la aplicación ejecutada en el cluster,
empieza a presentar un mejor desempeño estable,
teniendo en cuenta el tiempo de ejecución, a partir
de este punto en donde se comienza a ver el
rendimiento del cluster.
También, podemos decir que la paralelización
parece ser la tendencia cuando se habla de
cálculos muy complejos a nivel computacional,
los cuales llevarían un gran tiempo si no se
hicieran en un cluster, es por ello importante
identificar aquellas tareas que son independientes
unas de otras, y poder de esta forma obtener un
gran incremento en el rendimiento, lo cual es
fácilmente observable en los resultados obtenidos
en este trabajo.
Como un futuro trabajo, se podría realizar
pruebas en un mayor número de máquinas para
poder obtener resultados aún más significativos.
También sería muy interesante obtener resultados,
utilizando diversas maquinas distribuidas a lo
largo de una Wan, es decir, pruebas utilizando
nodos que se encuentran en Internet.
Por último, la realización de un clúster fue una
gran experiencia, en donde se obtuvo nuevos
conocimientos, despertando en nosotros un
interés en el campo de la investigación
10 REFERENCIAS
Configuración de un cluster y ejecución de
aplicaciones
paralelas,
https://docs.google.com/file/d/0BmQXi4VGfRdZjY3NTA0YWMtOTMwZS00
MmNmLWI1MTItNzAxNzZiZDVjODFj/edit?h
l=en_US&pli=1, 19/07/12.
Multiprocesamiento,
http://www.slideshare.net/rfsolano/programacinparalela, 04/07/12.
Puerta V. F., Procesamiento Paralelo en Redes
Linux Utilizando MPI, página 47, 2004.
Tinetti F. G., Cómputo Paralelo en Redes Locales
de Computadoras, Universidad Autónoma de
Barcelona, página 18, 2003.