Modelli di macchine parallele
Dato l’argomento abbastanza caotico dovuto a una grande varietà di algoritmi, software e hardware, numerosi  ricercatori hanno cercato di produrre schemi di classificazione e tassonomie per l’elaborazione parallela. Uno schema molto usato è quello di Flynn che risale al 1972 e comunque anche questo risulta una pura approssimazione. La classificazione di Flynn è basata su due concetti : i flussi di istruzioni e i flussi di dati. Un flusso di istruzioni corrisponde ad un contatore di programma . Un sistema con n CPU ha n contatori di programmi, quindi n flussi di istruzioni.  Un programma è costituito da un insieme di operandi.  Un programma che calcola la media di un elenco di temperature ha un flusso di dati.  Un programma che calcola la media delle temperature per ognuno di 100 termometri, sparsi in tutto il mondo, ha 100 flussi di dati. Possiamo distinguere tra quattro classi di calcolatori a seconda se esiste uno o più di questi insiemi di dati e di istruzioni: 
1)  Singola Istruzione, Singolo Dato (SISD) 
2)  Multiple Istruzioni, Singolo Dato (MISD) 
3)  Singole Istruzioni, Multipli Dati (SIMD) 
4)  Multiple Istruzioni, Multipli Dati (MIMD) 
Calcolatori SISD 
Un calcolatore della classe SISD è costituito da un’unica unità di calcolo che riceve una singola istruzione che opera su un singolo dato. 
 Ad ogni passo durante il calcolo l’unità di controllo emette una istruzione che opera su un dato ottenuto dall’unità di memoria. Questa istruzione può dire al calcolatore, per esempio, di eseguire una operazione logica o aritmetica su di un dato e poi di ricaricarla nella memoria. La grande maggioranza dei calcolatori oggi aderisce a questo modello inventato da John von Neumann e dai suoi collaboratori nei tardi anni 1940. 
Un algoritmo per calcolatore di questa classe è detto sequenziale (o seriale). 
Calcolatori MISD 
Un calcolatore della classe MISD  è  costituito da N processori, ciascuno dotato di una propria unità di controllo e condividente la stessa unità di memoria  dove risiedono i dati.  Su questo tipo di calcolatore abbiamo N istruzioni e un unico dato. A ciascun passo, un dato ricevuto dalla memoria  viene  utilizzato da tutti i processori  simultaneamente, ciascuno in accordo con l’istruzione che riceve dalla sua unità di controllo. Dunque il  parallelismo viene raggiunto permettendo ai processori di fare cose diverse nello stesso tempo sullo stesso dato. Questo tipo di calcolatori possono essere molto utili per una classe di problemi di natura piuttosto specializzata. Per la maggior parte delle applicazioni però questi calcolatori potrebbero essere molto difficili da usare. I calcolatori paralleli che sono più flessibili e più adattabili ad un vasto campo di problemi sono quelli descritti successivamente. 
Calcolatori SIMD 
 La classe dei calcolatori SIMD è costituita da N processori identici. Ogni processore ha la sua memoria locale in cui può registrare programmi e dati. Tutti i processori operano sotto il controllo di una singola istruzione che viene fornita dall’unità di controllo centrale. Praticamente, in un calcolatore di questa classe possono risiedere N processori che possiedono copie identiche di un singolo programma in modo da elaborare N dati, uno per ogni processore. Tali processori operano in modo sincrono cioè ad ogni passo tutti eseguono la stessa istruzione ma ciascuno con un dato differente. Si possono avere istruzioni semplici come la somma o il confronto fra due numeri oppure di tipo complesso come la fusione fra due liste di numeri. Analogamente per il dato che può essere semplicemente un numero o diversi numeri nel caso più complesso. Qualche volta si ritiene necessario avere solo un sotto insieme di processori che eseguono un’istruzione e in tal caso è indispensabile che alcuni di questi siano attivi per eseguire l’istruzione oppure inattivi per attendere poi l’istruzione successiva. La disciplina di queste priorità viene affidata ad un meccanismo a tempo, il clock globale. L’intervallo di tempo fra due successive istruzioni può dipendere da queste oppure essere fissato a priori. Per poter ottimizzare lo scambio di dati o di risultati intermedi risulta interessante risolvere i problemi relativi alla comunicazione fra processori. Quest’ultimo concetto può essere affrontato in due diversi modi dando origine a due diverse sotto classi dei calcolatori SIMD in cui la comunicazione avviene attraverso una memoria condivisa o per mezzo di una rete di interconnessione. A loro volta queste sotto classi si suddividono in vari modelli. 
