Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi Lezione n°4 Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi 1
Simulazione della scrittura concorrente (caso generale) Problema: N processori P1, P2, …, Pn vogliono scrivere i valori d1, d2, …, dn in K diverse celle di memoria di una P-RAM di tipo EREW, in generale K<N . I valori d1, d2, …, dn sono contenuti in un vettore D dato in input. Sivuole simulare la concorrenza con priorità (scrive il processore di indice minore). Algoritmo: Idea analoga a quello visto per il caso generale di lettura concorrente Passo 1: si costruisca M, vettore di coppie del tipo (Pi, Lj), ciascuna indicante che il processore i-esimo vuole scrivere nella j-esima locazione di memoria (i=0…N-1, j=1…K) il dato memorizzato nel vettore D (i-esima locazione). Questo vettore viene ordinato in modo stabile, rispetto ai valori di Lj. Passo 2: si raggruppino i processori rispetto alla comune locazione di memoria a cui vogliono accedere e si individuino gli inizializzatori di ogni blocco. Passo 3: in ogni blocco, il processore di indice minore (il primo del blocco) scrive la sua informazione nella locazione di memoria caratterizzante il blocco.
Esempio di scrittura concorrente Passo 1: analogo Passo 2: P0: iniz[ 0 ] = true for i = 1 to n-1 pardo Pi: if M[ i ].loc M[ i-1 ].loc then iniz[ i ] = true else iniz[ i ] = false Passo 3: for i = 0 to n-1 pardo Pi: if iniz[ i ] then scrivi D[ M[ i ].proc ] in M[ i ].loc 1 2 3 4 5 Proc 8 9 Loc x z a b c D T F iniz y Memoria x a 1 2 3 4 5 6 7 8 9 z b c D P3 P0 P5
Broadcast su rete a Vettore Si adoperano N processori Input su P0 Broadcast(x) begin P0: a0 = x for i = 1 to N-1 do Pi: ai = ai-1 end Tempo parallelo N x 0 1 2 N-1 4
Si adoperano RxC processori Broadcast su mesh Si adoperano RxC processori Input su P0,0 Broadcast(x) begin P0,0: a0,0 = x for j = 1 to C-1 do P0,j: a0,j = a0,j- for i = 1 to R-1 do for j = 0 to C-1 pardo Pi,j: ai,j = ai-1,j end Tempo parallelo C+R x 0 1 2 C-1 1 2 5
Broadcast su albero binario Con n foglie e 2n-1 processori Input alla radice Broadcast(x) begin P1: a1 = x for i = 0 to log n -1 do for j = 2i to 2i+1-1 pardo Pj: a2j = aj a2j+1 = aj end Tempo parallelo logaritmico a2 a4 a5 a3 a6 a7 a1 6
Si adoperano n=2d processori Broadcast su ipercubo Si adoperano n=2d processori Input su P0 Broadcast(x) begin P0: a0 = x for i = 0 to d-1 do for j = 0 to 2i-1 pardo Pj: aj+2i = aj end Tempo parallelo d = log n x 000 001 101 111 110 010 100 011 7
Si adoperano N processori Caricare n valori distinti in un vettore ovvero pipeline su rete a vettore Si adoperano N processori begin for h = 0 to N-1 do for i = 0 to h pardo Pi: if (i = 0) then a0 = read(); b0 = a0 else ai = bi-1; bi = ai end All’istante i, tutti i processori dallo 0-esimo all’h-esimo lavorano in parallelo caricando nella propria memoria locale il valore contenuto nella memoria locale del processore che lo precede Poiché bisogna caricare N elementi il tempo parallelo totale rimane N c b a 8
Pipelining Una CPU con pipeline è un modello semplice di macchina parallela composta da cinque stadi specializzati, capaci di eseguire, ciascuno in maniera sequenziale, una delle operazione elementari caratterizzanti l’elaborazione di una istruzione da parte di una normale CPU (lettura dell’istruzione dalla memoria, decodifica istruzione, lettura degli operandi dai registri,esecuzione dell’istruzione, scrittura del risultato nel registro opportuno). Ad ogni ciclo di clock dall'ultimo stadio esce un'istruzione completata. A regime, in uno stesso istante, ogni stadio esegue l’istruzione che lo specializza su successive diverse istruzioni. Di conseguenza si guadagna una maggior velocità di esecuzione a prezzo di una maggior complessità circuitale del microprocessore. L'implementazione di una pipeline non sempre moltiplica il “throughput” finale, in quanto questo dipende da quante istruzioni possono essere eseguite in parallelo senza creare conflitti o errori di esecuzione. Istruzioni che possono richiedere l'elaborazione di dati non ancora disponibili o la presenza di salti condizionati sono due esempi tipici di istruzioni non parallelizzabili. . 9
Caricare RxC valori distinti in una mesh Si adoperano RxC processori begin for k = 1 to R do for h = 0 to C-1 do for j = 0 to h pardo P0,j: if (j = 0) then a0,0 = read(); b0,0 = a0,0 else a0,j = b0,j-1; b0,j = a0,j if (k < R) then for i = k downto 1 pardo for j = 0 to C-1 pardo Pi,j: ai,j = ai-1,j; bi,j = ai,j end Poiché bisogna caricare RC elementi il tempo è pari a RC c b a f e d a i h g l k j f e d g a 10
Rete combinatoria Una rete combinatoria C può essere vista come un grafo diretto aciclico GC avente un nodo per ciascun elemento combinatorio c e un arco diretto (c',c") se l’output di c' è input di c". La dimensione di una rete combinatoria è il numero di nodi del grafo e la profondità è il diametro del grafo. Il fan-in di un elemento c è il grado entrante del nodo c in GC e corrisponde al numero di input dell’elemento. Il fan-out di un elemento c è il grado uscente del nodo c in GC. È da notare che non necessariamente il numero di output di un elemento combinatorio è uguale al suo fan-out, infatti un elemento combinatorio con un solo filo di output può “servire” un numero qualunque di altri elementi. 11
Elemento combinatorio Def: Un elemento combinatorio è un qualunque elemento di circuito che abbia un numero costante di input e output e che esegua una funzione ben precisa. Esempi: Porte logiche Comparatore ecc… Più elementi combinatori possono essere collegati tra di loro formando una rete combinatoria dove l'output di un elemento può essere l'input di uno o più altri elementi. or not and comp x y min{x, y} max{x, y} 12
Teorema di Brent Teorema (CREW): ogni algoritmo che lavora su una rete combinatoria di profondità d e dimensione n che sia a fan-in limitato, può essere simulato da un algoritmo che lavora su una PRAM CREW con p processori in O(n/p+d) tempo. Teorema (EREW): ogni algoritmo che lavora su una rete combinatoria di profondità d e dimensione n che sia a fan-in e fan-out limitato, può essere simulato da un algoritmo che lavora su una PRAM EREW con p processori in O(n/p+d) tempo. 13
Teorema di Brent - Esempio Profondità: d = 5 Dimensione: n = 22 Processori: p = 3 14
Dimostrazione del teorema di Brent Modelli di calcolo: - PRAM-EW con p processori p0, p1, …, pp-1. - Rete combinatoria C di profondità d e dimensione n = ∑ni , i=1..d, con ni numero di elementi al livello i. L’input del circuito combinatorio si considera disponibile nella memoria condivisa. Il fan-in limitato evita che la memoria condivisa non sia sufficiente a memorizzare i risultati intermedi del calcolo. Idea della dimostrazione: Ogni processore simula un componente del primo livello della rete e fornisce l’output che può essere immagazzinato nella memoria condivisa. Si ripete l’operazione per un numero di volte pari alla profondità del circuito utilizzando l’output di ogni livello come input del livello successivo. Nel caso in cui p sia minore del massimo numero di elementi combinatori presenti in uno stesso livello, si dovrà effettuare un numero di passi seriali proporzionale al rapporto tra il numero di elementi del livello i e p. 15
Modelli CREW ed EREW nel Teorema di Brent La complessità tiene conto della profondità del circuito e dei passi seriali necessari a simulare un livello. Tp = ∑ ⎡ni /p⎤ ≤ ∑ (ni /p +1) = n / p + d con i=1..d Abbiamo detto che il processore che simula l’elemento combinatorio fornisce l’output che può essere immagazzinato nella memoria condivisa. Se più processori richiedono in input quello stesso valore si deve accettare che la P-RAM sia a lettura concorrente. Se si accetta l’ipotesi che anche il il fan-out sia limitato, si può considerare che in tempo costante l’output del circuito combinatorio sia direttamente copiato nell’input dei circuiti che lo richiedono. Questa limitazione permetterebbe la simulazione su una P-RAM a lettura esclusiva. 16
Trasportabilità fra P-RAM con diverso numero di processori Teorema (p' < p): ogni algoritmo A che lavora in tempo parallelo O(t) su una PRAM con p processori può essere simulato da un algoritmo A' che lavora su una PRAM con p' processori (p' < p) in tempo O(t p / p'). Dimostrazione: durante ognuno dei t passi dell’esecuzione di A, i p processori lavorano parallelamente in tempo O(1). Durante ogni passo della esecuzione di A', ciascuno dei p'<p processori eseguirà un blocco seriale di p/p' operazioni in tempo O(p/p'). Pertanto il tempo parallelo relativo alla esecuzione di A' sarà O(tp/p'). Il costo dei due algoritmi A e A' rimane pari a O(tp). 17