Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos...

28
Computación Matricial y P aralela 1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones básicas con matrices Multiplicación de matrices Factorización LU Operaciones con matrices dispersas Trabajo por bloques

Transcript of Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos...

Page 1: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela

1

Algoritmos Numéricos

Algoritmos matriciales básicos

Almacenamiento de matrices Operaciones básicas con vectores Operaciones básicas con matrices Multiplicación de matrices Factorización LU Operaciones con matrices dispersas Trabajo por bloques

Page 2: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 2

Almacenamiento de matrices densas

En array bidimensional: double a[n][m] En array unidimensional: double *b[n*m]

Fila i columna j:

a[n][m] , b[i*m+j]

Cuando es submatriz de otra “Leading dimension”: posiciones de

memoria entre dos elementos consecutivos de la misma columna

Fila i columna j: c[i*ld+j]

c m

nn

ld

Page 3: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 3

Almacenamiento de matrices dispersas

Muchas maneras distintas

Tres arrays: datos[0,..,d-1], filas[0,..,d-1], columnas[0,..,d-1]

datos (1,3,2,4), filas (0,1,2,2), columnas (2,0,1,3)

Tres arrays: datos[0,..,d-1], columnas[0,..,d-1], comienzo

fila[0,..,n-1]

datos (1,3,2,4), columnas (2,0,1,3), com. filas (0,1,2,-1)

0 1 2 3

0 1

1 3

2 2 4

3

Page 4: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 4

Operaciones básicas con vectores

void escalar_vector(double d,double *v,int n){ int i;

for(i=0;i<n;i++) v[i]*=d;}

n flops (operaciones en coma flotante)

En algoritmos numéricos se estudia el número de flops.

En el estudio experimental los flops (Mflops, Gflops) por segundo.

En paralelo los flops/segundo/procesador

Page 5: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 5

Operaciones básicas con vectores

double sumar_vector(double *v,int n){ int i; double s=0.;

for(i=0;i<n;i++) s+=v[i]; return s;}

n flops

Page 6: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 6

Operaciones básicas con vectores

void sumar_vectores(double *v1,double *v2,

double *vr,int n){ int i;

for(i=0;i<n;i++) vr[i]=v1[i]+v2[i];}

n flops

Page 7: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 7

Operaciones básicas con vectores

double producto_escalar(double *v1,double *v2,int n)

{ int i; double p=0.;

for(i=0;i<n;i++) p+=v1[i]*v2[i]; return p;}

2n flops

Page 8: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 8

Operaciones básicas con matrices

void escalar_matriz(double d,double **a,int n,int m){ int i,j;

for(i=0;i<n;i++) for(j=0;j<m;j++) (a[i][j])*=d;}

nm , n2 flops

Page 9: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 9

Operaciones básicas con matrices

Uso de “stride” de un vectorvoid producto_escalar_stride(double *v1,int str1,

double *v2,int str2,int n)

{ int i; double p=0.; for(i=0;i<n;i++) p+=v1[i*str1]*v2[i*str2]; return p;}

2n flops

Page 10: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 10

Operaciones básicas con matrices

void sumar_matrices(double *a,int fa,int ca,int lda,

double *b,int fb,int cb,int ldb,

double *c,int fc,int cc,int ldc){ int i,j;

for(i=0;i<fa;i++) for(j=0;j<ca;j++) c[i*ldc+j]=a[i*lda+j]+b[i*ldb+j];}

n2 flops

Page 11: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 11

Operaciones básicas con matrices

void matriz_vector(double *m,int fm,int cm,int ldm,

double *v,int fv,int strv,double *r,int fr,int strr)

{ int i,j; double s; for(i=0;i<fm;i++) { s=0.; for(j=0;j<cm;j++) s+=m[i*ldm+j]*v[j*strv]; r[i*strr]=s; }}

2n flops

2n2 flops

Page 12: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 12

Operaciones básicas con matrices