1)  I calcolatori SIMD con Memoria Condivisa (Shared-Memory) sono noti anche come macchina parallela con accesso casuale : Parallel Random Access Machine (PRAM). Gli N processori condividono una memoria comune e quando due di essi si desidera farli comunicare si sfrutta la condivisione di memoria. Si supponga che il processore i voglia passare un numero al processore j. Inizialmente il processore i scrive il numero nella memoria condivisa ad una data locazione accessibile al processore j. Al passo successivo, quest’ultimo legge il numero da questa locazione. Durante l’esecuzione di un algoritmo, gli N processori hanno la possibilità di accedere alla memoria condivisa per leggere dati in ingresso, per leggere o scrivere risultati intermedi e per scrivere i risultati finali. Il modello base permette a tutti i processori di accedere simultaneamente alla memoria condivisa se le locazioni di queste sono diverse. Ovviamente possono crearsi problemi di conflittualità perciò a seconda se due o più processori hanno la possibilità di accedere alla stessa locazione di memoria troviamo una gestione distinta dei  modelli base. La necessità è quella di suddividere il modello SM SIMD in quattro sotto classi . 
i)  I calcolatori SM SIMD a esclusiva lettura, esclusiva scrittura : Exclusive-Read, Exclusive-Write più brevemente EREW hanno, per i processori, un accesso esclusivo alle locazioni di memoria. Praticamente, due processori non possono accedere simultaneamente per leggere o scrivere alla stessa locazione di memoria. 
ii)  I calcolatori SM SIMD a lettura concorrente, scrittura esclusiva : Concurrent-Read, Exclusive-Write più brevemente CREW hanno, i processori, che possono leggere nella stessa locazione di memoria ma il diritto di scrivere è ancora esclusivo. 
iii)  I calcolatori SM SIMD a lettura esclusiva, scrittura concorrente : Exclusive-Read, Concurrent-Write più brevemente ERCW hanno, i processori, che possono scrivere nella stessa locazione di memoria ma l’accesso alla lettura resta esclusivo. 
iv)  I calcolatori SM SIMD a lettura concorrente, scrittura concorrente : Concorrent-Read, Concorrent-Write più brevemente CRCW hanno, i processori, che possono sia scrivere che leggere la stessa locazione di memoria. 
Concettualmente ciascuno dei diversi processori che legge la stessa locazione di memoria fa una copia dei contenuti di quella locazione e li immagazzina nella sua memoria locale. Dunque, permettere l’accesso alla lettura contemporanea dello stesso indirizzo di memoria potrebbe non creare grossi problemi. Per quanto riguarda il multiplo accesso alla scrittura la situazione si complica. Si  rabbrividisce al pensiero che diversi processori possano registrare contemporaneamente dati differenti in un specifico indirizzo di memoria. Per evitare questo conflitto di scrittura si possono usare, naturalmente per i calcolatori a scrittura concorrenziale di tipo  ERCW e CRCW,  varie alternative. Una potrebbe essere quella di abilitare alla scrittura il processore con il numero più basso negando l’accesso a tutti gli altri. Un’altra alternativa potrebbe essere quella di abilitare alla scrittura quei  processori che hanno uguale la quantità che vogliono scrivere negando l’accesso a tutti gli altri. 
Il modello EREW SM SIMD di calcolatori è indubbiamente il più debole degli altri poiché restringe l’accesso in uno specifico indirizzo ad un processore per volta. Un algoritmo per un modello di questo tipo deve essere progettato in modo da escludere ogni tentativo da parte di più processori di leggere o di scrivere simultaneamente la stessa locazione di memoria. Fortunatamente il modello EREW è sufficientemente flessibile tale da permettere la simulazione di accesso multiplo. Una simulazione di questo tipo è interessante poiché l’unico calcolatore parallelo disponibile è di tipo EREW e quindi l’unico modo per eseguire algoritmi di tipo CREW, ERCW o CRCW è attraverso la simulazione su di esso. Da un punto di vista tecnologico costruire calcolatori paralleli del tipo CREW, ERCW e CRCW con un grande numero di processori risulta praticamente impossibile. La difficoltà risiede sul numero di processori che può simultaneamente connettere le locazioni di memoria. Tale numero è limitato sia dalla dimensione che dalle proprietà fisiche del dispositivo. 
Il calcolatore SM SIMD è un modello di calcolo piuttosto veloce, anche nella sua manifestazione più debole : la classe EREW. 
I calcolatori paralleli basati su questo modello non possono essere costruiti per l’alto costo e la proibitiva grandezza che possono avere i circuiti di decodifica tra i processori e la memoria. Infatti quando un processore ha la necessità di creare un percorso con una locazione di memoria che contiene il dato si sviluppa un costo dell’eventuale  circuito espresso come numero di porte logiche necessarie per codificare l’indirizzo fornito dal processore. In questo caso se la memoria è costituita da M locazioni, il costo del circuito si può pensare come f(M). Se N processori condividono la memoria come nel modello SM SIMD, il costo del circuito di decodifica sale a  N x f(M) e quindi dipendenti da N e M. Per affrontare questo problema esistono molti modi e tutti portano inevitabilmente a modelli di calcolatori più deboli del SM SIMD. Naturalmente qualunque algoritmo può essere simulato su un modello più debole pagando un prezzo in maggiore spazio o in maggior numero di passi computazionali. Viceversa, qualunque algoritmo per modelli più deboli gira su macchine del tipo SM SIMD senza costi addizionali. Un modo per ridurre i costi di circuiti per decodifica è usare blocchi di memoria condivisa. Se per esempio, si dispone di R blocchi di   locazioni ciascuno è indispensabile la progettazione di M+R linee a doppio percorso che permettono a ciascun processore di avere accesso a qualunque blocco di memoria in qualunque momento. Tuttavia, non più di un processore può leggere o scrivere in un blocco simultaneamente come mostrato in figura 6 nel caso N=5 ed R=3. Quindi, il costo totale del circuito di decodifica è  x  più il costo degli interruttori. 
2)  I calcolatori SIMD  a rete di interconnessione rappresentano l’estensione del modello SIMD a memoria condivisa in blocchi. In questa classe di calcolatori  le M locazioni di memoria condivisa sono distribuite tra N processori in modo che  ciascuno riceva   locazioni. Inoltre, ciascuna coppia di processori è connessa da una linea bidirezionale  per poter ricevere e spedire un dato. Con queste considerazioni ciascun processore deve contenere un circuito dal costo di   capace di decodificare un indirizzo per trasmettere agli altri processori e un altro circuito dal costo di  capace di decodificare un indirizzo fornito da un altro processore. Che questo modello sia più potente rispetto a quello di memoria condivisa a blocchi lo si vede dal fatto che in esso i processori comunicano a coppie istantaneamente. 
 Per questo modello è importante discutere il costo necessario per la connessione completa degli N processori. Infatti, il collegamento di una quantità tale di processori avviene ad un costo totale pari a un numero di combinazioni semplici  di N(N-1)/2 linee. Chiaramente, per un numero elevato di processori, il costo risulta altissimo. Anche se si desiderasse affrontare un prezzo così alto, il modello non sarebbe realizzabile in quanto la dimensione fisica del processore impone un limite sul numero delle linee. Infine è da notare come un calcolatore del modello appena introdotto sia più debole rispetto ad uno SM SIMD poiché non più di un processore può accedere simultaneamente ad un blocco associato ad un altro processore. Permettere questa proprietà  porterebbe ad un costo di   che è circa lo stesso costo che si ha per calcolatori SM SIMD. Peraltro, a questo totale c’è da aggiungere il costo quadratico delle linee a doppio percorso. Fortunatamente, nella maggior parte delle applicazioni è sufficiente un piccolo sotto insieme delle connessioni per ottenere buone prestazioni, è il caso delle Reti semplici per calcolatori SIMD. Vediamo singolarmente le varie reti : 
