Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi Lezione n°1 Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi 1
Il nostro obiettivo Vogliamo analizzare come si deve progettare un algoritmo quando, per velocizzare la computazione, si vogliano usare contemporaneamente più entità addette al calcolo.
Computazione parallela Cosa si vuole? velocizzare il tempo di esecuzione globale di un singolo “task”; aumentare il numero totale dei task eseguibili in un fissato intervallo di tempo. Come si ottiene questo risultato? incrementando il parallelismo delle macchine. Come si utilizza il parallelismo delle macchine? traducendo un programma sequenziale esistente; progettando un nuovo algoritmo basato su paradigmi e tecniche capaci di concettualizzare il parallelismo. La progettazione degli algoritmi paralleli dipende dal modello di calcolo parallelo a disposizione
Differenza fra sistema parallelo e sistema sequenziale Le entità di un sistema parallelo non conoscono lo stato globale del sistema, ma conoscono solo il loro stato e quello delle entità adiacenti Le decisioni prese si basano sullo stato globale del sistema (non è detto che l’accesso all’intero stato avvenga in una singola istruzione) La relazione d’ordine temporale indotta negli eventi che costituiscono la esecuzione di un algoritmo concorrente non è totale: due entità p e q possono richiedere di accedere contemporaneamente alla stessa risorsa r. Gli eventi che costituiscono l’esecuzione di un algoritmo sequenziale sono totalmente ordinati: un processo p accede ad una risorsa r solo dopo che il processo q ha completato di usufruire della risorsa r. Più computazioni sono possibili contemporaneamente Dato un programma e un input solo una singola computazione é possibile
Classificazione Sistemi sincroni: Sistemi asincroni: PRAM (Parallel Random Access Machine):con memoria condivisa INM (Interconnection Networks Machine):con memoria locale Sia PRAM che INM sono macchine SIMD(Single Instruction, Multiple Data), ovvero macchine in cui ogni processore esegue la stessa istruzione su dati differenti. La tradizionale macchina sequenziale di Von Neumann è SISD( Single Instruction, Single Data): ad ogni passo, l'unica unità di controllo esegue una sola istruzione che opera su di un singolo dato. Sistemi asincroni: Sistemi Concorrenti:con memoria condivisa Sistemi Distribuiti: con memoria locale Entrambi questi sistemi sono di tipo MIMD (Multiple Instructions, Multiple Data), ovvero ogni processore ha un suo insieme di dati ed un suo insieme di istruzioni per elaborarli
Macchina parallela Il modello di macchina parallela comune sia a PRAM che ad INM è costituito da un insieme di processori, tipicamente dello stesso tipo, interconnessi in modo tale da consentire il coordinamento delle attività e lo scambio dei dati. Poiché lo stato di un computer é dato dalla lista del contenuto di tutte le celle di memoria, il parallelismo di un computer è dato dal massimo numero di celle che cambiano il loro stato durante l’esecuzione di un singolo ciclo operativo della macchina. Il parallelismo di una macchina sequenziale è pari ad 1. 6
Misure di complessità nel caso sincrono Tempo di esecuzione (Tp): si calcola come differenza tra il tempo in cui tutti i processori hanno terminato il loro lavoro e il tempo di inizio del primo processo. Numero di processori (Np): viene considerato il massimo numero di processori utilizzati. Bisogna ricordare che il numero Np di processori risulta vincolato da considerazioni di carattere tecnologico ed economico (costo iniziale e di manutenzione); in pratica si cerca di rendere Np indipendente dalla dimensione n del problema e comunque abbastanza piccolo. Volendo esprimere il rapporto esistente tra Np ed n, possiamo utilizzare un'equazione del tipo: Np = f(n) = n1-x con 0 ≤ x ≤ 1 Costo (Cp): di un algoritmo è dato dal prodotto del tempo di esecuzione per il numero di processori. 7
Speed-up / efficienza Lo Speed-Up (SU) è una misura utile a determinare quanto un algoritmo parallelo sia veloce rispetto al migliore algoritmo seriale conosciuto per lo stesso problema. Si calcola come rapporto tra il tempo impiegato nel caso pessimo dal miglior algoritmo seriale e il tempo del nostro algoritmo parallelo. Su = Ts / Tp. Se si considera lo speed-up a partire da un algoritmo seriale ottimo, lo speed-up ideale è uguale al numero di processori, poiché un algoritmo che lavora su Np Processori può essere al più Np volte più veloce del corrispondente algoritmo seriale. Quando si raggiunge lo speed-up ottimo si ottiene l'algoritmo parallelo ottimo (se lo era il seriale). Nel caso in cui lo speed-up sia maggiore di Np, l'algoritmo seriale utilizzato non è ottimo e se ne può trovare uno migliore eseguendo serialmente i passi dell'algoritmo parallelo utilizzato. L'efficienza (Eff) è il rapporto tra la complessità nel caso pessimo dell'algoritmo seriale ottimo e il costo dell'algoritmo parallelo. Eff = Ts / Cp deve risultare minore o uguale a 1. Se risultasse maggiore di 1 allora l'algoritmo seriale non sarebbe ottimo e sarebbe possibile trovarne uno migliore simulando l'algoritmo parallelo con l'esecuzione seriale degli stessi calcoli dell'algoritmo parallelo su di un unico processore. 8
Parallel Random Access Machine (Fortune-Wyllie 1978) Il modello di computazione PRAM impiega p processori sincroni tutti aventi tempo di accesso unitario ad una memoria condivisa. Ogni processore ha una propria memoria locale e tutti i processori lavorano in modo sincrono. In ogni intervallo temporale unitario, un processore può: leggere nella memoria condivisa (ovvero copiare il contenuto di una cella della memoria condivisa in uno dei registri della propria memoria locale); scrivere nella memoria condivisa (ovvero copiare il contenuto di uno dei registri della propria memoria locale in una cella della memoria condivisa); compiere una qualche computazione nella propria memoria locale. 9
E’ da notare che… PRAM ignora aspetti realistici quali: Sincronizzazione; Affidabilità; Velocità di comunicazione; Passaggio dei messaggi; Località dei dati.
Reti di interconnessione (INM) La comunicazione tra processori avviene passando attraverso opportuni canali direttamente dalla memoria locale di un processore a quella di uno o più processori adiacenti. Esempi di reti di interconnessione: Vettore Matrice (mesh) Albero binario completo Ipercubo etc 11
Si adoperano n processori Tecnica della prima metà Somma su P-RAM Si adoperano n processori Per semplicità assumiamo n potenza di 2 Somma(A) begin for i = 1 to log n do for j = 0 to n/2i -1 pardo Pj: A[ j ] = A[ j ] + A[ j+n/2i ] return A[ 0 ] end Tempo parallelo logaritmico Tecnica della prima metà 4 2 7 4 1 6 3 8 5 8 10 12 15 20 35 12
Si adoperano RxC processori Somma su mesh Si adoperano RxC processori Ciascun processore ha un proprio valore nella variabile a Somma_Mesh() begin for i = 1 to R-1 do for j = 0 to C-1 pardo Pi,j: ai,j = ai,j + ai-1,j for j = 1 to C-1 do PR-1,j: aR-1,j = aR-1,j + aR-1,j-1 return aR-1, C-1 end Tempo parallelo R+C S a 13
Si adoperano n=2d processori Somma su ipercubo Si adoperano n=2d processori Ciascun processore ha un proprio valore nella variabile a Somma_Ipercubo() begin for i = d-1 downto 0 do for j = 0 to 2i-1 pardo Pj: aj = aj + aj+2i return a0 end Tempo parallelo d = log n S a2 a3 a0 a1 a6 a7 a4 a5 14
Somma su albero binario Con n foglie e 2n-1 processori Input alle foglie output alla radice Numerazione dalla radice alle foglie Somma(x) begin for i = n to 2n-1 pardo Pi: ai = read() /* input alle foglie */ for i = log n -1 to 0 do for j = 2i to 2i+1-1 pardo Pj: aj = a2j + a2j+1 return a1 end Tempo parallelo logaritmico X1+…+x4 X1+x2 X3+x4 X5+…+x8 X5+x6 X7+x8 X1+…+x8 x1 x2 x3 x5 x6 x7 x8 P2 P1 P4 P8 P5 P6 P7 P3 P15 15