proParCurso 13/14 1Computadores Paralelos 2Programación basada en paso de mensajes 3Técnicas básicas de programación paralela Compulsiva, Divide y Vencerás, Pipeline, Síncrona, Equilibrado de carga y Terminación 4Programación basada en memoria común 5Algoritmos y aplicaciones Ordenación, … 4 4 2, 3, 2 2, 2 5 4
proParTemariosíncrona-2 5Computación Síncrona 1Sincronización (Barrera y su implementación) Contador Árbol Mariposa Butterfly Problemática de interbloqueo 2Cálculos sincronizados (PRAM) Modelo Hardware / Software Algunos ejemplos simples 3Ejemplo adaptado a CLUSTER Problema de la distribución del calor
proParSincronización BARRERAsíncrona-3 Muchas aplicaciones presentan sincronismo MPI_Comm_size (MPI_COMM_WORLD, &numProcesos); // Computar todos paso 1 MPI_Barrier (MPI_COMM_WORLD); // Computar todos paso 2 6 int pvm_barrier( char *group, int count ) PVM (75% según Fox, … 1994)
proParSincronización BARRERAsíncrona-4
proParSincronización BARRERAsíncrona-5 Princeton Application Repository for Shared-Memory Computers
proParBARRERA (Contador)síncrona-6 Idea: Un contador cuenta los procesos que llegan a la barrera //barrier(4) P2P2 P1P1 P3P3 P0P Pg ¿Dónde reside? Proceso gestor de grupos send(Pg, 4) recv(Pg) 3 X send(Pg, 4) recv(Pg) 2 X send(Pg, 4) recv(Pg) 1 X send(Pg, 4) recv(Pg) 0 ¿Código de Pg? Latencia O(n)
proParBARRERA (Árbol)síncrona-7 Idea: Fases de sincronismo parcial por parejas (Sean 8 Pi) P0P0 P1P1 P2P2 P3P3 P4P4 P5P5 P6P6 P7P7 Llegada a la Barrera Salida de la Barrera ¿Código de cada Pi? Latencia (2 log n)
proParBARRERA (Árbol)síncrona-8 void barrera (int yo, int dist) { if (((yo/dist)%2) == 0) { recibir (yo+dist, &msj); if (dist<N/2) barrera (yo, dist*2); enviar (yo+dist, &msj); } else { enviar (yo-dist, &msj); recibir (yo-dist, &msj); } //barrera (yo, 1); ¿ Sin recursividad ?
proParBARRERA (Árbol)síncrona-9
proParBARRERA (Butterfly)síncrona-10 Idea: Barreras parciales por parejas (Enlaces Full Duplex) P0P0 P1P1 P2P2 P3P3 P4P4 P5P5 P6P6 P7P7 Latencia (log n) ¿Código de cada Pi?
proParBARRERA (Butterfly)síncrona-11 void barrera (void) { for (dist=1; dist<N; dist*=2) if ( (yo%(dist*2)) < dist) { enviar (yo+dist, &msj); recibir (yo+dist, &msj); } else { recibir (yo-dist, &msj); enviar (yo-dist, &msj); } ? P0P0 P1P1 P2P2 P3P3 P4P4 P5P5 P6P6 P7P dist grupos 2 4 8
proParBARRERA (Problemática de Interbloqueo)síncrona-12 Ojo en situaciones tipo Butterfly: P0P0 P1P1 P2P2 P3P3 P4P4 P5P5 P6P6 P7P7 P i P i enviar (P i+1, &msj); enviar (P i, &msj); recibir(P i+1, &msj); recibir(P i, &msj); ¡ Potencial interbloqueo ! P i P i enviar (P i+1, &msj); recibir(P i, &msj); recibir(P i+1, &msj); enviar (P i, &msj); Escritura cuidadosa enviarRecibir
proParBARRERA (Problemática de Interbloqueo)síncrona-13 MPI_Sendrecv envRec(P i+1, &msjIda, &msjVuelta); envRec(P i, &msjIda, &msjVuelta); ¡ 12 parámetros ! MPI_Sendrecv_replace envRecR(P i+1, &msj); envRecR(P i, &msj); P i-1 PiPi P i+1 envRecR(P i-2,…);envRecR(P i-1,…)envRecR(P i, …); envRecR(P i, …);envRecR(P i+1,…);envRecR(P i+2,…); ¡ Ojo !
proParCálculos sincronizados (PRAM)síncrona-14 Modelo Hardware (SIMD) Programa P0P0 P1P1 PnPn Reloj Instrucciones Memoria Común Los Pi trabajan síncronamente Los Pi activos ejecutan misma instrucción sobre distintos datos La instrucción: move, add, función La propia inst. dice qué Pi activo No se pasa a siguiente instrucción hasta que todos acaban EREWLectura y escritura Excluyente CREWLectura Concurrente y escritura Excluyente ERCWLectura Excluyente y escritura Concurrente CRCWLectura y escritura Concurrente
proParCálculos sincronizados (PRAM)síncrona-15 Modelo Software (operador: forall) forall (i=j to k [by delta]) {operaciones ejecutadas por P i [P 0..P n ]} s=0; for (i=0; i<10; i++) s = s + v[i]; forall (i=0; i<4; i++) t[i] = s + v[i]; forall (i=2; i<4; i++) Q(i); forall (i=0; i<4; i++) s = s + v[i]; fuera del forall secuencial P 0 P 0, P 1, P 2 y P 3 P 2 y P 3 Sólo válido si CRCW
proParCálculos sincronizados (PRAM)síncrona-16 Algunos ejemplos simples (Difusión de un dato): ¿ D = 5, N Pi quieren leerlo y máquina EREW ( N = 2 i ) ? 5 P 0 P 1 P n-1 int A[N]; 5 Replicar D 555 forall (i=0;i<N;i++) if (D==0)... for (i=0;i<N;i++) A[i] = D; forall (i=0;i<N;i++) if (A[i]==0)... Muy lento O(N) Puedo hacerlo en paralelo
proParCálculos sincronizados (PRAM)síncrona-17 Idea: Usar más Pi según se van teniendo copias nuevas en A 5 P0P0 inicio 55 P0P0 paso 0 5 P1P1 555 P0P0 paso 1 5 P1P1 P2P2 P3P3 555 P0P0 paso 2 (con N=8) 5 P1P1 P2P2 P3P P4P4 P5P5 P6P6 P7P7 A[0] = D;// Inicio for (i=0;i< ? ;i++)// Pasos forall (j= ? ;j< ? ;j++)// Difusión A[ ? ] = A[ ? ];// paralela logN 2i2i 2 i+1 j-2 i j Complejidad (log N)
proParCálculos sincronizados (PRAM)síncrona-18 Algunos ejemplos simples (Suma de un vector):Restricción: |V| = 2 i <= N V 0 V 1 V 2 V 3 V 4 V 5 V 6 V 7 V 01 V 23 V 45 V 67 V 03 V 47 V 07 Idea: Usar un vector auxiliar (A) ¿ Código paralelo ? V A P0P0 P7P A P1P1 P3P3 P5P5 P7P A P3P3 P7P7 36 A P7P7
proParCálculos sincronizados (PRAM)síncrona-19 Algunos ejemplos simples (Suma de un vector):Restricción: |V| = 2 i <= N V A P0P0 P7P A P1P1 P3P3 P5P5 P7P A P3P3 P7P7 36 A P7P7 forall (i=0;i<N;i++) A[i] = V[i]; for (i=1;i<=logN;i++) forall (j=2 i -1; j<N; j+=2 i ) A[j]=A[j]+A[j-2 i-1 ]; ¿ Código definitivo ?
proParCálculos sincronizados (PRAM)síncrona-20 ¿Cómo simular el forall con modelo de paso de mensajes? forall (P 0..P n ) Q(i); //forall (P 0..P n ) Bcast(… 0, grupo); Q(i); Barrier(grupo); PiPi ?
proParProblema de la distribución del calorsíncrona-21 Barra con temperatura en los extremos (1D): ¿Temperatura interior? 20º100º ¿Calor o Tibieza? ¿Modelo de difusión del calor? TaTbTc Tb se ve influido por Ta y Tc Tb (Ta + Tc) / N N-1 ¿Cuándo terminar?: NumIteraciones cotaError <
proParProblema de la distribución del calorsíncrona-22 #define N #define P 100 int main (int argc, char *argv[]) { int i, t; float x[P], y[P]; x[0] = y[0] = 20.0; x[P-1] = y[P-1] = 100.0; for (i=1; i<P-1; i++) x[i] = 0.0; for (t=1; t<=N; t+=2) { for (i=1; i<P-1; i++) y[i] = 0.5 * (x[i-1]+x[i+1]); for (i=1; i<P-1; i++) x[i] = 0.5 * (y[i-1]+y[i+1]); } // imprimir los valores de temperaturas exit (0); }
proParProblema de la distribución del calorsíncrona iteraciones iteraciones
proParProblema de la distribución del calorsíncrona-24 Placa con temperatura en los bordes (2D): ¿Temperatura interior?
proParProblema de la distribución del calorsíncrona-25 Placa con temperatura en los bordes (2D): ¿Temperatura interior? 200 x 200 puntos cambiosColor < iteraciones 457:883 (seg:mseg)
proParProblema de la distribución del calorsíncrona-26 Zona con temperatura en los bordes (2D): ¿Puedo pasar? ¿Código paralelo? Aguanto hasta 71º Aguanto hasta 71,5º Aguanto hasta 71,25º ¿Seguro? Cambios<6
proParProblema de la distribución del calorsíncrona-27 for (i=1; i<numIter; i++){ T = (TN + TS + TE + TO) * 0.25; send (PN, T); // send (PS, T); // Envios no send (PE, T); // bloqueantes send (PO, T); // recv (PN, &TN); recv (PS, &TS); recv (PE, &TE); recv (PO, &TO); } Barrera Local ¿ Terminación por cota de Error ?
proParProblema de la distribución del calorsíncrona-28 Particionamiento P0P0 P1P1 P2P2 P3P3 P4P4 P5P5 P6P6 P7P7 P8P8 P9P9 P 10 P 11 P 12 P 13 P 14 P 15 P0P0 P9P9 ¡ Comunicación con 4 vecinos !¡ Comunicación con 2 vecinos !
proParProblema de la distribución del calorsíncrona-29 Particionamiento
proParProblema de la distribución del calorsíncrona-30 ¡ Ojo al partir ! (Fila de puntos fantasma) Proceso P i Proceso P i+1 Puntos fantasmas FIN