Sophie

Sophie

distrib > Mandriva > 9.1 > i586 > by-pkgid > f1098342ec4a2b28475e34123ce17201 > files > 107

howto-html-it-9.1-0.5mdk.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
 <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
 <TITLE>Beowulf HOWTO : Progetto del sistema </TITLE>
 <LINK HREF="Beowulf-HOWTO-5.html" REL=next>
 <LINK HREF="Beowulf-HOWTO-3.html" REL=previous>
 <LINK HREF="Beowulf-HOWTO.html#toc4" REL=contents>
</HEAD>
<BODY>
<A HREF="Beowulf-HOWTO-5.html">Avanti</A>
<A HREF="Beowulf-HOWTO-3.html">Indietro</A>
<A HREF="Beowulf-HOWTO.html#toc4">Indice</A>
<HR>
<H2><A NAME="Progetto"></A> <A NAME="s4">4. Progetto del sistema </A></H2>

<P>
<P>Prima di acquistare dell'hardware, &egrave; sempre una buona idea prendere in
considerazione il progetto del sistema che si intende realizzare.
Fondamentalmente ci sono due questioni relative al progetto di un
sistema Beowulf: il tipo di nodi (cio&egrave; di computer) da usare e il modo
in cui tali nodi sono connessi. C'&egrave; una questione relativa al software,
che pu&ograve; influire sulle decisioni che riguardano l'hardware: la libreria
di comunicazione (API). Nel seguito di questo documento verr&agrave; fatta una
discussione pi&ugrave; dettagliata riguardo all'hardware e al software di
comunicazione.
<P>
<P>
<P>Anche se il numero di possibilit&agrave; non &egrave; elevato, quando si costruisce un
Beowulf, ci sono comunque alcune importanti decisioni di progetto da
prendere. Poich&eacute; la scienza (o l'arte) della "computazione parallela" ha
molte interpretazioni differenti, qui di seguito ne viene data
un'introduzione. Se non ti piace leggere materiale di rassegna, puoi
saltare questa sezione, ma sei vivamente invitato a leggere la
sezione 
<A HREF="#Fattibilit&agrave;">Fattibilit&agrave;</A> prima di prendere le
decisioni finali relative all'hardware.
<P>
<H2><A NAME="ss4.1">4.1 Una breve rassegna sulla computazione parallela</A>
</H2>

<P>
<P>Questa sezione fornisce una rassegna sui concetti della computazione
parallela.  NON &egrave; una descrizione completa n&eacute; esauriente della scienza
e tecnologia della computazione parallela. &Egrave; una breve descrizione
delle questioni che possono essere importanti per un progettista o
per un utente Beowulf.
<P>
<P>
<P>Mentre progetti e costruisci il tuo Beowulf, molte delle questioni che
vengono descritte sotto diventeranno importanti nel processo delle tue
decisioni. A causa della natura dei suoi componenti, un supercomputer
Beowulf richiede che si prendano attentamente in considerazione molti
fattori che adesso vengono a essere sotto il nostro controllo. In
generale, non &egrave; cos&igrave; difficile comprendere le questioni relative alla
computazione parallela. In realt&agrave;, una volta che le questioni sono
comprese, le tue aspettative saranno pi&ugrave; realistiche e avrai una
maggiore probabilit&agrave; di successo. A differenza del "mondo sequenziale",
in cui la velocit&agrave; del processore &egrave; considerato il solo fattore che ha la
massima importanza, la velocit&agrave; dei processori nel "mondo parallelo" &egrave;
solo uno dei vari fattori che determineranno le prestazioni e
l'efficienza del sistema complessivo.
<P>
<P>
<P>
<H2><A NAME="ss4.2">4.2 I metodi della computazione parallela</A>
</H2>

<P>
<P>La computazione parallela pu&ograve; assumere molte forme. Dal punto di vista
dell'utente &egrave; importante considerare vantaggi e svantaggi di ciascuna
metodologia. La sezione seguente tenta di dare diverse prospettive sui
metodi della computazione parallela e indica dove va a cadere una
macchina Beowulf all'interno di questo continuum.
<P>
<P>
<H3>Perch&eacute; pi&ugrave; di una CPU?</H3>

<P>
<P>&Egrave; importante rispondere a questa domanda. Usare 8 CPU per eseguire un
word processor suona un po' "over-kill" -- e in effetti lo &egrave;. Ma cosa
dire di un server web, una base di dati, un programma di rendering o
uno schedulatore di progetti? Forse pi&ugrave; CPU potrebbero essere d'aiuto. E
cosa dire di una simulazione complessa, un codice che studia la dinamica 
dei fluidi, o un'applicazione di estrazione di dati? In queste
situazioni, pi&ugrave; CPU sono sicuramente d'aiuto. In effetti, sistemi con
CPU multiple vengono usati per risolvere sempre pi&ugrave; problemi.
<P>
<P>
<P>Generalmente la successiva domanda &egrave;: "Perch&eacute; ho bisogno di due o quattro
CPU? Aspetter&ograve; semplicemente il chip iper-turbo 986." Ci sono varie
ragioni:
<P>
<OL>
<LI> Grazie all'uso di sistemi operativi multi-tasking, &egrave; possibile fare
pi&ugrave; cose alla volta. Questo &egrave; un "parallelismo" naturale che &egrave; facilmente
sfruttato da pi&ugrave; CPU a basso costo.
</LI>
<LI> La velocit&agrave; dei processori va raddoppiando ogni 18 mesi, ma cosa
dire delle velocit&agrave; delle RAM e degli hard disk? Purtroppo, queste
velocit&agrave; non stanno aumentando velocemente cos&igrave; come quelle delle CPU.
Si tenga presente che la maggior parte delle applicazioni richiedono
"accessi in memoria fuori cache" e accessi agli hard disk. Un modo per
aggirare alcune di queste limitazioni consiste nel fare pi&ugrave; cose in
parallelo.
</LI>
<LI> Le previsioni indicano che le velocit&agrave; dei processori non
continueranno a raddoppiare ogni 18 mesi dopo l'anno 2005. Per poter
mantenere questa tendenza ci sono alcuni ostacoli molto ardui da
superare.
</LI>
<LI> A seconda dell'applicazione, la computazione parallela pu&ograve;
velocizzare l'esecuzione di un fattore da 2 a 500 volte (in qualche caso
anche di pi&ugrave;). Tali performance non sono disponibili usando un singolo
processore. Anche i supercomputer che un tempo usavano processori molto
veloci, adesso sono costruiti utilizzando pi&ugrave; CPU reperibili
comunemente.
</LI>
</OL>
<P>Se hai bisogno di velocit&agrave; - sia a causa di un problema di limiti della
computazione che di un problema di limiti nell'I/O, vale la pena
considerare il parallelismo. Poich&eacute; la computazione parallela &egrave;
implementata in vari modi, per risolvere il tuo problema con il
parallelismo dovranno essere prese alcune decisioni molto importanti.
Queste decisioni possono avere effetti decisivi sulla portabilit&agrave;, la
performance e il costo della tua applicazione.
<P>
<P>
<P>Prima di entrare nei dettagli tecnici, diamo uno sguardo a un "problema
di computazione parallela" reale, usando un esempio con il quale abbiamo
familiarit&agrave;: l'attesa in lunghe code a un negozio.
<P>
<H3>Il negozio della computazione parallela</H3>

