Sei sulla pagina 1di 4

FORME DI PARALLELISMO

Processore Sequenziale: ogni istruzione viene completamente eseguita prima di passare alla prossima
Processore Parallelo: non è detto che ogni istruzione termina prima della successiva

COMPUTAZIONI PARALLELE OPERANTI SU STREAM:


Lo studio delle applicazioni e dei sistemi ad alte prestazioni prende in considerazione strutture generali a
grafo, dove i nodi corrispondono a moduli di elaborazione e gli archi a canali di comunicazione tra moduli:

Questo modello generale è applicabile a qualunque livello. I moduli potranno essere processi, se ci poniamo
a livello delle applicazioni, oppure unità di elaborazione, se ci poniamo a livello firmware. I canali di
comunicazione costituiscono le entità attraverso le quali i moduli interagiscono. Computazioni a livello di
applicazioni vengono eseguite dalle architetture parallele capaci di esplicitare parallelismo tra processi; si
tratta di vari tipi di architetture a processori multipli, tanto a memoria condivisa (multiprocessor) quanto a
memoria distribuita (multicomputer). Agli effetti del presente capitolo, per la comprensione dei concetti e
tecniche a livello di processi è sufficiente pensare che i programmi paralleli siano eseguiti su un
'architettura astratta avente le seguenti caratteristiche:

• tanti nodi di elaborazione, o Processing Element, PE 0, .... PEn-1, per quanti sono i processi dell’applicazione
parallela;
• vi è corrispondenza biunivoca tra processi dell’applicazione e nodi di elaborazione sui quali i processi
vengono eseguiti;
• la struttura d ’interconnessione astratta è costituita dai canali di comunicazione usati dai processi
dell’applicazione parallela. Con riferimento alla precedente computazione a grafo con moduli M0, ..., M4,
se vista a livello di processi, l’architettura astratta riproduce la forma della computazione stessa;
• i nodi di elaborazione hanno le caratteristiche dell’architettura astratta dei nodi fisici ai livelli assembler,
firmware e del supporto a tempo di esecuzione dei processi.
Nel caso che la computazione sia espressa a livello firmware, il grafo della computazione corrisponde alla
struttura delle unità interconnesse e cooperanti. Nella struttura della computazione, in generale ogni
modulo può essere visto come un servente nei confronti di uno o più moduli e come cliente nei confronti di
altri. Ogni modulo è definito per eseguire un certo insieme di operazioni su proprie strutture dati e su valori
ricevuti da clienti, e a sua volta invia valori risultanti dalla propria elaborazione a serventi.
Nell’esempio di figura, M3 è servente nei confronti di M 1 e M2 e cliente nei confronti di M 4. Come vedremo,
ai due casi di serventi inseriti in strutture a grafo aciclico, oppure in strutture a domanda-risposta,
corrisponderanno propri metodi di analisi delle prestazioni. Siamo interessati particolarmente al caso di
elaborazione su stream: ogni modulo riceve e invia, su ogni canale d’ingresso e di uscita rispettivamente,
una sequenza di valori con tipo, detta appunto stream (stream d’ingresso e stream di uscita).
I valori dello stream sono detti elementi dello stream. La lunghezza di uno stream (numero degli elementi
dello stream) può essere finita e nota, oppure illimitata, a seconda del problema. In generale, ogni canale è
caratterizzato da un proprio stream, con un proprio tipo e una propria lunghezza.

1
I nodi del grafo possono avere
• logica OR: ogni elemento prodotto da un modulo è inviato su uno degli stream di uscita, caratterizzati da
una certa probabilità; nei confronti degli stream d’ingresso un modulo ha un comportamento
nondeterministico: l’operazione affidata al modulo è eseguita di volta in volta sul singolo elemento ricevuto
da uno dei possibili mittenti;
• logica AND: ogni elemento prodotto da un modulo è inviato su tutti gli stream di uscita; nei confronti degli
stream d’ingresso un modulo ha un comportamento dataflow: l’operazione affidata al modulo è eseguita di
volta in volta su tutti gli elementi ricevuti dai possibili mittenti.
L’assenza di archi del grafo è modellata come la presenza di stream fittizi d’ingresso e di uscita, sui quali
vengono ricevuti/inviati valori locali al modulo.

PARAMETRI FONDAMENTALI PER LA VALUTAZIONE DELLE PRESTAZIONI


