Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Centro de Investigaci
on y de Estudios Avanzados del IPN
Av. Instituto Politecnico Nacional No. 2508 Col. San Pedro Zacatenco.
Mexico D.F, 07360. Tel.(+52 55) 5061 38000 ext: 3758 y 3756
Qu
e es c
omputo paralelo?
PVM
PVM es un software que permite una colleccion heterogenes de computadores Linux y/o Windows
trabajar juntas a traves de una red que act
ua como una gran computadora sencila. De esta manera,
muchos problemas de c
omputo pueden ser resueltos de manera efectiva usando el poder y la memoria
de muchas computadoras. Tiene la ventaja de que es un software portable y de que el codigo es de
libre distribuci
on y que ha sido compilado en todos lados, desde laptops hasta CRAYs []. PVM
permite a los usuarios explotar el hardware existente en sus computadoras para resolver problemas
* Email:
radominguez@cs.cinvestav.mx
n Paralela, Factorizaci
Programacio
on LU
2. Descripci
on del problema: Paralelizaci
on de la Factorizaci
on LU
La Factorizaci
on LU es uno de los principios basicos del algebra lneal y es usada principalmente
para solucionar sistemas de ecuaciones lineales de la forma Ax = b [2] siendo A una matriz no
singular y tambien para calcular el determinante. Aunque es posible resolver estos sistemas usando
la inversa de A, es decir, x = A1 , casi nunca es una buena idea debido principalmente a razones
de eficiencia y en lugar de eso, la factorizacion de A de la forma A = LU donde L y U son matrices
superiores (U solo tiene ceros por encima de la diagonal) e inferiores (L solo tiene ceros debajo de la
diagonal) respectivamente, es m
as eficiente.
A manera de ejemplo, una matriz A33 , se puede factorizar como:
l11
A = LU l21
l31
0
l22
l32
0
u11
0 0
l33
0
u12
u22
0
u13
a11
u23 = a21
u33
a31
a12
a22
a32
a13
a23
a33
Una factorizaci
on LDU es una factorizacion de la forma:
A = LDU
donde D es una matriz diagonal y L y U son matrices triangulares unitarias, lo que significa que
todas las entradas en la diagonal de L y U son 1. Una factorizacion LU P es de la forma
AP = LU
donde L y U son de nuevo matrices inferior y superior y P es una matriz permutaci
on, es decir, una
matriz de ceros y unos que tiene exactamente un 1 en cada fila y columna.
El problema consiste en a partir de un algoritmo secuencial, lograr modificarlo de alguna manera en
algunas de sus partes m
as significativas de modo que las tareas y los datos puedan ser distribuidos en
diferentes procesos que esten comunicados y sincronizados entre si, de tal modo que las operaciones
que realizen no se traslapen o haya corrupcion de datos.
n Paralela, Factorizaci
Programacio
on LU
Factorizaci
on LU usando rutinas de PVM
Algoritmo secuencial
El algoritmo secuencial produce una matriz triangular superior U y una matriz triangular unitaria
inferior L. Para facilitar la posterior paralelizacion, se realizaron una serie de modificaciones a este
algoritmo (Doolitle).Debido a que la matriz U tiene solo 0s debajo de la diagonal y debido a que
no se verifican ni modifican esas entradas, el codigo no las modifica; por otro lado, debido a que la
matriz de salida L tiene solo 1s debajo de su respectiva diagonal y 0s sobre la misma, tampoco se
tocan esas entradas. As, el algoritmo 1 computa solo las entradas mas significantes de las matrices
L y U.
Algoritmo 1 Algoritmo secuencial para encontrar la factorizacion LU
Requiere: A
for k 1 to n do
ukk akk
for i k + 1 to n do
lik aik /ukk
uki aki
end for
for i k + 1 to n do
for j k to n do
aij aij lik ukj
end for
end for
end for
return L and U
3. Descripci
on del algoritmo paralelo
n Paralela, Factorizaci
Programacio
on LU
Esquemas de particionamiento
Debido a las especificaciones de PVM, cada procesador tendra sus propios datos, en este caso sera
la matriz A que debe factorizarse. La distribucion de los datos para cada procesador se realiza de la
siguiente manera: las filas de la matriz se van a distribuir entre el n
umero de procesadores que se
vayan a ejecutar, esto es que como tanto el tama
no del problema como el n
umero de procesadores
son din
amicos, se repartir
an tambien dinamicamente. En la figura 2 se muestra la manera en la que
se dividen los datos de la matriz A siendo esta una matriz cuadrada de n n.
n Paralela, Factorizaci
Programacio
on LU
Factorizaci
on LU usando rutinas de PVM
Ahora bien, si se observa bien la forma en la que trabaja el algoritmo, puede apreciarse que hay mas
iteraciones en la parte baja de la matriz que en la parte alta, por lo tanto la distribucion de las filas
entre los procesos no debe ser de filas contiguas pues se cae en un caso llamado mapeo bloqueante. El
problema con este tipo de mapeo es que es una gran carga desbalanceada y provoca muchos tiempos
muertos de los procesos que ya han terminado de procesar las filas que les corresponden. La solucion
a esta carga desbalanceada es el llamado mapeo cclico.
El mapeo cclico divide la filas de la matriz entre n/P (P es el n
umero de procesadores) secciones, y
entonces le asigna a cada procesador una fila de cada seccion. De esta manera se mejora el problema
de la carga desvalanceada. Por ejemplo, suponga a la matriz A de 16 16, y tenemos 4 procesadores
(P = 4), la tabla 1 lista las filas que le son dadas a cada procesador.
Mapeo Bloqueante
Mapeo Cclico
P0
0, 1,, 2, 3
0, 4, 8, 12
P1
4, 5, 6, 7
1, 5, 9, 13
P2
8, 9, 10, 11
2, 6, 10, 14
P3
12, 13, 14, 15
3, 7, 11, 15
Comunicaci
on
Se implementaron dos diferentes tipos de comunicaciones entre los procesadores. Todas usando la
instrucci
on pvm send() de PVM pero enviando diferentes tipos de datos, un tipo eran enteros simples
y los otros eran buffers de datos de tipo float. Los enteros son mas que nada el tama
no del problema,
ndices que hay que comparar con datos localesde cada procesador entre otros. Para el caso de los
buffer, cuando un procesador ha completada las operaciones sobre las filas que le corresponden,
empaqueta sus datos y los envia al maestro quien, actualiza la matriz de trabajo y vuelve a enviar
las filas a los procesadores. Esto significa que todos los procesadores deben esperar hasta que reciben
sus datos.
Modelo maestro-esclavo
Basicamente, el algoritmo empleado en esta version utiliza una version mejorada del modelo maestroesclavo que se manej
o en las versiones anteriores. Se define un procesador que fungira como maestro
y sera este el que se encargue de repartir el trabajo a los otros procesadores. Ademas de esto, en cada
iteracion este proceso maestro recibe las filas ya procesadas por los demas, actualiza la matriz y vuelve
a enviar las filas para la siguiente iteracion. El algoritmo 2 define el pseudocodigo de instrucciones
que maneja el proceso padre y el siguiente algoritmo define lo realizado por cada uno de los otros
procesos.
n Paralela, Factorizaci
Programacio
on LU
Mecanismos de coordinaci
on y sincronizaci
on entre procesos
Cada proceso recibe solamente una copia de las filas que le tocan procesar de acuerdo al mapeo cclico
y realizar
a las operaciones s
olo en estas filas. Ademas del trabajo asignado, cada procesador recibe
una copia de la fila pivote, que no es mas que la fila de la matriz principal cuyo ndice es el valor
de k. En cada iteraci
on, los procesos deben conocer las modificaciones realizadas por cada uno de
los otros procesos, as que existe una comunicacion triangular entre ellos en los que se intercambian
la informaci
on de las filas procesadas por cada uno mediante las rutinas PVM de paso de mensajes.
Cada uno de los procesadores empaqueta los datos de sus filas en un buffer y los enva al maestro que
los recibe y los vuelve a enviar para la siguiente iteracion. Entonces a cada proceso le corresponde
una o m
as filas de la matriz, que va a actualizar de manera paralela a los otros procesos como se ve
en la figura 3. En la figura 4 se muestra un esquema del mecanismo de funcionamiento del programa.
n Paralela, Factorizaci
Programacio
on LU
Factorizaci
on LU usando rutinas de PVM
4. Resultados
a) Ejemplo(s) y verificaci
on de resultados. A manera de ejemplo, desarrollemos la siguiente
matriz A con la ayuda de 2 procesos de ejecuci
on:
06
BB3
BB1
@4
2
3
9
2
5
1
1
2
2
6
1
4
5
6
1
6
2
1
1
6
7
1
CC
CC
A
El primer paso es dividir el trabajo a cada uno de los procesos. En este caso tenemos un valor de n = 5
y n
umero de procesos p = 3, pero de acuerdo al algoritmo, solo necesitaremos procesar a lo m
as n 1
filas y utilizaremos p 1 procesos debido a que tenemos un proceso maestro. Este proceso hace la
funci
on de un orquestador que inicializa el tama
no de la matriz, reparte el trabajo entre los procesos
y espera los resultados para actualizar la matriz y repetir la operaci
on. El proceso de envo consiste
en preparar un buffer de tama
no n + (n numf ilas); donde n es el tama
no de la matriz y numf ilas
son las filas que le toca a cada proceso. En este caso son dos. Este buffer se llena primero con la fila
pivote y despues con las filas que le corresponden a cada proceso. Por ejemplo, el primer buffer para el
proceso con rank = 1 quedara as: buffer = {6, 3, 1, 4, 2, 3, 9, 2, 5, 1, 4, 5, 6, 1, 6}, que corresponden
a la fila 0, 1 y 3 de la matriz.
Los procesos reciben cada quien su buffer y crean una submatriz de dos dimensiones para poder realizar
n Paralela, Factorizaci
Programacio
on LU
06
BB 0,5
BB 1
@0,67
2
0
7,5
2
2,99
1
6
1,5
2
5,33
1
2
3
6
1,68
6
1
CC
CC
A
9
0
1
4,66
7
As que solo resta esperar las filas 2 y 4 (ya procesadas) que del proceso 2. As que al final de la primera
iteraci
on, la matriz queda as:
06
BB 0,5
BB0,16
@0,67
0,33
3
7,5
1,52
2,99
0,01
1
1,5
1,84
5,33
0,67
4
3
5,36
1,68
4,68
1
CC
CC
A
2
0
0,68
4,66
6,34
Entonces el proceso padre ya tiene lo que necesita para envar de nuevo las filas a cada proceso con
los nuevos valores. Ahora con el incremento de k, se vuelve a repetir la operaci
on, solo que ahora el
proceso 1 ya no ejecuta sus dos filas sino solo una, la fila 3, esto es porque en la siguiente iteraci
on
la fila 1 se ha comvertido en fila pivote y no require de modificaci
on alguna por lo que esperar
a hasta
que todos los dem
as procesadores terminen para poder ser liberado. En cambio el hilo 2 a
un le quedan
algunas iteraciones m
as que realizar. Al terminar todos los procesos su ejecuci
on, nos queda la matriz
resultado siguiente:
06
BB 0,5
BB0,17
@0,67
0,33
n Paralela, Factorizaci
Programacio
on LU
3
7,5
0,2
0,4
0,0
1
1,5
1,53
3,09
0,43
4
3
4,73
17,48
0,15
1
CC
CC
A
2
0
0,67
2,61
6,43
Factorizaci
on LU usando rutinas de PVM
Esta matriz se divide para obtener finalmente las matrices L y U buscadas y se muestran como sigue:
01
B
B0,50
0,17
L=B
B
@0,67
0,33
0
1
0,20
0,40
0,00
0
0
1
3,09
0,43
0
0
0
1
0,15
1
CC
CC
A
0
0
0 U =
0
1
06,00
BB 0
BB 0
@0
0
3,00
7,50
0
0
0
1,00
1,50
1,53
0
0
4,00
3,00
4,73
17,48
0
1 06
CC BB3
CC = BB1
A @4
2,00
0,00
0,67
2,61
6,43
3
9
2
5
1
1
2
2
6
1
4
5
6
1
6
La salida del programa nos muestra (por razones de legibilidad) solo la matriz inicial y la matriz final
resultante. Si el tama
no de la matriz es mayor a 15, el programa imprime solo el tiempo de ejecuci
on
que tard
o el programa en realizar la ejecuci
on.
b) Gr
afica de tiempos de ejecuci
on vs. N
umero de procesadores PVM
# Procesos
1
2
4
6
7
n100
0.38
0.18
0.48
0.06
0.05
n200
0.44
0.36
0.38
0.38
0.35
n500
6.73
6.66
6.72
6.89
5.72
n1000
40.32
55.13
58.34
50.01
59.13
n Paralela, Factorizaci
Programacio
on LU
2
1
1
6
7
1
CC
CC
A
10
n Paralela, Factorizaci
Programacio
on LU
Factorizaci
on LU usando rutinas de PVM
11
c) An
alisis de complejidad del algoritmo con procesos PVM
Para este an
alisis, hay que tomar en cuenta adem
as del tiempo de c
omputo que toma el algoritmo, el
costo de comunicaci
on. Como el algoritmo hace uso de la eliminaci
on Gaussiana, esto le toma O(n3 )
operaciones. Asumiendo que cada operaci
on de punto flotante toma unidades de tiempo y que n es
suficientemente grande, el tiempo de c
omputo es T (1, n) = 23 n3 + costo de comunicaci
on.
La computaci
on y comunicaci
on en el desarrollo del algoritmo y paso de mensajes es lo que cuesta m
as
en esta versi
on paralela de la factorizaci
on LU. Con
d) Ajuste de curvas: expresi
on matem
atica
e) Gr
afica de aceleraci
on (tiempo secuencial/tiempo paralelo)
n Paralela, Factorizaci
Programacio
on LU
12
n Paralela, Factorizaci
Programacio
on LU
Factorizaci
on LU usando rutinas de PVM
13
5. Conclusiones
En este momento el tiempo de la version paralela ya esta muy cerca del tiempo de la version secuencial de PVM, sin embargo estamos ya muy cerca de lograrlo. La distribucion de datos que se
implement
o en est
a versi
on mejor
o en gran medida los tiempos vistos en las anteriores entregas. Se
esta considerando una manera de reducir la longitud de los buffers de comunicacion entre el proceso
maestro contra los otros procesos. Esto es porque a medida que aumenta el valor de k, hay columnas que ya no se modifican, entonces ya no es necesario envar el tama
no del buffer completo sino
solamente la parte que en realidad le va a servir al proceso receptor. De igual manera, los procesos
receptores reducir
an el tama
no del buffer de respuesta al maestro lo cual reducira tiempos de comunicaci
on y es posible que se supere los tiempo dados por la version secuencial. De hecho como
puede verse en las gr
aficas de aceleracion, ya lo hace en algunos casos pero comienza a dispararse
para valores de n = 1000.
Se pretende realizar estas modificaciones para la entrega final y aplicarlo tambien a la version de
MPI y threads.
5.0.1 Anexo: C
odigo del programa
1
2
/*
FActorizacion LU version PVM
3
4
*/
5
6
7
8
9
10
11
12
13
14
15
16
17
n Paralela, Factorizaci
Programacio
on LU
14
18
19
20
21
22
float promedio;
struct timeval tinicial, tfinal, tdiferencia;
struct timezone zone;
long
totalsec=0,totalmic=0;
long ajustesec=0,ajustemicro=0;
23
24
25
26
27
28
29
30
31
32
mygid = pvm_joingroup(GRUPO);
if (mygid < 0){
pvm_perror(argv[0]); pvm_exit(); return -1;
}
33
34
ntids = pvm_siblings(&tids);
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
blk = atoi(argv[1]);
if( blk < ntids){
if(myrank ==0){
printf("Valores incorrectos\n ");
printf("1. El tamanio de la matriz debe ser mayor o
igual al numero de procesadores\n");
}
pvm_exit(); return -1;
}
53
54
55
56
57
58
59
if (myrank == 0){//maestro
totalsec=0;
totalmic=0;
ajustesec=0;
ajustemicro=0;
60
61
62
63
64
65
if(blk <=15)
band = 1;
else
band = 0;
//comienzo = clock();
66
67
68
69
70
71
72
Factorizaci
on LU usando rutinas de PVM
15
73
74
75
76
77
78
79
80
81
//reparticion de trabajo
numfil = (blk -1) / (ntids-1);
residuo = (blk-1) % (ntids-1);
82
83
84
85
86
87
88
89
90
91
92
fila = 1;
indice = 1;
for(i=1; i < ntids; i++){//inicia ciclo para repartir las tareas entre
if(residuo > 0){
//todos los hijos
valor = numfil +1;
residuo--;
}
else{
valor = numfil;
}
93
94
95
96
97
98
99
100
101
102
103
//tareas[indice] = valor;
pvm_initsend(PvmDataDefault);//enviando el valor del vector de tareas
pvm_pkint(&valor, 1, 1);
pvm_send(tids[i], TAG);
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
16
128
129
130
131
132
133
134
135
136
pvm_initsend(PvmDataDefault);//enviando el valor de k
pvm_pkint(&k, 1, 1);
pvm_send(tids[hijo], TAG);
137
138
139
140
pvm_initsend(PvmDataDefault);//enviando el buffer
pvm_pkfloat(aux, formula, 1);
pvm_send(tids[hijo], FILAS);
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
}//end over if
else {//trabajo de los hijos
int res, n, tam, k2, size, cont, band, info, iter, virtualk, kill;
171
172
173
174
175
176
177
178
179
180
181
182
for(iter =0; iter < n-1; iter ++){//ciclo de recepcion de los hijos
n Paralela, Factorizaci
Programacio
on LU
Factorizaci
on LU usando rutinas de PVM
17
183
184
185
186
187
188
189
190
pvm_recv(tids[SOURCE], FILAS);
pvm_upkfloat(aux2, size, 1);
//recibiendo el buffer
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
}
pvm_exit();
return -1;
207
208
209
210
211
212
213
214
}
subA[i][k2] = subA[i][k2] / subA[virtualk][k2]; //pivote
for(j = k2 +1; j< n; j++)
subA[i][j] = subA[i][j] - subA[i][k2] * subA[virtualk][j];
215
}
cont++;
216
217
218
219
220
221
222
223
//reservando memoria
int pos = 0, tambuff;
tambuff = n * hilos[0];
filas = (float*) realloc ( filas, sizeof(float) * tambuff);
224
225
226
227
228
229
230
231
232
233
234
235
236
237
18
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
freematrix(array, blk);
}
free(aux);
free(tareas);
free(results);
free(hilos);
free(aux2);
}
pvm_exit();
267
268
269
printf("its done!");
fflush(stdout);
270
271
return 0;
272
273
274
275
276
277
//**********************************************************************************
//biblioteca de funciones funciones.h
#include <pvm3.h> #include <stdio.h> #include <stdlib.h> #include <time.h>
//#include "funciones.h"
/* Maximum number of children this program will spawn */ #define MAXNTIDS
32 #define MAXROW
10
278
279
280
281
282
283
284
285
286
287
288
int *tids; int ntids; int mytid, mygid; //variables globales int myrank;
289
290
291
292
Factorizaci
on LU usando rutinas de PVM
19
293
294
295
296
297
298
299
300
301
302
303
}
printf("---------- Matriz U ------------\n");
for(i=0; i< tam; i++){
for(j=0; j< tam; j++){
if(i>j)
printf(" 0 ");
else
printf(" %2.2f ", matriz[i][j]);
}
printf("\n ");
}
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
void uneArregloMatriz(float *aux, float **matA, int subtam, int tam){ int i,j, desp;
for(i=0; i< subtam; i++)
for(j=0; j< tam; j++)
matA[i][j] = aux[i * tam + j];
}
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
void formaBuffer(float *filas, float **subA, int subtam, int tam){ int i,j;
for(i=0; i< subtam; i++){
for(j=0; j< tam; j++){
filas[i * tam + j] = subA[i+1][j];
//
printf(" %.2f ", filas[i * tam + j]);
//
fflush(stdout);
}//printf("\n ");
}
}
340
341
342
343
344
345
346
347
20
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
void uneMatrices(float *aux, float **matA, int tam){ int i,j, desp;
for(i=0; i< tam; i++)
for(j=0; j< tam; j++)
matA[i][j] = aux[i * tam + j];
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
Factorizaci
on LU usando rutinas de PVM
free(mat[i]);
free(mat);
403
404
405
21
406
Referencias
[1] Rob Bisseling. the bulk synchronus parallel model, 2008. Online in http://www.math.uu.nl/people/
bisselin/PSC/psc2 3.pdf. Accessed 24-Febrero-2008.
[2] Mattwb. Lu decomposition, 2000. Online in http://everything2.com/index.pl?node id=701232. Consultada el 22-Enero-2008.
[3] Wikipedia. Schur complement wikipedia, the free encyclopedia, 2008. Online in http://en.
wikipedia.org/w/index.php?title=Schur complement&oldid=185516241. Accessed 28-Febrero-2008.
n Paralela, Factorizaci
Programacio
on LU