<P>
<P>Immaginiamo un grande negozio con 8 registratori di cassa raggruppati
insieme nella parte anteriore del negozio.  Assumiamo che ogni
cassiere/registratore corrisponda a una CPU e ogni cliente a un
programma di computer. La dimensione del programma di computer (il
carico di lavoro) corrisponde alla dimensione della spesa del cliente. 
Per illustrare i concetti della computazione parallela possono essere
usate le seguenti analogie.
<P>
<P>
<H3>Sistema operativo Single-tasking</H3>

<P>
<P>Un solo registratore di cassa &egrave; aperto (in uso) e deve servire ogni
cliente, uno alla volta.
<P>
<P>Esempio relativo ai computer: MS DOS
<P>
<P>
<H3>Sistemi operativi Multi-tasking:</H3>

<P>
<P>Un solo registratore di cassa &egrave; aperto, ma adesso viene servita solo una
parte di una spesa per volta, si passa al prossimo cliente e si serve
una parte della sua spesa. I clienti "sembrano" muoversi lungo la coda
insieme, ma se oltre a te non ci sono altri clienti, verrai servito pi&ugrave;
velocemente.
<P>
<P>Esempio relativo ai computer: UNIX, NT utilizzante una singola CPU
<P>
<P>
<H3>Sistemi operativi Multitasking con pi&ugrave; CPU:</H3>