void matriz_vector_pe(double *m,int fm,int cm,int ldm,double *v,int fv,int strv,double *r,int fr,int strr)

{ int i,j; double s;

for(i=0;i<fm;i++)

r[i*strr]=producto_escalar_stride(&m[i*ldm],1,v,1,cm);

}

2n flops2n2 flops

Page 13: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 13

Operaciones básicas con matrices

void trasponer_matriz(double *m,int n,int ld){ int i,j; double t; for(i=0;i<n;i++) for(j=i+1;j<n;j++) { t=m[i*ld+j]; m[i*ld+j]=m[j*ld+i]; m[j*ld+i]=t; } }

3(n-i) asignaciones

3n(n+1)/2 asignaciones

Page 14: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 14

Multiplicación de matrices

i i

jj

kk

Page 15: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 15

Multiplicación de matrices

void matriz_matriz(double **a,int fa,int ca,double **b,

int fb,int cb,double **c,int fc,int cc){ int i,j,k; double s; for(i=0;i<fa;i++) { for(j=0;j<cb;j++) { s=0.; for(k=0;k<ca;k++) { s+=a[i][k]*b[k][j]; } c[i][j]=s; } } }

2n flops

2n2 flops

2n3 flops

Page 16: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 16

Multiplicación de matrices

void matriz_matriz_ld(double *a,int fa,int ca,int lda,

double *b,int fb,int cb,int ldb,double *c,int fc,int cc,int ldc)

{ int i,j,k; double s; for(i=0;i<fa;i++) { for(j=0;j<cb;j++) { s=0.; for(k=0;k<ca;k++) s+=a[i*lda+k]*b[k*ldb+j]; c[i*ldc+j]=s; } } }

2n flops

2n2 flops

2n3 flops

Page 17: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 17

Multiplicación de matrices

void matriz_matriz_tras(double *a,int fa,int ca,int lda,

double *b,int fb,int cb,int ldb,double *c,int fc,int cc,int ldc)

{ int i,j,k; double s; double *bt,*da,*db; bt=(double *) malloc(sizeof(double)*cb*fb); trasponer_matriz_esp(b,fb,cb,ldb,bt,cb,fb,fb); for(i=0;i<fa;i++) { for(j=0;j<cb;j++) { s=0.; da=&a[i*lda]; db=&bt[j*fb]; for(k=0;k<ca;k++,da++,db++)

s+=da[0]*db[0]; c[i*ldc+j]=s; } } free(bt); }

2n flops

2n2 flops

2n3 flops

Page 18: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 18

Multiplicación de matrices

void matriz_matriz_pe(double *a,int fa,int ca,int lda,

double *b,int fb,int cb,int ldb,double *c,int fc,int cc,int ldc)

{ int i,j;

for(i=0;i<fa;i++) for(j=0;j<cb;j++) c[i*ldc+j]=producto_escalar_stride(&a[i*lda],1,

&b[j],ldb,ca);}

2n flops2n2 flops

2n3 flops

Page 19: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 19

Multiplicación de matrices

void matriz_matriz_mv(double *a,int fa,int ca,int lda,double *b,int fb,int cb,int ldb,double *c,int fc,int cc,int ldc)

{ int i;

for(i=0;i<cb;i++)

matriz_vector_pe(a,fa,ca,lda,&b[i],fb,ldb,&c[i],fc,ldc);

}

2n2 flops2n3 flops

Page 20: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 20

Multiplicación de matrices en mi portátil:Método\tamaño 1000 1200

1400bidimensional 12.26 20.15

32.37leading dimension 12.70 21.95

36.41leading+punteros 12.29 22.84

34.90traspuesta 12.71 20.88

36.29producto escalar 12.92 21.75

35.17matriz-vector 12.19 21.47

36.92

Page 21: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 21

Multiplicación de matrices en SUN Ultra 1:Método\tamaño 200 400 800Normal 0.2179 13.4601 217.5464Traspuesta 0.2013 3.3653 27.9945Bloques 10 0.2880 2.5901 21.9029

