tres algoritmos paralelos para multiplicación matriz vector capitulo 8

42
Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Upload: adelaida-barcena

Post on 22-Jan-2016

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Tres Algoritmos Paralelos para Multiplicación Matriz Vector

Capitulo 8

Page 2: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Los Tres Algoritmospara computar el producto matriz-

vector Ab=c

– Rowwise block striped– Columnwise block striped– Checkerboard block

Page 3: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Algoritmo Secuencial (cont)• Entrada: una matríz

mXn a[0..m-1][0..n-1] y un vector b[0..n-1]

• Salida: El producto a b = c[0..m-1]

• for i←0 to m-1 do c[i] ←0 for j←0 to n-1 do c[i] ← c[i] + a[i,j] * b[j]

endfor endfor

Complexidad:

O(mn)

Page 4: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Algoritmo I (Rowwise block striped matrix)

• Descomposición de dominio

• Una tarea primitive está asociada con

- una fila de la matríz y

- el vector b entero

Page 5: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Un Paso del Algoritmo Paralelo

Fila i de A

b

Fila i of A

bci

Producto interior

Fila i de A

b c

Comunicación All-gather

Page 6: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Aglomeración y Asignación de Procesos

• Aglomerar grupos de filas

• Cada proceso tiene un bloque de filas y todo de los vectores b y c

• La función read_row_striped_matrix particiona la matriz A en p bloques de filas y distribuye los bloques a los procesos

Page 7: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

La idea del algoritmo

• Cada proceso computa un bloque de c

• La función replicate_block_vector hace uso de MPI_Allgatherv para concatenar los bloques de c y dejar el resultado en cada uno de los procesadores.

Page 8: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

MPI_Allgatherv

Page 9: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

MPI_Allgatherv

int MPI_Allgatherv ( void *send_buffer, int send_cnt, MPI_Datatype send_type, void *receive_buffer, int *receive_cnt, int *receive_disp, MPI_Datatype receive_type, MPI_Comm communicator)

Page 10: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Algoritmo II (Columnwise block striped matrix)

• Descomposición de dominio

• Una tarea primitive está asociada con

- una columna de la matríz y

- un bloque apropiado del vector b

Page 11: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Phases of Parallel AlgorithmC

olum

n i o

f A

b

Col

umn i o

f A

b ~cMultiplications

Col

umn i o

f A

b ~c

All-to-all exchange

Col

umn i o

f A

b c

Reduction

Page 12: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Leer una matriz en forma de bloques de columnas

Archivo

Page 13: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Aglomeración y Asignación de Procesos

• Aglomerar grupos de columnas• Cada proceso tiene un bloque de columnas, un

bloque de b y un producto interior y todo de los vectores b y una suma parcial de c

• La función read_col_striped_matrix particiona la matriz A en p bloques de columnas y distribuye los bloques a los procesos. Para esto hace uso de la función MPI_Scatterv

Page 14: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

MPI_Scatterv

Page 15: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

MPI_Scatterv

int MPI_Scatterv ( void *send_buffer, int *send_cnt, int *send_disp, MPI_Datatype send_type, void *receive_buffer, int receive_cnt, MPI_Datatype receive_type, int root, MPI_Comm communicator)

Page 16: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

La fase computacional

• Cada proceso multiplica su bloque de columnas por su bloque de b y asi computa una suma parcial de c.

• El resultado final será la suma de estas sumas parciales.

• Para efectuar la suma de las sumas parciales, se puede aplicar comunicaciones alltoall

Page 17: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

All-to-all Exchange (Before)

P0 P1 P2 P3 P4

Page 18: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

All-to-all Exchange (After)

P0 P1 P2 P3 P4

Page 19: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

MPI_Alltoallv

int MPI_Alltoallv ( void *send_buffer, int *send_cnt, int *send_disp, MPI_Datatype send_type, void *receive_buffer, int *receive_cnt, int *receive_displacement MPI_Datatype receive_type, MPI_Comm communicator)

Page 20: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Algoritmo III

Descomposición Checkerboard

Page 21: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Diseño del Algoritmo

• Asociar una tarea primitiva con cada elemento de la matríz A

• Cada tarea primitive hace una multiplicación• Aglomerar tareas primitivas en bloques

rectangulares• Procesos constituyen una parrilla bidimensional• Distribuir el vector b en los procesos de la

primera columna de la parrilla

Page 22: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

La Tareas después de la Aglomeración

Page 23: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Los Pasos del Algoritmo

Page 24: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Redistribuir el Vector b

• Paso 1: Mover b de la primera columna a la primera fila– Si p es un cuadrado

• Procesos en la primera columna envian sus pedazos de b a procesos de la primera fila

– Si p no es un cuadrado• Acumula (“gather”) b en el proceso (0, 0)• El process (0,0) distribuye (“scatters” ) los pedazos

de b en los procesos en la primera fila• Paso 2: Los procesos de la primera fila emiten los

pedazos de b dentro de las columnas

Page 25: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Comunicadores

• Comunicaciones colectivas envuelve todos los procesos en un comunicador.

• Necesitamos hacer broadcasts y reduciones dentro de subconjuntos de procesos

• Necesitamos crear comunicadores para hacer esto

• Crearemos comunicadores para procesos en la misma fila o en la misma columna.

Page 26: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Comunicadores

Un comunicador consiste de