<P>
<P>Adesso apriamo pi&ugrave; registratori di cassa nel negozio. Ogni cliente pu&ograve;
essere servito da un registratore di cassa separato e la coda pu&ograve;
muoversi pi&ugrave; velocemente. Questa viene chiamata SMP - Multi-elaborazione
simmetrica (Symmetric Multi-processing). Sebbene ci siano pi&ugrave;
registratori di cassa aperti, continuerai a non muoverti lungo la coda
pi&ugrave; velocemente del caso in cui ci sei solo tu e un solo registratore di
cassa.
<P>
<P>Esempio relativo ai computer: UNIX e NT con pi&ugrave; CPU
<P>
<P>
<H3>Thread su un sistema operativo multitasking con pi&ugrave; CPU:</H3>

<P>
<P>Se "spezzi" gli articoli della tua spesa, puoi muoverti pi&ugrave; velocemente
sulla coda usando pi&ugrave; registratori di cassa allo stesso tempo.
Innanzitutto, dobbiamo ipotizzare un gran guadagno, perch&eacute; il tempo
investito nello "spezzare la spesa" deve essere riguadagnato usando pi&ugrave;
registratori di cassa. In teoria, dovresti muoverti lungo la coda "n"
volte pi&ugrave; veloce di prima, dove "n" &egrave; il numero di registratori di cassa.
Quando i cassieri hanno bisogno dei totali parziali, possono scambiarsi
velocemente informazioni guardando e parlando a ogni altro registratore
di cassa "locale". Possono anche curiosare ai registratori di cassa
vicini per cercare informazioni di cui hanno bisogno per lavorare pi&ugrave;
velocemente. Comunque, c'&egrave; un limite al numero di registratori di cassa
che possono trovarsi in un punto del negozio.
<P>La legge di Amdal, inoltre, limiter&agrave; la velocit&agrave; dell'applicazione alla
porzione sequenziale del programma pi&ugrave; lenta.
<P>Esempio relativo ai computer: UNIX oppure NT con extra CPU sulla stessa
scheda madre che eseguono programmi multi-threaded.
<P>
<P>
<H3>Invio di messaggi su sistemi operativi multitasking con pi&ugrave; CPU:</H3>

<P>
<P>Al fine di migliorare la performance, il negozio aggiunge 8 registratori
di cassa sul retro del negozio. Poich&eacute; i nuovi registratori di cassa sono
lontani da quelli che si trovano sul davanti, i cassieri devono chiamare
questi al telefono per comunicare i loro totali parziali. Tale distanza
aggiunge un sovraccarico (di tempo) alla comunicazione tra cassieri, ma
se le comunicazioni sono minimizzate, ci&ograve; non costituisce un problema. Se
fai una spesa davvero molto grande, tale da richiedere tutti i
registratori di cassa, allora, come avveniva prima, la velocit&agrave; pu&ograve; essere
aumentata usando tutti i registratori di cassa allo stesso tempo, e il
sovraccarico va riconsiderato. In qualche caso, il negozio pu&ograve; avere
singoli registratori di cassa (o gruppi isolati di registratori di
cassa) sparsi per il negozio: ogni registratore di cassa (o isola) deve
comunicare via telefono. Poich&eacute; tutti i cassieri possono comunicare l'un
l'altro attraverso il telefono, non &egrave; molto importante dove si trovano.
<P>Esempio relativo ai computer: una o pi&ugrave; copie di UNIX o NT con pi&ugrave; CPU
sulla stessa o su differenti schede madri, che comunicano attraverso
messaggi.
<P>Gli scenari descritti sopra, sebbene non esatti, sono una buona
rappresentazione dei vincoli posti sui sistemi paralleli. A differenza
di sistemi con singola CPU (o registratore di cassa), qui va presa in
considerazione la possibilit&agrave; di comunicazione tra diverse CPU.
<P>
<H2><A NAME="ss4.3">4.3 Architetture per la computazione parallela</A>
</H2>

<P>
<P>Di seguito vengono presentati i metodi e le architetture comuni della
computazione parallela. Sebbene la presente trattazione non sia
sicuramente esauriente, &egrave; sufficiente per comprendere le questioni
fondamentali relative a un progetto Beowulf.
<P>
<H3>Architetture Hardware</H3>

