Algoritmi di base, complessità
Criteri di valutazione
Quando si progetta un nuovo algoritmo per la risoluzione di particolari problemi è importante valutarne i requisiti. I criteri di valutazione sono tanti e variano dal tempo di esecuzione al numero dei processori utilizzati. Dal costo al tipo di tecnologia applicata   ed eventualmente se basata su specifiche architetture. Una volta completato lo studio è opportuno confrontare le stesse unità di misura su altri progetti per la risoluzione dello stesso problema, in particolare se vengono usati concetti diversi come per la programmazione parallela e quella classica sequenziale. Comunque quello che ampiamente preme nei criteri di programmazione è il tempo di esecuzione. Esso è definito come il tempo speso dal momento in cui l’algoritmo parte al momento in cui esso termina. Nel caso parallelo il tempo di esecuzione è dato dal momento in cui il primo processore inizia il calcolo al momento in cui l’ultimo processore lo finisce.  Praticamente in questo paragrafo saranno valutati i seguenti criteri : 
1)  Il conteggio dei passi 
2)  Speedup 
3)  Numero dei processori 
4)  Costo 
5)  Altri tipi di misure 
Per una buona analisi di algoritmo parallelo è dunque sempre opportuno fare riferimento ai criteri precedentemente elencati. 
     1)  Per condurre una analisi teorica sul tempo richiesto per risolvere problemi computazionali  si fa normalmente riferimento al calcolo del numero di operazioni base o quello che viene definito il conteggio dei passi eseguiti dall’algoritmo nel caso peggiore. Una definizione simile lascia pensare ad una descrizione del numero di passi come funzione della dimensione dell’ingresso. La definizione di ciò che costituisce un passo varia dipendentemente dai modelli di calcolo. Generalmente vengono comunemente accettati come operazioni base nella maggior parte dei modelli il confronto, la somma e lo scambio fra due numeri. Per un calcolatore di tipo SISD, ognuna di queste operazioni richiede un numero costante di unità di tempo. Diversamente, nell’esecuzione di un algoritmo parallelo si distinguono due tipi di passi : passi di calcolo e passi di comunicazione. I primi rappresentano un’operazione aritmetica logica eseguita su un dato all’interno di un processore, i secondi rappresentano il viaggio da un  processore ad un altro attraverso la memoria condivisa o la rete di comunicazione. 

    Esempio :
    Per un algoritmo parallelo che analizza un file con   ingressi su un calcolatore EREW SM SIMD fornito di N processori vengono richiesti logN  passi di  trasmissione ed esattamente n/N  passi per il confronto all’interno di ciascun  processore. Il corrispondente tempo di esecuzione è allora t(n)=logN+n/N  . 
   
In generale i passi di calcolo e di comunicazione non richiedono lo stesso tempo, 
anzi, i passi di comunicazione di solito dipendono dalla distanza tra i processori 
 che  tipicamente risultano più lunghi. 
     2)  Nella valutazione di un algoritmo parallelo risulta spontaneo il confronto di questo con il migliore algoritmo che risolve lo stesso problema nel caso sequenziale. Perciò,  una buona indicazione della qualità dell’algoritmo parallelo è il calcolo dello speedup  comunemente detto guadagno in velocità.  Questo viene definito : 

                       Tempo di esecuzione nel caso peggiore per 
                              l’algoritmo sequenziale noto come il più 
                              veloce per il problema 
         Speedup = ------------------------------------ 
                             Tempo di esecuzione valutato nel caso  
                             peggiore per l’algoritmo parallelo 

Chiaramente, più grande è il guadagno in velocità, migliore è l’algoritmo. Un altro tipo di misura è l’Efficienza definita da : E(n)=T1(n)/pTp(n)  avendo posto con p il numero dei processori , con T1(n) il tempo di esecuzione dell’algoritmo parallelo su un processore che non necessariamente è lo stesso che si ottiene nel caso sequenziale. Si è inoltre indicato con Tp(n) il tempo per risolvere lo stesso problema con  p processori. 
     3)  Il numero dei processori è un altro importante criterio per valutare un algoritmo parallelo. Conoscere tale numero è importante per l’acquisto, la manutenzione e  la messa in opera degli stessi calcolatori. Naturalmente più alto è il numero dei processori  che un algoritmo utilizza per risolvere un problema, più costoso diventa ottenere la soluzione. 
     4)  Il numero dei passi eseguiti da tutti i processori per la risoluzione del problema relativo al caso peggiore rappresenta un altra occasione di valutazione dell’algoritmo parallelo, il costo. Se i processori eseguono lo stesso numero dei passi possiamo formulare tale valutazione : 

costo = Tempo di esecuzione in parallelo X  numero dei processori usati 

