ALGORITMOS PARALELOS DE MULTIPLICACIÓN DE MATRICES Integrantes Guido Casco [guiancs82@gmail.com] Claudio Lezcano [claudiogmi@gmail.com] Electiva V – Diseño de Algoritmos Paralelos 9vo Semestre, 2009
Introducción En este trabajo se tiene por objetivo implementar y comparar dos versiones de algoritmos de multiplicación de matrices con diferentes mecanismos de mapeo y particionamiento de tareas, en particular los algoritmos de cannon y de multiplicación con mapeo por bloque circular. Además se desea comparar el comportamiento de los mismos con diferentes cargas de trabajo y comparar su desempeño con la versión mono-proceso mas comúnmente utilizada. Para el desarrollo de las versiones en paralelo se ha utilizado la librería de paso de mensajes MPICH con el compilador gcc. A continuación se describe cada una de las implementaciones desarrolladas.
Descripción del Hardware y de la Red utilizada Características de la Computadora1 Características de la Computadora2 Procesador: AMD Athlon64 x2 1.9Ghz Memoria: 2GB RAM Disco Duro: 160GB HD SATA S.O: Windows XP Pro. SP2 Velocidad de Tarjeta de Red: 1Gbps Procesador: Pentium 4 x2 3Ghz Memoria: 3GB RAM Disco Duro: 250GB HD SATA Características de la Red Velocidad de Transmisión: 1Gbps Cable de Red: Giganet 5E UTP 4x2x2
Algoritmo de Cannon
Operación de rotación de filas void shift(int** array, int step, int row_shift, char side, int rows,int cols) { int k,j; int i = step; int aux; for(k=0;k<step;k++) { if(side == 'L') aux = array[row_shift][0]; else aux = array[0][row_shift]; for(j =0 ; j<cols-1 ; j++) { array[row_shift][j] = array[row_shift][j+1]; array[j][row_shift] = array[j+1][row_shift]; } array[row_shift][cols-1] = aux; array[cols-1][row_shift] = aux;
Operación de rotación de columnas void MPI_shift(int** arr, int rows, int cols, int rank, int MPI_size, int comm) { reciver = rank-1; if(reciver<0) reciver= MPI_size-1; sender = (rank+1); if(sender == MPI_size) sender = 0; for(i =0 ; i<cols ; i++) { aux = arr[0][i]; aux1 = 0; if(rank%2 == 0) { MPI_Send (&aux,1, MPI_INT,reciver,i,comm); MPI_Recv (&aux1,1, MPI_INT, sender,i,comm,&stat); } else { for(j =0 ; j<rows-1 ; j++) { arr[j][i] = arr[j+1][i]; arr[rows-1][i] = aux1;
Algoritmo de Particionamiento por Bloques Circulares
Marco Comparativo
Marco Comparativo
Marco Comparativo
Conclusión Con este trabajo pudimos visualizar las diferencias en tiempo de ejecución entre los algoritmos paralelos de multiplicación de matrices (Cannon y Distribución por Bloque Circular) y el algoritmo serial de multiplicación de matrices, el tiempo de ejecución de los algoritmos paralelos tienen un tiempo de sobrecarga asociada, el tiempo de comunicación interprocesos y las comunicaciones a través de la red. También se pudo observar una diferencia entre el algoritmo de Cannon y el de Distribución cíclica de bloques, esto se debe a la mayor cantidad de interacciones inter-procesos en la implementación de Cannon que en la otra. Por lo tanto, en las métricas de comparación (Tiempo de Ejecución, Tiempo de Sobrecarga, Aceleración, Eficiencia y Costo) se puede observar que comparando los algoritmos paralelos de Multiplicación de Matrices, el algoritmo de Cannon por tener mayor interacción inter-proceso tendría peor valores de las métricas que el Algoritmo de Particionamiento por Bloques Cíclicos. Con este trabajo también se puede concluir que los Algoritmos Paralelos tienden a administrar mejor los recursos como procesadores multi-núcleos.
MUCHAS GRACIAS POR LA ATENCIÓN!!!