<P>
<P>Ci sono fondamentalmente due modi in cui viene messo insieme l'hardware
dei computer paralleli:
<P>
<OL>
<LI> Macchine con memoria locale che comunicano mediante messaggi
(clusters Beowulf)
</LI>
<LI> Macchine con memoria condivisa che comunicano attraverso la
memoria (macchine SMP)
</LI>
</OL>
<P>Un tipico Beowulf &egrave; un insieme di macchine con singola CPU, connesse
usando fast Ethernet ed &egrave;, pertanto, una macchina a memoria locale. Una
macchina SMP a 4 vie &egrave; una macchina a memoria condivisa e pu&ograve; essere usata per
fare computazioni parallele - applicazioni parallele che comunicano
usando la memoria condivisa. Proprio come nell'esempio dell'analogia
negozio-computer, le macchine a memoria locale (registratori di cassa
individuali) possono essere scalati a grandi numeri di CPU, mentre il
numero di CPU in macchine a memoria condivisa (il numero di registratori
di cassa che si possono mettere in un punto) pu&ograve; essere limitato a causa
di conflitti nell'accesso alla memoria.
<P>&Egrave; possibile, comunque, connettere molte macchine a memoria condivisa per
creare una macchina a memoria condivisa "ibrida". Queste macchine ibride
"appaiono" all'utente come una grande macchina SMP singola e sono spesso
chiamate macchine NUMA (accesso in memoria non uniforme), perch&eacute; la
memoria globale vista dal programmatore e condivisa da tutte le CPU pu&ograve;
avere differenti ritardi. A qualche livello, comunque, una macchina NUMA
deve "inviare messaggi" tra gruppi di memorie localmente condivise.
<P>&Egrave; anche possibile connettere macchine SMP come nodi di computazione a
memoria locale. Le tipiche schede madri della CLASSE I hanno 2 o 4 CPU e
sono usate spesso come un mezzo per ridurre il costo del sistema
complessivo. Lo schedulatore interno di Linux determina come queste CPU
ottengono le risorse condivise. L'utente non pu&ograve; (a questo punto)
assegnare uno specifico task a uno specifico processore SMP. L'utente
pu&ograve;, comunque, iniziare due processi indipendenti oppure un processo
multithreaded e aspettarsi un aumento di performance rispetto a un
sistema avente una singola CPU.
<P>
<H3>Architetture API software</H3>

<P>
<P>Ci sono fondamentalmente due modi per "esprimere" la concorrenza in un
programma:
<P>
<OL>
<LI> Usare l'invio di messaggi tra processori
</LI>
<LI> Usare i thread del sistema operativo
</LI>
</OL>
<P>
<P>Esistono altri metodi, ma questi due sono quelli pi&ugrave; largamente usati. &Egrave;
importante ricordare che l'espressione della concorrenza non &egrave;
necessariamente controllata dall'hardware sottostante. Sia lo scambio di
messaggi che i thread possono essere implementati su SMP, NUMA-SMP e
cluster - sebbene, come spiegato sotto, l'efficienza e la portabilit&agrave;
sono questioni importanti.
<P>
<P>
<P>
<H3>Messaggi</H3>

<P>
<P>Storicamente, la tecnologia dello scambio di messaggi rifletteva il
modello dei primi computer paralleli a memoria locale. I messaggi
richiedono un'operazione di copia dei dati, mentre i thread,
corrispondentemente, usano dati. I ritardi e le velocit&agrave; alle quali i
messaggi possono essere copiati sono i fattori limitanti dei modelli a
scambio di messaggi. Un messaggio &egrave; piuttosto semplice: qualche dato e un
processore destinatario. Le API comuni per lo scambio di messaggi sono
<A HREF="http://www.epm.ornl.gov/pvm">PVM</A> oppure 
<A HREF="http://www.mcs.anl.gov/Projects/mpi/index.html">MPI</A>. Lo
scambio di messaggi pu&ograve; essere implementato efficientemente usando i
thread, quindi i messaggi funzionano bene sia su macchine SMP che tra
cluster di macchine. Il vantaggio nell'uso dei messaggi su una macchina
SMP, invece del normale uso dei thread, &egrave; che se decidi in futuro di
usare cluster, &egrave; facile aggiungere macchine o scalare le tue
applicazioni.
<P>
<P>
<H3>Thread</H3>