• un grupo de procesos

• un contexto

• atributos, que incluyen una topología

Page 27: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Para Crear una Parrilla Vitual de Procesos

• MPI_Dims_create– parametros de entrada

• número de procesos en la parrilla deseada• número de dimensiones• Devuelve el número de procesos en cada dim

• MPI_Cart_create– Crea un comunicador con una topología

cartesiana

Page 28: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

MPI_Dims_create

• int MPI_Dims_create(

int nodes, /*el número de procesos en

la parrilla*/

int dims, /* el número de dimensiones */

int *tamano/* el tamano de cada

dimension*/)

Page 29: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Ejemplo de MPI_DIMS_create

Supongamos que nos gustaria determinar las dimensiones de una malla bidimensional balanceado que contiene p proocesos. Esto se logra como sigue:

int p;int tamano[2];…tamano[0]=0;tamano[1]=0;MPI_Dims_create [p,2,tamano]Despues de ejecutar este segmento de código,

MPI_Dim_create, tamano[0] contendra la cantidad de filas y tamano[1] contendra la cantidad de columnas.

Page 30: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

MPI_Cart_create

• Crea un comunicador con una topología cartesiana

MPI_Cart_create( MPI_Comm com_viejo, int dims, int *size,/*un arreglo de tamaño dims*/ int *periodico, /*un arreglo de tamano dims, periodico[j]=1 si se desea “wraparound” en la dimension j*/ int reordenar, /*0 si rango en el nuevo comunicador es lo mismo como en el viejo*/ MPI_Comm *com_cart)

Page 31: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Ejemplo de MPI_Cart_create

• Supongamos que • el comunicador viejo es MPI_COMM_WORLD• la malla tiene 2 dimensiones, que la función

MPI_Dims_create ya ha inicializado el arrelgo tamano que contiene los tomaños de cada dimensión

• no queremos “wraparounds”• el rango de cada proceso es igual a su rango en

el comunicador viejo

Page 32: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Ejemplo de MPI_Cart_create(2)

MPI_Comm cart_comm;int p;int periodico[2];int tamano[2];…tamano[0]=tamano[0]=0;MPI_Dim_create(p,2,tamano)periodico[0]=periodico[1]=0;MPI_Cart_create(MPI_COMM_WORLD,2,tamano, periodico,0);

Page 33: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Dos Funciones Relacionadas con Parrillas

• MPI_Cart_rank– Devuelve el rango del proceso, dada las

coordenadas del proceso en un comunicador cartesiano

• MPI_Cart_coords– Devuelve las coordenadas cartesianas de un

proceso, dado su rango.

Page 34: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

MPI_Cart_rank

int MPI_Cart_rank (

MPI_Comm com,

int *coords,

int *rango)

Page 35: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

MPI_Cart-coords

int MPI_Cart_coords (

MPI_Comm com,

/* In - Communicator */

int rango,

int dims,

int *coords)

Page 36: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Ejemplo#include <stdio.h>#include <mpi.h>int main (int argc, char **argv){ MPI_Comm com_cart; int id; int p; int tamano[2]; int periodo[2]; int coords[2]; MPI_Init (&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &p); tamano[0]=tamano[1]=0; MPI_Dims_create(p,2,tamano); MPI_Cart_create(MPI_COMM_WORLD,2,size,periodo,1,&com_cart); MPI_Comm_rank(com_cart,&id); MPI_Cart_coords(com_cart,id,2,coords); printf("id=%d, (%d,%d)\n",id,coords[0],coords[1]); MPI_Finalize();return 0}

Page 37: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

MPI_Comm_split

• MPI_Comm_split(MPI_Comm com_viejo, int particion,int orden_rango, MPI_Comm *com_nuevo)Particiona un comunicador existente

com_viejo en una o mas particiones. Se agrupan todos los procesos que tienen

el mismo número particion El rango en el nuevo comunicador se da

por orden_nuevo

Page 38: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Ejemplo

• En el ejemplo anterior, se puede hacer un comunicador de la primera columna de com_cart:

• MPI_Comm_split(com_cart,coords[1]==0, coords[0],&com_col)

Page 39: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Leer un vector b de un archivo y distribuirlo en com_col

• Hacer uso de read_block_vector en MyMPI.c:

read_block_vector(argv[1],(void **) &b, mpitype, &m, com_col);

Page 40: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Analisis de Complexidad(presumiendo que m=n)

• Cada proceso hace su parte de la computación: (n2/p)

• Redistribuir b: (n / p + log p(n / p )) = (n log p / p)

• Reducción de los vectores de resultados parciales: (n log p / p)

• La complexidad paralela total: (n2/p + n log p / p)

Page 41: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Analisis de Isoeficiencia

• Complexidad Secuencial: (n2)

• Complexidad de comunicación:(n log p / p)

• La función de Isoeficiencia:n2 Cn p log p n C p log p

• M(n)=n2 M(C p log p)/p = C2 log2 p

Page 42: Tres Algoritmos Paralelos para Multiplicación Matriz Vector Capitulo 8

Comparación de los tres Métodos

Algoritmo Complexidad Isoeficiencia

Rowwise Block-Striped

(n2/p + n+log p) C2 p

Columnwise Block-Striped

(n2/p + nlog p) C p

Checkerboard (n2/p + n log p/ p) C2 log2 p