i)  Vettore lineare. Il modo più semplice per connettere N processori è nella forma di un vettore monodimensionale. Il processore Pi  è connesso con i due vicini Pi-1 e Pi+1 per mezzo di una linea di comunicazione a due sensi. Ovviamente, i processori estremi hanno un solo vicino. 
ii) Matrice bidimensionale. Una rete di questo tipo viene ottenuta connettendo N processori in una matrice   dove. Una siffatta rete è anche denominata maglia. Il processore di riga j e colonna k definito  connette  con quattro suoi vicini ad eccezione dei processori  sulla frontiera. 
iii)  Connessione ad albero (calcolatori connessi ad albero). In questa rete i processori formano un albero binario completo. Tale albero ha d livelli numerati da 0 a d-1 e N=2d-1 nodi che rappresentano ciascuno un processore. Ciascun processore al livello i è connesso attraverso una linea a doppio senso con il suo genitore a livello i+1 e con i suoi due figli a livello  i-1. Naturalmente il processore radice non ha genitori così come i processori foglie non hanno figli. Comunque, oltre a quelle descritte, esistono diverse altre reti di interconnessione. L’uso di queste dipende notevolmente dalle applicazioni e in particolare da fattori quali i tipi di calcoli che devono essere eseguiti, la velocità di esecuzione desiderata e il numero dei processori disponibili. Per il modello SIMD, i primi strumenti di ricerca che hanno influenzato in modo significativo le progettazioni successive coinvolgono un’ampia gamma di applicazioni anche se in realtà hanno avuto un’esigua risposta commerciale. Tra queste si ricorda la Illiac IV, un sistema sviluppato all’Università dell’Illinois nel 1960. L’architettura di questa macchina è di tipo SIMD multiplo con base di array. Essa è divisa in 4 arrays di 64 processori ciascuno e controllati da 4 unità di controllo. Un’altra importante architettura di tipo SIMD è la Massively Parallel Processor o più brevemente MPP che è stata sviluppata nel 1980 dalla Goodyear Aerospazio per conto della NASA. La sua prima applicazione è stata quella di elaborare milioni di elementi di immagini satellitari. La caratteristica prorompente di questa macchina è che elabora simultaneamente ogni elemento dell’immagine. Fondamentalmente si basa su una unità di tipo array collegata in ingresso e in uscita da due interfacce a 128 bits e con memoria distribuita. 
Finora si è visto come i calcolatori SIMD siano molto più versatili rispetto a quelli di tipo MISD.  Però l’inconveniente dei calcolatori SIMD è che le applicazioni sono ristrette solo a quella classe di problemi che possono essere suddivisi. Questo perché ogni sotto problema viene risolto simultaneamente dallo stesso insieme di istruzioni. Ovviamente esistono molti calcoli che non hanno questa caratteristica e quindi non possono essere risolti dallo stesso insieme di istruzioni. Un modo per affrontare questo inconveniente è l’introduzione di una quarta classe di calcolatori che risulta essere decisamente la più potente fra tutte quelle viste. 
Calcolatori MIMD 
La classe dei calcolatori MIMD la possiamo pensare composta da N processori che eseguono N istruzioni su N dati. Ogni processore opera sotto il controllo di un insieme di istruzioni eseguite dalla propria unità di controllo. Quindi i processori possono potenzialmente eseguire programmi diversi applicati a dati diversi. Questo significa che i processori operano in modo asincrono. In modo del tutto analogo ai calcolatori di tipo SIMD, i processori comunicano per mezzo di una condivisione della memoria o per mezzo di una rete di interconnessione. I calcolatori MIMD che condividono una memoria comune sono chiamati multiprocessori o macchine altamente accoppiate. Quelli con una rete di interconnessione sono chiamati multicalcolatori o macchine debolmente accoppiate. Per i multiprocessori sorgono gli stessi problemi visti precedentemente nella sezione delle SM SIMD e perciò anche in questo caso ha senso parlare di modelli come EREW,CREW,ERCW e CRCW. Per quanto riguarda le macchine debolmente accoppiate si deve distinguere tra multicalcolatori e sistemi distribuiti. Nei primi i processori sono molto vicini gli uni dagli altri, nei sistemi distribuiti non lo sono. In quest’ultimo caso l’esempio è una rete costruita con processori che risiedono in diverse città. Tale differenza è rilevante nel momento della valutazione degli algoritmi paralleli.I calcolatori di questa classe vengono usati per risolvere problemi che non hanno una struttura regolare come richiesto dai modelli SIMD. Questa generalità non è gratuita; gli algoritmi asincroni sono difficili da progettare e valutare. Per algoritmo asincrono s’intende un insieme di processi o sezioni dell’algoritmo che vengono eseguiti simultaneamente su tutti i  processori disponibili. L’algoritmo parallelo viene avviato su un numero di processori scelto arbitrariamente creando un insieme di processi che devono essere eseguiti. Appena un processore si rende disponibile, il processo viene assegnato al processore che esegue i calcoli specificati dal processo. Se non ci sono processori disponibili, il processo viene inserito in una coda di attesa. Analogamente, se un processore è libero e non c’è nessun processo in attesa, allora il processore viene inserito in un’apposita coda. L’ordine con cui i processi vengono eseguiti può seguire una qualunque regola che assegni priorità ai processi. Ad esempio attraverso una priorità del tipo fifo (first input first output) cioè primo in ingresso e primo in uscita oppure per mezzo di una lifo (last input first output) cioè ultimo in ingresso e primo in uscita. Talvolta si ritiene utile assegnare un processo ad uno specifico processore e quindi una gestione diversa rispetto alla sola disponibilità. C’è quindi bisogno di una condizione addizionale che deve essere soddisfatta. Questi problemi vengono chiamati scheduling (gestione delle code) che sono una caratteristica della programmazione dei multiprocessori. Trovare una soluzione efficiente per questi problemi è di grandissima importanza per rendere utili i calcolatori di tipo MIMD. In teoria, qualunque algoritmo parallelo può essere eseguito in modo efficiente su modelli MIMD. Tuttavia questi possono essere usati per costruire calcolatori paralleli adatti a molte applicazioni. In tal caso vengono definiti come architetture per applicazioni generali (general-purpose). 
Si è  visto come un algoritmo progettato su un modello possa essere simulato su un altro. Una versatilità che induce a pensare come tutti i calcolatori paralleli siano equivalenti rispetto ai problemi che si possono risolvere. Naturalmente, la distinzione fra i vari modelli si evidenzia sulla facilità e la velocità con cui risolvono un particolare problema. E’ importante valutare l’insieme delle applicazioni per cui il calcolatore può essere usato e l’urgenza con cui sono necessarie le risposte del problema. Comunque, nella pratica, la scelta di un calcolatore parallelo è in generale dettata da considerazioni economiche. 
 
 
Introduzione / Indice Capitolo IICapitolo III 

Capitolo IV Capitolo V Bibliografia

  Osservazioni: Gian Paolo Bulgarini