cioè sfruttando la notazione dei punti precedenti : c(n)=p(n) t(n).  Se i  processori vengono utilizzati con un numero diverso di passi allora occorre  considerare il limite superiore. Ci troviamo nel caso ottimale se il costo di un algoritmo parallelo coincide con il limite inferiore a meno di una costante. Questo vuol significare che l’algoritmo non può essere migliorato. Ovvio che è sempre possibile ridurre il tempo di esecuzione incrementando il numero dei processori. Anche in questo caso possiamo parlare di efficienza ottenuta da : 

                                    Tempo di esecuzione nel caso peggiore 
                                       del migliore algoritmo sequenziale  
                                       noto per il problema 
                  Efficienza = -------------------------------- 
                                       Costo dell’algoritmo in parallelo 

Solitamente, l’efficienza è minore o al massimo uguale a 1 altrimenti si rischia di aver un algoritmo sequenziale più veloce di quello in parallelo, assurdo. 
      5)  Da molti anni ormai i calcolatori digitali vengono prodotti con una tecnologia che prevede l’uso di porte logiche interconnesse su pacchetti di circuiti integrati chiamati chip. Il numero delle porte residenti su ogni chip determina il livello di integrazione. La più usata è la VLSI cioè integrazione su grandissima scala dove si è in grado di ospitare un milione di porte logiche su di un chip da 1centimetro quadrato. Per valutare perciò algoritmi paralleli per VLSI possono essere usati  altri tipi di misure : 
i)  L’area del processore 
ii)  La lunghezza delle connessioni 
iii)   Il periodo del circuito. 
Praticamente queste ultime misure sono strettamente connesse alla sezione hardware  sulla progettazione di calcolatori specifici paralleli. D’altra parte, il costo dell’hardware è sempre stato un grosso fattore di limitazione nella sperimentazione. 
i)  Normalmente l’area occupata da ciascun processore è una quantità costante. Sapere quanti processori può ospitare un chip risulta importante durante la progettazione. In alternativa, se il numero dei processori è fissato, allora la dimensione del chip sarà definita dall’area totale che i processori richiedono. Se due algoritmi richiedono lo stesso tempo per risolvere un problema, la preferenza viene data al circuito VLSI che occupa un’area inferiore. 
ii)  Anche la lunghezza delle connessioni fra processori in una data architettura occupa un ruolo fondamentale nella valutazione. La lunghezza si dirà regolare se i fili di connessione sono di dimensione uguale per tutti. Se invece la lunghezza varia in diversi moduli separati, si dirà modulare. Fissare la lunghezza delle connessioni significa che il tempo speso da un segnale per propagarsi da un processore all’altro è sempre costante. Se la lunghezza dei fili cambia da una sezione della rete ad un’altra, il tempo di esecuzione diventa una funzione della lunghezza. 
iii)  Il tempo speso da un algoritmo parallelo per ricevere i suoi ingressi e, una volta finito di calcolare, per restituire le proprie uscite viene definito periodo. Data una sequenza di ingressi  A1 ,  A2 , ... , An  disponibili in una coda pronti per essere trattati, allora il periodo rappresenta il tempo speso tra il momento in cui si è iniziato a considerare Ai  e quello in cui comincia Ai+1 . Un tempo, questo, che dovrebbe essere lo stesso per tutti gli ingressi. Evidentemente, per un algoritmo parallelo è desiderabile avere un periodo il più piccolo possibile. 

Modelli paralleli
Per la progettazione di algoritmi adatti a funzionare su architetture parallele di tipo generale vengono introdotti dei modelli di calcolo. Questi modelli aiutano il programmatore nella valutazione dell’algoritmo, nella descrizione e di conseguenza nella possibilità di farne un’accurata analisi. Idealmente questi modelli potrebbero soddisfare dei requisiti come la semplicità e la duttilità.  Nel primo caso, il modello dovrebbe essere abbastanza semplice da permettere un’immediata descrizione e un’analisi sulle prestazioni come la velocità, la comunicazione e l’uso della memoria. Inoltre si rende opportuno che il modello sia il più indipendente possibile da particolari classi di hardware. Una buona duttilità vuol significare che gli algoritmi paralleli sviluppati possano facilmente essere adattabili su computers di tipo parallelo. Di conseguenza è possibile sfruttare l’analisi elaborata in generale per la valutazione dell’algoritmo su specifiche architetture. Per lo sviluppo e l’analisi degli algoritmi, tra i modelli più usati si riconoscono i Direct Acyclic Graphics, Shared Memory e Network. Altri tipi, meno utilizzati ma non certo di minore importanza sono il Parallel Comparison Tree, Sorting Networks, e il Boolean Circuits. Comunque, nella ricerca teorica si fa uso frequente dei modelli a condivisione di memoria (Shared Memory). 
 

 
Introduzione / Indice Capitolo ICapitolo III

Capitolo IV Capitolo VBibliografia

 Osservazioni: Gian Paolo Bulgarini