proPar Curso 18/19 5 4 2, 3, 2 2, 4 3 Computadores Paralelos Programación basada en paso de mensajes Técnicas básicas de programación paralela Compulsiva, Divide y Vencerás, Pipeline, Síncrona, Equilibrado de carga y Terminación Programación basada en memoria común Algoritmos y aplicaciones Ordenación, …
proPar Temario pipeline-2 Técnica de pipeline Plataforma para aplicaciones tipo pipeline Suma de números Ordenación de números Generación de números primos Resolución de sistemas de ecuaciones lineales
proPar Técnica de pipeline pipeline-3 1776 Adam Smith “La riqueza de las naciones” => Alfileres Fábrica ejemplo: 18 tareas 10 obreros 48.000 alfDía 4.800 AlfObrero ¿Artesano sólo y una a una? 20AlfDía un reto +Destreza -TiemposMuertos +Máquinas
proPar Técnica de pipeline pipeline-4 [8/10/1913..8/10/2013]: 100 años de coches en serie Fábrica Ford T: 3.000 piezas 84 tareas Se pasó de: 1 coche 12h 1 coche 1,5h www.elmundo.es/elmundomotor/2013/10/08/conductores/1381229685.html 16 coches por minuto 2015
proPar Técnica de pipeline pipeline-5 Idea intuitiva => Cadena de montaje de coches Descomposición funcional Secuencia de datos homogéneos de entrada Peluquería Personas Despeinadas (Di) Lavar => Cortar => Marcar Proceso divisible en subtareas secuenciales (filtros) LCM 1Hora 3 Mill. 10:45 (1) D4,D3,D2 11:00 (2) D5,D4,D3 P1 10:30 (1) D3,D2 10:15 (1) D2 10:00 (1) 10:45 (3) (2) (1) D4 11:00 (4) (3) (2) D5 P1 10:40 (3) (2) (1) 10:00 (1) 10:30 (2) (1) D3 10:15 (1) D2 10:20 (2) (1) L C M 20’ 20’ 20’ 1,5 M 1,5M 1,5M Secuencial => 1P x Hora Vs Pipeline => 1P x 20’ Difícil equilibrar carga (L=C=M) # filtros no muy grande
proPar Técnica de pipeline pipeline-6 Ejemplo1: Filtrado de señal f0 fin fout f1 f3 f2 f(t) Señal filtrada f0 f1 f2 f3 t d1 d0 d2 d3 d2 d1 d3 d4 d5 d6 d1 d0 d2 d1 d0 d0 Hay otras dos formas de utilizar pipeline que veremos con ejemplos
proPar Plataformas para aplicaciones tipo pipeline pipeline-7 PC + ClearSpeed CSX700 [96+96] #9 TOP500 11/06 SAMBA 1993 128 PC + Placa con Transputers Switch
proPar Plataformas para aplicaciones tipo pipeline pipeline-8 pingpong ¿Latencia de Core0 al resto “nseg”? 93 78 72 71 void ping () { int i, dato; volatile canal_t *suCanalPtr; suCanalPtr = dirLocal( &canal, datos.destino); dato = 0; for (i=0; i<datos.numVeces; i++) { enviar (dato, suCanalPtr); dato++; } } 99 100 103 115 121 ¡ MPI => 40.000 nseg !
proPar Suma de números pipeline-9 for (i=1; i<=N; i++) S = S + V[i]; Cada Pi tiene un dato “Vi” del vector ¿Seguro? rec(Pi, &S); env(Pd, S+Vi); P1 P2 P3 Pn V[] Un Maestro tiene el vector P1 P2 P3 Pn V[] ....... V3,V2,V1 maestro V[] rec(Pi, &V); env(Pd, [V1+V2,[V3..Vn]]); ¡ Tantos Pi como números !
proPar Suma de números pipeline-10 Un Maestro tiene el vector y hay pocos procesos “P << N” 4.000.000 4 1.000.000 Cada Pi suma una rodaja de tamaño N / P = q M P1 P2 P3 P4 V[] + rec(Pi, &V); env(Pd, [Suma[V0..Vq],[Vq+1..Vn]]); ¿Mejorable? ¡ Sigo sin hacer trabajar en paralelo a los procesos ! Tengo que sumar K vectores de tamaño N “Muchas instancias del mismo problema” Otro uso pipeline
proPar Suma de números pipeline-11 Pipeline aplicado a muchas instancias del mismo problema M P1 P2 P3 P4 M P1 P2 P3 P4 M P1 P2 P3 P4 M P1 P2 P3 P4 M P1 P2 P3 P4 M P1 P2 P3 P4 ¿Equilibrado?
proPar Suma de números pipeline-12 Pipeline aplicado a muchas instancias del mismo problema ¡ Ojo con la relación cómputo/comunicación ! Procesos 1 2 4 MismoPC 12:271 6:492 4:334 Uno*PC 11:786 17:002 Dos*PC 9:208 Procesos 1 2 4 PC9 12:191 6:281 3:812 8 2:746 cuentaPar: Números dentro de diez rangos de valores V[200.000.000] en 200 subV[1.000.000]
proPar Ordenación de números pipeline-13 3 2 5 1 4 2 3 2 3 5 1 2 3 5 1 2 3 4 5 i for i:=2 to n do x := A[i] insertar (x, A[1..i]) 4 1 5 2 3 Xmin max min maestro P1 P2 Pn 3 ¿Programa paralelo? 2 3 5 2 3 1 2 5 3 4 1 2 3 5
proPar Ordenación de números pipeline-14 Xmin max min maestro P1 P2 Pn /* Ordenación básica */ nProcsDer = n-i; rec (Pi-1, &Xmin); for (j=0; j<nProcsDer; j++) { rec (Pi-1, &X); if (X < Xmin) { env (Pi+1, &Xmin); Xmin = X; } else env (Pi+1, &X); } ¡ Queremos array ordenado en el maestro !
proPar Ordenación de números pipeline-15 Pn Anillo Array lineal bidireccional P1 M P2 P3 Pn OrdenacionBasica; env (Pi-1, &Xmin); for (j=0; j<nProcsDer; j++) { rec (Pi+1, &X); env (Pi-1, &X); } ¿Mejorable? ¿ Pipeline aplicado a muchas instancias del mismo problema ?
proPar Generación de números primos pipeline-16 Calcular los N primeros números primos (sean 10) 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 Criba de Eratóstenes ¿ Programa paralelo ? ¿Con memoria común? rec (Pi-1, &primo); while (masNumeros) { rec (Pi-1, &n); if ((n%primo) != 0) env (Pi+1, &n); } ¿ Cuándo terminar ? ¿ Hace falta seguir ? ¿Pipeline? .......5,4,3,2 P1 M P2 Pn .......9,7,5,3 ...13,11,7,5 2 3 ¿ Con menos núcleos ?
proPar Generación de números primos pipeline-17 Calcular los números primos < N 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 Criba de Eratóstenes i<N mejorable for (i=2; i<N; i++) primo[i] = TRUE; if (primo[i]) for (j=i+i;j<N;j+=i) primo[j] = FALSE; ¿ Programa paralelo ?
proPar Generación de números primos pipeline-18 Primera aproximación 0,N, … ,29,25,23,19,17,13,11,7,5 3 5 7 3 5 7,11,13,17,19,23,29, … ,N,0 7 11 ¿ Código paralelo ? ¡ Interbloqueo ! ¡ Ineficiente !
proPar Generación de números primos pipeline-19 if (yo == 0) { nPrimos = 1; // El 2 for (i=3; i<N; i+=2) env (Pder, &i); env (Pder, &cero); } rec (Pizq, &primo); while (primo != 0) { nPrimos++; // Imprimirlo? rec (Pizq, &num); while (num != 0) { if ((num%primo) != 0) env (Pder, &num); env (Pder, &num); // Cero env (Pder, &primo); // Cero reduce (+, &numPrimos, &totPrimos);
proPar Generación de números primos pipeline-20 Segunda aproximación: Dos fases y tablas de primos generadores FASE 1: Tabla de primos generadores N = 100 => 100 => <10 ¿ Código paralelo ? 0,7,5 3 5 7 0,97, … ,29,25,23,19,17,13,11 FASE 2: Cálculo del resto de primos 3 5 7 7,0 ¿ Interbloqueo ? ¿ Ineficiente ?
proPar Generación de números primos pipeline-21 Tercera aproximación: Tabla de primos generadores conocida primosec [3 .. 5.449]720 29.713.399 … 5.453, 5.451 Números < 5.4512 29.713.393 … 5.477, 5.471 Primos calculados
proPar Generación de números primos pipeline-22 Tercera aproximación: Tabla de primos generadores conocida primosec [3 .. 5.449]720 29.713.399 … 5.453, 5.451 Números < 5.4512 29.713.393 … 5.477, 5.471 Primos calculados siguiente = primosConocidos[numPrimosConocidos-1]+2; cotaSerie = siguiente * siguiente; while (siguiente < cotaSerie) { if (esPrimo(siguiente)) { printf ("%9i", siguiente); total++; if ((total%10) == 0) printf ("\n"); } siguiente = siguiente + 2; ¡ 16:714 en PC1 ! ¿ Código paralelo ?
? proPar Generación de números primos pipeline-23 Tercera aproximación paralelo: Reparto de la tabla de primos F0 [3..2.437]360 29.713.399 … 5.451 29.713.393 … 5.471 F1 [2.441..5.449]360 0, 29.713.393 … 5.958.451 … 5.479, 5.477, 5.471 ? F0 [...]180 F1 F2 F3 ¿ Código paralelo ?
? proPar Generación de números primos pipeline-24 1 2 4 8 16 16:714 recibir (miIzquierda, &unNumero); while (unNumero != 0) { if (noDivisible(unNumero)) { if (soyElUltimo) { printf ("%9i", siguiente); total++; if ((total%10) == 0) printf ("\n"); } else enviar (miDerecha, &unNumero); } Procesos 1 2 4 8 16 primopar1 16:714 PC1 Con 720 primos conocidos Procesos 1 2 4 8 16 primopar2 220:454 Parallella Con 720 primos An 1,68 0,84 En 2,72 0,68 4,35 0,54 6,84 0,43 18:892 ? 131:604 49:902 69:791 86:679 81:198 50:624 32:237
? proPar Generación de números primos pipeline-25 18:892 49:902 69:791 86:679 Procesos 1 2 4 8 16 primopar1 16:714 PC1 Con 720 primos conocidos ? 131:604 81:198 50:624 32:237 An 1,68 0,84 En 2,72 0,68 4,35 0,54 6,84 0,43 primopar2 220:454 Parallella Con 720 primos PC1 .. Con 720 primos conocidos ¡ Y buffer para 400 números ! Procesos 1 2 4 8 16 primopar2 16:714 An 1,63 0,81 En 2,59 0,65 3,85 0,48 5,55 0,35 10:257 ¡ En la práctica mejor ! 6:465 4:342 3:010
proPar Resolución de sistemas de ecuaciones lineales pipeline-26 an-1,0x0+an-1,1x1+an-1,2x2+ ..... + an-1,n-1xn-1 = bn-1 . a2,0 x0+a2,1 x1+a2,2 x2 = b2 a1,0 x0+a1,1 x1 = b1 a0,0 x0 = b0 x0 x1 xi-1 b0 X0 = a0,0 b1-a1,0x0 X1 = a1,1 b2-a2,0x0-a2,1x1 X2 = a2,2 i-1 bi-ai,jxj j=0 Xi = ai,i ¿ Programa paralelo ?
proPar Resolución de sistemas de ecuaciones lineales pipeline-27 bi-ai,jxj j=0 Xi = ai,i x0 x1 xi-1 suma = 0; for (j=0; j<i; j++) { rec (Pi-1, &x[j]); env (Pi+1, &x[j]); suma+=a[i][j]*x[j]; } x[i]=(b[i]-suma)/a[i][i]; env (Pi+1, &x[i]); Pi P0 P1 P2 P3 P4 P5 FIN “Paso al siguiente antes de terminar anterior” Otro uso pipeline