Le varie forme di parallelismo saranno caratterizzate da un modello dei costi che permette di determinare
tali parametri in funzione di grandezze tipiche della computazione e dell’architettura.

Tempo di servizio, banda, tempo di completamento e latenza:


Per un singolo modulo sequenziale operante su stream valgono le definizioni di tempo di servizio, banda di
elaborazione, latenza e tempo di completamento. Rivediamo accuratamente tali definizioni per una
computazione parallela, a qualunque livello, costituita da un grafo di n moduli operante su stream.

Il grado di parallelismo è uguale al numero n di moduli della computazione, indipendentemente dalla loro
effettiva capacità di operare tutti in parallelo in ogni istante.
D’ora in poi, quando avremo bisogno di caratterizzare un certo parametro o sistema o applicazione X in
(1)
funzione del grado di parallelismo n useremo la notazione X(n). Ad esempio, un sistema o applicazione ∑ ❑

(n)
può essere trasformato in un sistema o applicazione ∑

❑ funzionalmente equivalente e con le stesse
interfacce.
Nota: in tutte le definizioni si parlerà di “uno” stream, ma, in generale, la computazione potrà prevedere,
per ogni modulo, più stream gestiti in modo non-deterministico o data-flow, consistentemente con la
caratterizzazione di nodi a logica OR e nodi a logica AND già data, senza che ciò modifichi in alcun modo la
portata delle definizioni stesse.
(n) (n)
La latenza di ∑ ❑, L(n) è definita come il tempo medio impiegato da ∑ ❑a elaborare completamente un
❑ ❑
singolo elemento dello stream.
(n)
Il tempo di servizio di ∑ ❑ , T(n) è definito come il tempo medio che intercorre tra l’inizio dell’elaborazione

di due elementi consecutivi dello stream.
(n)
La banda di elaborazione di ∑ ❑ , B(n) o throughput, è definita come:

B(n)= 1/T(n) numero medio di operazioni al secondo
(n)
Il tempo di completamento di ∑ ❑ , Tc(n) è definito come il tempo medio per completare l’elaborazione di

tutti gli elementi dello stream. Se questo ha lunghezza m, è valida la seguente approssimazione
Tc(n) ~ m T(n)
a condizione che m >> n

2
La condizione è valida nella grande maggioranza dei casi d’interesse, sia nelle applicazioni sia nelle
architetture firmware.
Nel caso sequenziale, il tempo di servizio e la latenza coincidono, e sono stati finora chiamati tempo medio
di elaborazione: L(1) = T(1) = T

In parallelo le due grandezze assumono valori anche molto diversi tra loro. D’ora in poi, per chiarezza e
rigore non useremo più il termine tempo medio di elaborazione (se non con significato ovvio e non
ambiguo; ad esempio, il tempo di calcolo di una funzione sequenziale), e distingueremo tempo di servizio e
latenza:
• la latenza L(n) misura quanto tempo impiega, mediamente, un elemento dello stream “ad attraversare” il
grafo della computazione;
• il tempo di servizio T(n) misura ogni quante unità di tempo il grafo è, mediamente, in grado di accettare un
nuovo elemento dello stream d’ingresso (eventualmente fittizio), senza attendere che l’elemento
precedente abbia completato l’“attraversamento” del grafo, cioè senza attendere il tempo di latenza, per
quanto lungo questo sia.
Solo in casi particolari esiste una relazione tra latenza e tempo di servizio.
Inoltre,
• esistono forme di parallelismo che potenzialmente riducono la latenza rispetto al caso sequenziale,
• mentre altre forme di parallelismo aumentano la latenza rispetto al caso sequenziale, al più hanno
potenzialmente la stessa latenza del caso sequenziale.
Occorre subito abituarsi a considerare il secondo caso come non necessariamente svantaggioso. Di fatto, lo
è (rispetto alle forme che riducono la latenza) nei casi in cui le prestazioni d’interesse dipendono in maniera
significativa dalla latenza stessa, tipicamente in strutture cliente-servente a domanda-risposta. Comunque,
in tutte le forme di parallelismo, inclusi i casi della seconda classe, una diminuzione del tempo di servizio,
pur a spese della latenza, è l ’elemento chiave per ridurre il tempo di completamento e aumentare la
banda.