<P>
<P>I thread del sistema operativo sono stati sviluppati poich&eacute; i progetti di
SMP (multi-elaborazione simmetrica) a memoria condivisa consentivano una
comunicazione e sincronizzazione molto veloci, tra parti concorrenti di
un programma. I thread funzionano bene su sistemi SMP perch&eacute; la
comunicazione avviene attraverso la memoria condivisa. Per questa
ragione l'utente deve isolare i dati locali da quelli globali,
altrimenti i programmi non gireranno nel modo corretto. A differenza dei
messaggi, con i thread una buona parte di copiatura pu&ograve; essere evitata,
perch&eacute; i dati sono condivisi dai processi (thread). Linux supporta i
thread POSIX. Il problema con i thread &egrave; che &egrave; difficile estenderli oltre
una macchina SMP e poich&eacute; i dati sono condivisi dalle CPU, le questioni
relative alla coerenza delle cache pu&ograve; contribuire al sovraccarico.
Estendere i thread oltre i limiti della SMP in modo efficiente richiede
la tecnologia NUMA che &egrave; costosa e non supportata da Linux in forma
nativa. I thread sono stati implementati sopra i messaggi (
<A HREF="http://syntron.com/ptools/ptools_pg.htm">(http://syntron.com/ptools/ptools_pg.htm)</A>), ma i thread
implementati usando i messaggi sono spesso inefficienti.
<P>
<P>
<P>Riguardo alla performance si pu&ograve; affermare quanto segue:
<P>
<PRE>
          
               performance di       performance di un         scalabilit&agrave; 
               una macchina SMP     cluster di macchine
               ----------------     -------------------       -----------
messaggi       buona                ottima                    ottima

thread         ottima               scarsa*                   scarsa*

* richiede una tecnologia NUMA costosa.
</PRE>
<P>
<H3>Architettura dell'applicazione</H3>

<P>
<P>Per poter eseguire un'applicazione in parallelo su pi&ugrave; CPU, occorre
suddividerla in parti concorrenti. Un'applicazione progettata per una
singola CPU, non verr&agrave; eseguita pi&ugrave; velocemente di un'applicazione per
singola CPU su una macchina multiprocessore. 
<P>Ci sono alcuni strumenti e compilatori che possono suddividere i
programmi, ma parallelizzare il codice, non &egrave; un'operazione
"plug'n'play". A seconda del tipo di applicazione, parallelizzare il
codice pu&ograve; essere facile, estremamente difficile o addirittura
impossibile, in base alle dipendenze dell'algoritmo.
<P>
<P>
<P>Prima di affrontare la questione del software, occorre introdurre il
concetto di Fattibilit&agrave;.
<P>
<H2><A NAME="Fattibilit&agrave;"></A> <A NAME="ss4.4">4.4 Fattibilit&agrave;</A>
</H2>

<P>
<P>Molte domande relative all'elaborazione parallela, hanno la stessa risposta:
<P>
<P>
<P>"Dipende dall'applicazione"
<P>
<P>
<P>Prima di addentrarsi nel problema, c'&egrave; un'importante distinzione da
fare - la differenza tra CONCORRENTE e PARALLELO.  Per il gusto della
discussione definiremo cos&igrave; questi due concetti:
<P>
<P>
<P>CONCORRENTI: parti di un programma che possono essere eseguite
indipendentemente.
<P>
<P>
<P>PARALLELE:  parti CONCORRENTI di un programma eseguite da processori
diversi nello stesso momento.
<P>
<P>
<P>La distinzione &egrave; molto importante, poich&eacute; la CONCORRENZA &egrave; una propriet&agrave; del
programma, mentre il PARALLELISMO &egrave; una propriet&agrave; della macchina. 
Idealmente un'esecuzione parallela dovrebbe risultare in prestazioni pi&ugrave;
veloci. Il fattore limitante nelle prestazioni parallele &egrave; la velocit&agrave; di
comunicazione e la latenza fra i nodi (la latenza esiste anche con
applicazioni i cui thread sono eseguiti su CPU diverse, a causa della
necessit&agrave; di controllare la coerenza della cache - cache coherency).
Molti dei comuni benchmark paralleli sono altamente paralleli, quindi
latenza e comunicazione non costituiscono colli di bottiglia. Questo
tipo di problema pu&ograve; essere chiamato "ovviamente parallelo". Altre
applicazioni non sono cos&igrave; semplici ed eseguire parti CONCORRENTI del
programma in PARALLELO potrebbe causare un rallentamento del programma,
vanificando cos&igrave; ogni miglioramento di prestazioni ottenuto nelle parti
CONCORRENTI del programma. In altre parole, il tempo di comunicazione
impiegato deve essere proporzionato con quello impiegato
nell'elaborazione, altrimenti l'esecuzione PARALLELA di parti
CONCORRENTI &egrave; inefficiente.
<P>
<P>
<P>&Egrave; compito del programmatore determinare quali parti CONCORRENTI del
programma devono essere eseguite in PARALLELO e quali NO. La risposta a
ci&ograve; determiner&agrave; l'EFFICIENZA dell'applicazione. Il grafico che segue,
riassume la situazione per il programmatore:
<P>
<P>
<PRE>




         | *
         | *
         | *
 % di    | *
 appli-  |  *
 cazione |  *
         |  *
         |  *
         |    *
         |     *
         |      *
         |        ****
         |            ****
         |                ********************
         +-----------------------------------
          tempo di comunicazione/tempo di elaborazione
</PRE>
<P>
<P>In un perfetto computer parallelo, il rapporto fra comunicazione e
elaborazione sarebbe uguale, e tutto ci&ograve; che fosse CONCORRENTE potrebbe
essere implementato in PARALLELO. Sfortunatamente computer paralleli
reali, incluse macchine con memoria condivisa, sono soggette agli
effetti descritti nel grafico. Chi progetta un Beowulf, tenga in mente
questo grafico, perch&eacute; l'efficienza dell'elaborazione parallela dipende
dal rapporto fra tempo di comunicazione e tempo di elaborazione per UNO
SPECIFICO COMPUTER PARALLELO. Le applicazioni possono essere portabili
fra computer paralleli, ma non c'&egrave; garanzia che saranno efficienti su una
piattaforma differente.
<P>
<P>
<P>IN GENERALE, NON ESISTE UN PROGRAMMA PARALLELO PORTABILE ED EFFICIENTE.
<P>
<P>
<P>C'&egrave; ancora un'altra conseguenza del grafico di cui sopra. Poich&eacute;
l'efficienza dipende dal rapporto comunic./elab., cambiare un solo
componente del rapporto non significa, necessariamente, che
un'applicazione sar&agrave; pi&ugrave; veloce. Un processore pi&ugrave; veloce, mantenendo la
stessa velocit&agrave; di comunicazione, potrebbe non avere effetti visibili sul
programma. Per esempio, raddoppiando o triplicando la velocit&agrave; della CPU,
mantenendo la stessa velocit&agrave; di comunicazione, potrebbe far s&igrave; che alcune
porzioni che prima erano eseguite in PARALLELO, adesso siano pi&ugrave;
efficienti se eseguite SEQUENZIALMENTE. Quindi, adesso potrebbe essere
pi&ugrave; veloce eseguire le parti che prima erano PARALLELE, come
SEQUENZIALI.  Inoltre, una inefficiente esecuzione di porzioni
parallele, impedir&agrave; all'applicazione di raggiungere la sua massima
velocit&agrave;. Quindi l'aggiunta di un processore pi&ugrave; veloce potrebbe
rallentare l'applicazione (impedendo alla nuova CPU di raggiungere la
sua massima velocit&agrave;, per quell'applicazione).
<P>
<P>
<P>SOSTITUIRE LA CPU CON UNA PI&Ugrave; VELOCE, POTREBBE RALLENTARE L'APPLICAZIONE.
<P>
<P>
<P>In conclusione, quindi, per sapere se usare o no un'architettura
parallela, occorre avere un po' di intuito circa l'adeguatezza di una
particolare macchina per un'applicazione.  Occorre tener presente
svariati fattori, incluso la velocit&agrave; della CPU, il compilatore, le
"message passing API", la rete, ecc. Inoltre occorre tener presente che
l'aver tracciato lo schema di un'applicazione non &egrave; tutto. 
<P>&Egrave; possibile identificare una porzione del programma in cui &egrave; richiesta una
pesante elaborazione, ma non &egrave; possibile conoscerne il costo in termini
di comunicazione. Potrebbe essere che, per un certo sistema, i costi di
comunicazione rendano inefficiente l'esecuzione in parallelo del codice.
<P>
<P>
<P>Una nota finale su un malinteso comune. Spesso viene detto che un
programma &egrave; PARALLELIZZATO, ma in realt&agrave; solo le parti CONCORRENTI lo
sono. Per tutte le ragioni dette sopra, il programma non &egrave;
PARALLELIZZATO. Un'efficiente PARALLELIZZAZIONE &egrave; una propriet&agrave; della
macchina.
<P>
<P>
<H2><A NAME="ss4.5">4.5 Scrittura e porting di software parallelo</A>
</H2>

<P>
<P>Una volta stabilita la necessit&agrave; della computazione parallela e quindi di
costruire un Beowulf, potrebbe essere una buona idea ripensare
all'applicazione in base a quanto detto precedentemente.
<P>
<P>
<P>In generale ci sono due cose che possono essere fatte:
<OL>
<LI>Andare avanti e costruire un Beowulf di classe I e quindi adattare
ad esso l'applicazione. O eseguire applicazioni parallele che sappiamo
funzioneranno su tale Beowulf (ma attenzione alla portabilit&agrave; e
all'efficienza di cui sopra).
</LI>
<LI>Studiare le applicazioni che verranno eseguite sul Beowulf e fare
alcune stime sul tipo di hardware e software di cui c'&egrave; bisogno.
</LI>
</OL>
<P>In altri casi, in qualche momento, occorrer&agrave; prendere in considerazione
i fattori relativi all'efficienza.
<P>In generale possono essere fatte tre cose:
<OL>
<LI>Determinare le parti concorrenti di un programma</LI>
<LI>Stimare efficientemente le porzioni parallele</LI>
<LI>Descrivere le parti concorrenti</LI>
</OL>
<P>Esaminiamole una per una
<P>
<H3>Determinare le parti concorrenti di un programma</H3>

<P>
<P>Questo passo &egrave; spesso considerato come "parallelizzazione del programma".
Le decisioni sulle parallelizzazioni, verranno prese nel passo 2. In
questo passo occorre determinare le data dependencies.
<P>
<P>
<P>Da un punto di vista pratico, le applicazioni possono esporre due tipi
di concorrenza: pesanti elaborazioni (macina numeri, "number crunching")
e I/O (database). Sebbene in molti casi la concorrenza di elaborazione e
I/O sono ortogonali, ci sono applicazioni che li richiedono entrambi.
Esistono alcuni strumenti che possono effettuare una analisi di
concorrenza sulle applicazioni esistenti.  La maggior parte di questi
strumenti sono progettati per il FORTRAN. Due sono le ragioni per cui
viene utilizzato il FORTRAN: storicamente la maggior parte di
applicazioni che effettuano numerosi calcoli sono state scritte in
FORTRAN ed &egrave; pi&ugrave; facile da analizzare. Se non ci sono strumenti
disponibili, questo passo pu&ograve; essere complicato, per le applicazioni
esistenti.
<P>
<P>
<P>
<H3>Stima dell'efficienza parallela</H3>

<P>
<P>Senza l'aiuto di strumenti, questo passo pu&ograve; richiedere prove ed errori,
o solo provare formulare delle ipotesi. Per ogni specifica applicazione
occorre provare a determinare se ha dei limiti di CPU (legati
all'elaborazione) o di hard disk (legati all'I/O). Le esigenze di
Beowulf possono differire in base alle necessit&agrave;. Per esempio un problema
legato all'elaborazione pu&ograve; aver bisogno di poche CPU molto veloci e una
rete molto veloce, mentre un problema legato all'I/O pu&ograve; funzionare
meglio con pi&ugrave; CPU pi&ugrave; lente e una fast Ethernet.
<P>
<P>
<P>Questa raccomandazione, in genere, &egrave; una sorpresa per molte persone,
perch&eacute; &egrave; un luogo comune che i processori pi&ugrave; veloci sono sempre meglio.
Questo &egrave; vero se si dispone di un budget illimitato, i sistemi reali
possono avere vincoli di costo che occorre valutare. Per i problemi
legati all'I/O, c'&egrave; una regola poco conosciuta (chiamata Legge
Eadline-Dedkov) che &egrave; abbastanza utile:
<P>
<P>
<P>Poich&eacute; due computer paralleli con lo stesso indice di prestazioni per
la somma delle CPU, 
quello che ha i processori pi&ugrave; lenti (e probabilmente una corrispondente
rete di comunicazione pi&ugrave; lenta fra i processori) avr&agrave; prestazioni
migliori per quelle applicazioni che fanno largo uso di I/O.
<P>
<P>
<P>Mentre la profondit&agrave; di questa regola va oltre lo scopo di questo
documento, potrebbe essere interessante scaricare il documento
<I>Performance Considerations for I/O-Dominant Applications on Parallel
Computers</I> (Postscript format 109K) 
<A HREF="ftp://www.plogic.com/pub/papers/exs-pap6.ps">(ftp://www.plogic.com/pub/papers/exs-pap6.ps)</A><P>
<P>
<P>Una volta determinato il tipo di concorrenza dell'applicazione, occorre
stimare quanto possa essere efficiente in parallelo. Vedere la sezione
<A HREF="Beowulf-HOWTO-5.html#software">Software</A> per una descrizione degli strumenti
Software.
<P>
<P>
<P>In assenza di strumenti, occorre provare ad ipotizzare la propria
strada, in questa fase. Se un'elaborazione che richiede molta cpu pu&ograve;
essere misurata in minuti e i dati possono essere trasferiti in
secondi, allora potrebbe essere una buona candidata per la
parallelizzazione. Occorre ricordare, per&ograve;, che se un loop di 16 minuti
viene suddiviso in 32 parti, il trasferimento dei dati richiede diversi
secondi per parte, allora le cose potranno essere difficili. Si
raggiunger&agrave; un punto in cui i ritorni sono ridotti.
<P>
<P>
<H3>Descrizione delle parti concorrenti di un programma</H3>

<P>Ci sono diversi modi per descrivere le parti concorrenti di un programma:
<P>
<OL>
<LI> Esecuzione parallela esplicita</LI>
<LI> Esecuzione parallela implicita</LI>
</OL>
<P>La maggiore differenza fra le due &egrave; che l'esplicita &egrave; determinata
dall'utente, mentre l'implicita &egrave; determinata dal compilatore.
<P>
<A HREF="http://www.epm.ornl.gov/pvm">PVM</A> o 
<A HREF="http://www.mcs.anl.gov/Projects/mpi/index.html">MPI</A> o
aggiungere thread usando i thread POSIX (occorre ricordare, per&ograve;, che i
thread non si possono muovere fra piastre madri SMP).
<H3></H3>

<P>
<P>I metodi espliciti sono i pi&ugrave; difficili da implementare e da mettere
sotto debug. Gli utenti, in genere, includono chiamate a funzioni
esplicite in sorgenti standard FORTRAN 77 o C/C++. Alla libreria MPI
sono state aggiunte alcune funzioni per rendere pi&ugrave; facili da
implementare alcuni metodi paralleli standard (ad es. le funzioni
scatter/gather). Inoltre &egrave; possibile usare librerie standard scritte 
per computer paralleli. Occorre considerare sempre, per&ograve; il rapporto
fra portabilit&agrave; ed efficienza).
<P>
<P>
<P>Per ragioni storiche, la maggior parte dei sorgenti di programmi che
effettuano pesanti calcoli ("number crunching") sono scritti in FORTRAN. 
Per questo motivo, il FORTRAN ha il supporto maggiore (strumenti,
librerie, ecc.) per l'elaborazione parallela. Molti programmatori,
adesso, utilizzano il C o riscrivono in C vecchie applicazioni scritte
in FORTRAN con l'idea che il C permetter&agrave; un'esecuzione pi&ugrave; veloce.
Questo &egrave; vero, dal momento che il C &egrave; quanto di pi&ugrave; vicino ad un
linguaggio macchina universale, ma ha anche alcuni svantaggi. 
L'utilizzo di puntatori, in C, rende estremamente difficile determinare
le dipendenze fra i dati. Se avete un programma FORTRAN e pensate di
parallelizzarlo, NON CONVERTITELO IN C!
<P>
<P>
<H3>Metodi Impliciti</H3>

<P>
<P>Sono quelli in cui l'utente lascia alcune (o tutte) decisioni di
parallelizzazione al compilatore. Esempi sono FORTRAN 90, High
Performance FORTRAN (HPF), Bulk Synchronous Parallel (BSP) e un'intera
collezione di altri metodi che sono sotto sviluppo.
<P>
<P>
<P>I metodi impliciti richiedono che l'utente fornisca alcune informazioni
circa la natura concorrente dell'applicazione, ma il compilatore, poi,
prender&agrave; la decisione di come eseguire, questa concorrenza, in parallelo.
Questi metodi forniscono alcuni livelli di portabilit&agrave; ed efficienza, ma
non c'&egrave; ancora alcun "modo perfetto" per descrivere un problema
concorrente per un'elaborazione parallela.
<P>
<HR>
<A HREF="Beowulf-HOWTO-5.html">Avanti</A>
<A HREF="Beowulf-HOWTO-3.html">Indietro</A>
<A HREF="Beowulf-HOWTO.html#toc4">Indice</A>
</BODY>
</HTML>