Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi Interconnessione tramite reti Lezione n°6
AA Reti di interconnessione 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
AA Broadcast su rete a Vettore Si adoperano N processori Input su P 0 Broadcast(x) begin P 0 :a 0 = x for i = 1 to N-1 do P i : a i = a i-1 end Tempo parallelo N xx N-1
AA 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 P i :if (i = 0) then a 0 = read(); b 0 = a 0 else a i = a i-1 ; b i = a i 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 cba
AA 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..
AA Broadcast su mesh Si adoperano RxC processori Input su P 0,0 Broadcast(x) begin P 0,0 :a 0,0 = x for j = 1 to C-1 do P 0,j : a 0,j = a 0,j- for i = 1 to R-1 do for j = 0 to C-1 pardo P i,j : a i,j = a i-1,j end Tempo parallelo C+R xx xx xx x x x x C
AA 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 P 0,j :if (j = 0) then a 0,0 = read(); b 0,0 = a 0,0 else a 0,j = a 0,j-1 ; b 0,j = a 0,j if (k < R) then for i = k downto 1 pardo for j = 0 to C-1 pardo P i,j :a i,j = a i-1,j ; b i,j = a i,j end Poiché bisogna caricare R C elementi il tempo è pari a R C cbaihg lkj fed g a feda
AA Con n foglie e 2n-1 processori Input alla radice Broadcast(x) begin P 1 :a 1 = x for i = 0 to log n -1 do for j = 2 i to 2 i+1 -1 pardo P j : a 2j = a j a 2j+1 = a j end Tempo parallelo logaritmico Broadcast su albero binario a2a2 a4a4 a5a5 a3a3 a6a6 a7a7 a1a1
AA Si adoperano n=2 d processori Input su P 0 Broadcast(x) begin P 0 :a 0 = x for i = 0 to d-1 do for j = 0 to 2 i -1 pardo P j : a j+2 i = a j end Tempo parallelo d = log n Broadcast su ipercubo xx xx xx xx xx xx xx x
AA 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 P i,j : a i,j = a i,j + a i-1,j for j = 1 to C-1 do P R-1,j : a R-1,j = a R-1,j + a R-1,j-1 return a R-1, C-1 end Tempo parallelo R+C aa a a
AA Somma su albero binario (1) 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 P i :a i = read() /* input alle foglie */ for i = log n -1 to 0 do for j = 2 i to 2 i+1 -1 pardo P j : a j = a 2j + a 2j+1 return a 1 end Tempo parallelo logaritmico X 1 +…+x 4 X 1 +x 2 X 3 +x 4 X 5 +…+x 8 X 5 +x 6 X 7 +x 8 X 1 +…+x 8 x1x1 x2x2 x2x2 x3x3 x5x5 x6x6 x7x7 x8x8 P2P2 P1P1 P4P4 P8P8 P5P5 P6P6 P7P7 P3P3 P 15
AA X 1 +…+x 4 X 1 +x 2 X 3 +x 4 X 5 +…+x 8 X 5 +x 6 X 7 +x 8 X 1 +…+x 8 x1x1 x2x2 x2x2 x3x3 x5x5 x6x6 x7x7 x8x8 P 13 P 15 P9P9 P1P1 P 10 P 11 P 12 P 14 P8P8 Somma su albero binario (2) Con n foglie e 2n-1 processori Input alle foglie output alla radice Numerazione dalle foglie alla radice Somma(x) begin for i = 1 to n pardo P i :a i = read() /* input alle foglie */ for i = log n -1 to 0 do for j = 2 i to 2 i+1 -1 pardo P 2n-j : a 2n-j = a 2n-2j + a 2n-(2j+1) return a 2n-1 end Tempo parallelo logaritmico
AA Si adoperano n=2 d processori Ciascun processore ha un proprio valore nella variabile a Somma_Ipercubo() begin for i = d-1 downto 0 do for j = 0 to 2 i -1 pardo P j :a j = a j + a j+2 i return a 0 end Tempo parallelo d = log n Somma su ipercubo a2a2 a3a3 a0a0 a1a1 a6a6 a7a7 a4a4 a5a5