In altre parole, occorre abituarsi a considerare l’importanza del tempo di servizio e a ragionare in termini
di banda (piuttosto che di “ritardi”).
La dicotomia banda vs latenza è tipica di ogni schema computazionale e di comunicazione. Nel campo delle
telecomunicazioni è frequente trovare infrastrutture di rete caratterizzate da elevata latenza (un messaggio
può impiegare un tempo considerevole a propagarsi dalla sorgente alla destinazione), ma alta banda (è
possibile che molti messaggi siano trasmessi contemporaneamente sulla rete, con sorgenti e destinazioni
diverse, ma anche con la stessa sorgente e la stessa destinazione).
La chiave per aumentare la banda è il parallelismo, mentre la latenza è migliorabile anche (talvolta soltanto)
passando a una realizzazione caratterizzata da minori ritardi intrinseci delle operazioni elaborate.

II tempo di servizio ideale di un modulo, o sottosistema, è uguale all’inverso della massima banda che il
modulo può esprimere (banda offerta) misurata in condizioni di massima sollecitazione, cioè ricevendo
elementi dello stream con una frequenza arbitrariamente alta. Il tempo di servizio effettivo di un modulo, o
sottosistema, si ottiene applicando la definizione di tempo di servizio tenendo conto della frequenza
effettiva con la quale sono ricevuti gli elementi dello stream (banda richiesta). La banda effettiva di un
modulo, o sottosistema, è la minima tra la banda offerta e la banda richiesta.
Tutte queste considerazioni, che per ora hanno una valenza intuitiva, saranno opportunamente
formalizzate e generalizzate nelle sezioni successive in modo da ricavare una metodologia da applicare
sistematicamente a qualunque computazione.

Efficienza relativa e scalabilità:


Speedup: Supponiamo di trasformare un modulo (sistema) sequenziale in una struttura parallela
equivalente con grado di parallelismo n: la banda ideale con parallelismo n è uguale a n volte la banda

3
sequenziale. In questo caso, ha senso parlare di scalabilità (talvolta detta anche speed up), definita come
Speedup(n) = Tseq / Tpar(n) = Tc(1)/ Tc(n)
= miglior tempo sequenziale/tempo parallelo quando n attività concorrenti lavorano all’oggetto in esame
La scalabilità, che fornisce una misura di quanto viene “velocizzata” la computazione rispetto a quella
sequenziale, è una misura meno generale dell’efficienza relativa: questa è di gran lunga più significativa ed
è applicabile a qualunque sistema o applicazione parallela, mentre esistono dei casi in cui la scalabilità è
poco o per niente significativa.

Efficienza: Per un sottosistema parallelo con grado di parallelismo n l’efficienza relativa è definita come:
ε(n) = Tid(n) / Tpar(n)
L’efficienza relativa rappresenta un parametro molto significativo, in quanto esprime “di quanto le
prestazioni effettive si avvicinano a quelle ideali”. Da un altro punto di vista, l’efficienza relativa può dare
un’idea sintetica del grado (percentuale) di utilizzazione dei singoli moduli che compongono un sistema
parallelo.
L’efficienza è 0 ≤ ε(n) ≤ 1
Formula: Se ho Tseq per un compito da svolgere
=> Tid(n) = Tseq/n => ε(n) = Tseq/n/n
se ci ricordiamo che Speedup(n) = Tseq/n => ε(n)=Speedup(n)/n
NOTE: Lo Speedup al meglio è l’identità; ε al meglio è 1

PARADIGMA PIPELINE
Il pipeline sarà definito da un insieme di stadi. Ogni stadio calcola una funzione. Non avremo mai xi e xi+1
nello stesso istante. Infatti ci sarà un tempo di interarrivo tA tra ogni “oggetto”.

Immagino che t0 sia il tempo di arrivo di xi in fi e t1 il tempo di uscita da fi di fi(xi).


Allora chiamerò (t1-t0) =t fi (Latenza) per indicare che ogni stadio impiega un certo tempo per accettare il
dato in ingresso, lavorarlo e buttarlo via

Mi metto nel caso generale in cui ho un PIPELINE di n stadi. Quanto tempo impieghiamo per calcolare m
task? Cioè Tempo di Completamento di m Task (fra quando arriva la prima ed esce l’ultimo risultato)
ESEMPIO) n = 2, m = 8; t1= 1t | t2 = 2t