25 0.2192 1.8347 14.964250 0.2161 1.7709 14.2502

Bloq tras 10 0.2937 2.5026 20.440525 0.2195 1.8009 14.641550 0.2152 1.7628 14.1806

Almac blo 10 0.2949 2.5122 20.376225 0.2277 1.8490 14.862550 0.2296 1.8429 14.7314

Bl tr al bl 10 0.2925 2.4985 20.197525 0.2244 1.8082 14.528250 0.2231 1.7147 13.6553

Bloq dob 20 5 0.6105 4.9363 39.959420 10 0.3206 2.6669 19.704450 10 0.3039 2.4542 19.704450 25 0.2370 1.9221 15.5190

Page 22: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 22

Multiplicación de matrices en kefren, pentium 4:

Método\tamaño 200 400 800Normal 0.0463 0.7854 7.9686Traspuesta 0.0231 0.2875 2.3190

Bloques 10 0.0255 0.2493 2.032725 0.0265 0.2033 1.692850 0.0219 0.1785 1.6594

Bloq dob 20 5 0.0393 0.3669 3.495520 10 0.0269 0.3090 2.442450 10 0.0316 0.2232 2.276850 25 0.0215 0.1755 1.4726

Blas 1 0.0536 0.8190 8.2311Blas 2 0.0501 0.5861 5.9997Blas 3 0.0429 0.6115 4.7252

Page 23: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 23

Factorización LU

Uii=1

Paso 1: L00 U00=A00 L00 =A00

Paso 2: L00 U0i=A0i U0i =A0i/L00

Li0 =Ai0

Paso 3: Aij =Li0 U0j +... A’ ij =Aij - Li0 U0j

Page 24: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 24

Factorización LU

Uii=1

Paso 1: Lii Uii=Aii Lii =Aii

Paso 2: Lii Uij=Aij Uij =Aij/Lii

Lji =Aji

Paso 3: Ajk =Lji Uik +... A’ jk =Ajk - Lji Uik

i

i

L

U

Page 25: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 25

Factorización LUvoid lu(double *a,int fa,int ca,int lda){ int i,j,k; for(i=0;i<fa;i++) { for(j=i+1;j<ca;j++) //Paso 2 a[i*lda+j]/=a[i*lda+i]; for(j=i+1;j<fa;j++) //Paso 3 for(k=i+1;k<ca;k++) a[j*lda+k]-=a[j*lda+i]*a[i*lda+k]; }}

Page 26: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 26

Factorización LU Para resolver sistema Ax=b

En la forma: LUx=b

Resolver: Ly=b (Sistema triangular inferior: sustitución progresiva)

Seguido de: Ux=y (Sistema triangular superior: sustitución regresiva)

Page 27: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 27

Operaciones con matrices dispersas

Producto matriz-vector Por cada elemento de la matriz Buscamos si hay elemento de la misma

columna en el vector y acumulamos sobre la suma correspondiente a su fila

datos 3 1 2 4

fila 0 1 2 2

columna 2 0 2 3

datos 1 3

fila 0 2

resultado

datos 9 1 6

fila 0 1 2

Page 28: Computación Matricial y Paralela1 Algoritmos Numéricos Algoritmos matriciales básicos Almacenamiento de matrices Operaciones básicas con vectores Operaciones.

Computación Matricial y Paralela 28

Operaciones con matrices dispersas

void matriz_vector_disperso(double *dm,int *fm,int *cm,

int ndm,double *dv,int *fv,int ndv,double *dr,int *fr,int ndr)

{ int i,j,fact; double s; for(i=0;i<ndr;i++) fr[i]=i; i=0; while(i<ndm) { fact=fm[i]; j=0; s=0.; while(i<ndm && fm[i]==fact) { while(j<ndv && fv[j]<cm[i]) j++; if(j<ndv && fv[j]==cm[i]) s+=dm[i]*dv[j]; dr[fact]=s; i++; } } }