10.07.2015 Views

Scarica il pdf con la mia tesi - Parallel Programming Laboratory

Scarica il pdf con la mia tesi - Parallel Programming Laboratory

Scarica il pdf con la mia tesi - Parallel Programming Laboratory

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

UNIVERSITÀ DI PADOVAFACOLTÀ DI INGEGNERIACORSO DI LAUREA IN INGEGNERIA INFORMATICADIPARTIMENTO DI ELETTRONICA ED INFORMATICATESI DI LAUREA<strong>Parallel</strong>izzazione dicodice Tree-SPHRe<strong>la</strong>tore: Ch.mo Prof. Gianfranco B<strong>il</strong>ardiCorre<strong>la</strong>tori: Ch.mi Proff. Lauro Moscardini e Giuseppe TormenLaureando: F<strong>il</strong>ippo GioachinPadova, 1 Luglio 2002 Anno Accademico 2001-02


Ai miei genitori,nel<strong>la</strong> speranza di dare loromolte altre soddisfazioni.


IndiceSommariovii1 Introduzione 12 Gli algoritmi ut<strong>il</strong>izzati 32.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 Codici Tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2.1 Algoritmo di Barnes-Hut . . . . . . . . . . . . . . . . . . . . 42.2.2 Apertura dell’albero . . . . . . . . . . . . . . . . . . . . . . 42.2.3 Aggiornamento dell’albero . . . . . . . . . . . . . . . . . . . 62.3 Codici SPH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3.1 Calcolo di densità . . . . . . . . . . . . . . . . . . . . . . . . 82.3.2 Calcolo di pressione e forza . . . . . . . . . . . . . . . . . . 82.4 Integrazione temporale . . . . . . . . . . . . . . . . . . . . . . . . . 103 Strategie di parallelizzazione 133.1 La decomposizione . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.1.1 Distribuzione random . . . . . . . . . . . . . . . . . . . . . . 143.1.2 Distribuzione spaziale . . . . . . . . . . . . . . . . . . . . . 153.2 Le comunicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.2.1 Ricezione dei dati per eseguire <strong>il</strong> calcolo localmente . . . . . 173.2.2 Esportazione dei dati ed esecuzione del calcolo in remoto . . . 183.3 Lo sb<strong>il</strong>anciamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.3.1 Il caricamento iniziale . . . . . . . . . . . . . . . . . . . . . 223.3.2 Mantenimento dati . . . . . . . . . . . . . . . . . . . . . . . 243.3.3 La ridefinizione dei domini . . . . . . . . . . . . . . . . . . . 254 Modifiche al codice 274.1 Implementazione in MPI . . . . . . . . . . . . . . . . . . . . . . . . 274.2 Buffer di comunicazione . . . . . . . . . . . . . . . . . . . . . . . . 274.3 Spostamento di particelle . . . . . . . . . . . . . . . . . . . . . . . . 294.4 Ricerca dei vicini e domini interni . . . . . . . . . . . . . . . . . . . 304.5 Metodi di scrittura dei f<strong>il</strong>e . . . . . . . . . . . . . . . . . . . . . . . . 334.5.1 F<strong>il</strong>e di restart . . . . . . . . . . . . . . . . . . . . . . . . . . 33


4.5.2 Snapshot . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354.6 Modifiche al<strong>la</strong> struttura modu<strong>la</strong>re . . . . . . . . . . . . . . . . . . . . 374.7 Modifiche al f<strong>il</strong>e dei parametri . . . . . . . . . . . . . . . . . . . . . 395 Prestazioni 416 Conclusioni 47A Glossario 49B Ut<strong>il</strong>izzo del codice 53


Elenco delle figure2.1 Esempio di albero oct-tree per l’algoritmo di Barnes-Hut . . . . . . . 52.2 Rappresentazione del criterio geometrico di apertura dell’albero . . . 62.3 Andamento del<strong>la</strong> spline re<strong>la</strong>tiva all’equazione 2.9 . . . . . . . . . . . 93.1 Distribuzione random di particelle . . . . . . . . . . . . . . . . . . . 153.2 Distribuzione di particelle mediante domini . . . . . . . . . . . . . . 163.3 Rappresentazione del processo di importazione dei dati residenti suglialtri processori per effettuare <strong>il</strong> calcolo in locale. . . . . . . . . . . . . 173.4 Rappresentazione del processo di esportazione dei dati per <strong>il</strong> calcoloin remoto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.5 Riposizionamento del taglio principale all’interno del<strong>la</strong> distribuzionedi particelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.6 Protocollo di scambio delle particelle tra i due blocchi di processoricomponenti <strong>il</strong> taglio . . . . . . . . . . . . . . . . . . . . . . . . . . . 223.7 Schema di come avviene <strong>il</strong> caricamento iniziale dei dati per l’avvio diuna nuova simu<strong>la</strong>zione. . . . . . . . . . . . . . . . . . . . . . . . . . 234.1 Schema di come vengono ut<strong>il</strong>izzati i buffer per <strong>il</strong> calcolo delle forze inremoto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284.2 Rappresentazione di come avviene lo spostamento delle particelle trale due parti di un taglio quando si necessità di un rib<strong>il</strong>anciamento. . . 294.3 Illustrazione di come avviene <strong>la</strong> definizione di dominio interno. . . . . 314.4 Metodo di ricerca binaria del raggio di smussamento delle particelle dimateria barionica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324.5 Procedura di salvataggio di un f<strong>il</strong>e di restart . . . . . . . . . . . . . . 344.6 Procedura di salvataggio di uno snapshot . . . . . . . . . . . . . . . . 364.7 Schema delle inclusioni dei moduli . . . . . . . . . . . . . . . . . . . 385.1 Immagine a redshift zero di una simu<strong>la</strong>zione <strong>con</strong> due ammassi di ga<strong>la</strong>ssiead alta risoluzione <strong>con</strong> so<strong>la</strong> materia oscura . . . . . . . . . . . 45


SommarioLa ricerca scientifica ut<strong>il</strong>izza sempre di più le simu<strong>la</strong>zioni al calco<strong>la</strong>tore per <strong>con</strong>validarele teorie e necessita sempre di maggiore potenza di calcolo per eseguire simu<strong>la</strong>zionisempre più e<strong>la</strong>borate.In questo <strong>la</strong>voro di <strong>tesi</strong> verrà presentato <strong>il</strong> progetto di parallelizzazione di un programmaTree-SPH per simu<strong>la</strong>re l’evoluzione temporale di un sistema fisico, programmaut<strong>il</strong>izzato dal Dipartimento di Astrono<strong>mia</strong> dell’Università di Padova per studiarei vari problemi aperti del<strong>la</strong> cosmologia. Lo scopo di questo progetto è di ridurre itempi di calcolo mediante l’impiego di multiprocessori e quindi di permettere <strong>il</strong> miglioramentodelle simu<strong>la</strong>zioni. Verranno descritti gli algoritmi ut<strong>il</strong>izzati e le strategieimpiegate durante <strong>il</strong> processo di parallelizzazione nonché le scelte implementative. In<strong>con</strong>clusione verranno indicati i limiti di tale sv<strong>il</strong>uppo e le prospettive future.


Capitolo 1IntroduzioneLa cosmologia è <strong>la</strong> parte dell’astrofisica che si interessa a diversi problemi re<strong>la</strong>tiviall’universo, come ad esempio <strong>la</strong> sua formazione ed evoluzione temporale nonché del<strong>la</strong>formazione delle sue strutture interne, come ga<strong>la</strong>ssie o ammassi di ga<strong>la</strong>ssie. Per questoè necessario ut<strong>il</strong>izzare delle simu<strong>la</strong>zioni temporali per far evolvere dei sistemi fisici da<strong>con</strong>dizioni iniziali note e verificare <strong>la</strong> correttezza delle teorie attuali.È necessaria una breve descrizione di come <strong>la</strong> teoria attuale ipotizzi <strong>la</strong> formazioneed evoluzione dell’universo. Il modello del Big Bang prevede che all’inizio ci siaappunto un grande scoppio dal quale, partendo da un punto estremamente caldo edenso, si origina l’espansione dell’universo. Successivamente nel fluido, fino a quelmomento omogeneo, iniziano a formarsi delle piccole fluttuazioni di densità causandodelle variazioni che, sotto le forze gravitazionali del fluido stesso, hanno dato originealle strutture visib<strong>il</strong>i ai giorni nostri come stelle, ga<strong>la</strong>ssie e ammassi di ga<strong>la</strong>ssie. Le<strong>con</strong>dizioni iniziali note sono quindi una descrizione del fluido allo stato primordiale<strong>con</strong>tenente queste piccole fluttuazioni.Queste simu<strong>la</strong>zioni richiedono un enorme quantitativo di calcoli e, anche su macchinemolto veloci, necessitano di giornate di computazioni per arrivare al risultato.L’accuratezza di tali risultati, inoltre, dipende fortemente da almeno due fattori: <strong>il</strong> primoè <strong>il</strong> numero di particelle o corpi che compongono <strong>la</strong> simu<strong>la</strong>zione, in quanto un loroaumento permette una migliore definizione del sistema, <strong>il</strong> se<strong>con</strong>do è <strong>la</strong> fisica al<strong>la</strong> basedelle e<strong>la</strong>borazioni in quanto più dettagli fisici e più <strong>con</strong>tributi di forze sono <strong>con</strong>sideratie meglio è.Questi due fattori sono però <strong>con</strong>trastati dal tempo di calcolo in quanto sia per aumentare<strong>il</strong> numero di particelle sia per aumentare <strong>la</strong> fisica <strong>con</strong>siderata si necessitanodi maggiori computazioni e quindi maggior tempo di attesa per avere i risultati, tempoche può raggiungere un mese anche per simu<strong>la</strong>zioni non eccessivamente grandi.Per tale motivo poter ut<strong>il</strong>izzare più di un processore per distribuire <strong>il</strong> <strong>la</strong>voro tradi essi permette di ridurre drasticamente i tempi e di avere quindi <strong>la</strong> possib<strong>il</strong>ità diincrementare <strong>la</strong> precisione delle simu<strong>la</strong>zioni stesse.A tale scopo nasce questo <strong>la</strong>voro: permettere <strong>la</strong> scrittura di un codice parallelo pereffettuare queste simu<strong>la</strong>zioni. La base di partenza è un codice sequenziale già esistentescritto in Fortran 90 sv<strong>il</strong>uppato da un <strong>la</strong>ureando dell’Università di Venezia a cui si


2 Introduzione Cap. 1fa riferimento per ulteriori approfondimenti sugli aspetti maggiormente re<strong>la</strong>tivi alleimplementazioni seriali (vedi [Favaretto, 6]).Nel capitolo 2 si introdurranno quindi gli algoritmi già implementati nel codicesequenziale per i calcoli delle forze e l’avanzamento delle particelle. Si passa neicapitoli successivi ad analizzare ciò che è stato fatto per generare <strong>il</strong> codice paralleloed in partico<strong>la</strong>re nel capitolo 3 si analizzano le scelte effettuate per quanto riguarda lestrategie di parallelizzazione mentre nel capitolo 4 si <strong>il</strong>lustrano più in dettaglio qualisono state le modifiche effettuate sul codice durante l’implementazione. Segue unabreve analisi sul<strong>la</strong> sca<strong>la</strong>b<strong>il</strong>ità e le <strong>con</strong>clusioni. In appendice un glossario dei terminiastronomici e informatici ut<strong>il</strong>izzati.


Capitolo 2Gli algoritmi ut<strong>il</strong>izzati2.1 IntroduzionePer <strong>la</strong> risoluzione dei problemi legati al<strong>la</strong> cosmologia si ut<strong>il</strong>izzano codici che effettuanosimu<strong>la</strong>zioni temporali. Innanzitutto in queste simu<strong>la</strong>zioni sono presenti due tipidi particelle: le particelle barioniche e quelle di materia oscura.Le prime rappresentano <strong>la</strong> materia visib<strong>il</strong>e ed è formata principalmente da gas(idrogeno ed elio) <strong>con</strong> alcune tracce di altri materiali pesanti quali ferro etc. Le se<strong>con</strong>deinvece rappresentano materia a noi non visib<strong>il</strong>e perché non emette alcuna radiazioneche <strong>la</strong> renda osservab<strong>il</strong>e e <strong>la</strong> cui presenza ci è r<strong>il</strong>evata in modo indiretto per spiegare<strong>il</strong> moto delle stelle all’interno delle ga<strong>la</strong>ssie per effetto del<strong>la</strong> forza gravitazionale. Sipensa che nell’universo <strong>la</strong> maggior parte di materia, circa <strong>il</strong> 90%, sia di questo se<strong>con</strong>dotipo.In queste simu<strong>la</strong>zioni rientrano due tipi di forze cui sono soggette le particellein esame. La più importante è <strong>la</strong> forza gravitazionale, cui sono sottoposte tutte leparticelle presenti indipendentemente dal loro tipo e spiegata nel<strong>la</strong> Sez. 2.2 a pag. 3.Un’altra forza molto importante è quel<strong>la</strong> idrodinamica causata dall’interazione tra leparticelle all’interno di un fluido; questo se<strong>con</strong>do tipo di forze coinvolge so<strong>la</strong>mente leparticelle di materia barionica ed è spiegata nel<strong>la</strong> Sez. 2.3 a pag. 6.In questo capitolo vengono <strong>con</strong>siderate infine le tecniche ut<strong>il</strong>izzate per l’integrazionetemporale nel<strong>la</strong> Sez. 2.4 a pag. 10.2.2 Codici TreePer le simu<strong>la</strong>zioni di tipo cosmologico le principali interazioni tra i corpi sono ditipo gravitazionale. Si ricorda che <strong>la</strong> forza interagente tra due corpi o particelle è datadal<strong>la</strong> seguente formu<strong>la</strong> vettoriale:F 1 = G m 1 · m 2|r 12 | 3 r 12 (2.1)


4 Gli algoritmi ut<strong>il</strong>izzati Cap. 2dove G è <strong>la</strong> costante di gravitazione universale G = 6.672 −8 cm 3 g·s 2 , m 1 e m 2 sonole masse dei due corpi, r 12 è <strong>il</strong> vettore che <strong>con</strong>giunge <strong>la</strong> particel<strong>la</strong> 1 <strong>con</strong> <strong>la</strong> particel<strong>la</strong> 2e F 1 è <strong>la</strong> forza agente sul<strong>la</strong> particel<strong>la</strong> 1.Un in<strong>con</strong>veniente di tale forza che non ne permette l’ut<strong>il</strong>izzo pratico in una simu<strong>la</strong>zionereale è che ogni particel<strong>la</strong> interagisce <strong>con</strong> tutte le altre dando origine a O(N 2 )interazioni, una complessità troppo elevata: quando <strong>il</strong> numero di particelle arriva aqualche m<strong>il</strong>ione le interazioni richieste sono dell’ordine di 10 12 !2.2.1 Algoritmo di Barnes-HutA questo punto si necessita di una qualche semplificazione nel<strong>la</strong> quantità di calcolida eseguire a discapito, ovviamente, dell’accuratezza delle forze stesse. Tale semplificazionepuò essere data dall’uso di strutture ad albero che si basano sul seguente<strong>con</strong>cetto:Per <strong>il</strong> calcolo delle forze cui è soggetto un corpo nello spazio possiamoraggruppare un insieme di particelle lontane dal corpo stesso nel lorocentro di massa.che può essere espresso matematicamente nel seguente modo:F i = G∑j≠im i · m j|r ij | 3 r i j ≈ G m i · M|r i,cm | 3 r i,cm (2.2)dove M è <strong>la</strong> somma delle masse raggruppate insieme e r i,cm è <strong>il</strong> vettore <strong>con</strong>giungente<strong>la</strong> particel<strong>la</strong> in esame <strong>con</strong> <strong>il</strong> centro di massa del raggruppamento.Questo ci permette di creare un albero in cui lo spazio totale viene diviso ricorsivamentein blocchi di particelle vicine, associati ai nodi interni, fino ad arrivare allefoglie in cui c’è una so<strong>la</strong> particel<strong>la</strong>. Associando poi ad ogni nodo un insieme di datisufficienti a descrivere in buona approssimazione <strong>il</strong> gruppo di particelle che esso<strong>con</strong>tiene, possiamo calco<strong>la</strong>re una so<strong>la</strong> interazione tra <strong>il</strong> nodo e una particel<strong>la</strong> lontanaanziché tante interazioni tra tutte le particelle del nodo e <strong>la</strong> particel<strong>la</strong> lontana: questo èl’algoritmo di Barnes-Hut.In Figura 2.1 e ripresa da [Favaretto, 6] si può vedere un esempio del<strong>la</strong> creazionedi un albero ut<strong>il</strong>izzato per l’algoritmo approssimato.In partico<strong>la</strong>re un insieme di dati sufficienti <strong>con</strong>tiene tipicamente <strong>la</strong> massa totaledelle particelle nel nodo, <strong>il</strong> centro di massa <strong>con</strong> re<strong>la</strong>tiva velocità e <strong>il</strong> baricentro, unalista di tutte le particelle <strong>con</strong>tenute e una espansione del quadrupolo.La complessità computazionale del<strong>la</strong> costruzione di un tale albero, qui chiamatooct-tree, si può dimostrare essere O(N lgN) per una distribuzione abbastanza uniformedelle particelle (vedi [Favaretto, 6, pp. 19-20] per maggiori dettagli).2.2.2 Apertura dell’alberoUn problema da gestire in tale algoritmo è <strong>il</strong> seguente: quando si può <strong>con</strong>siderarevalida l’approssimazione data dall’albero e quando invece è necessario espandere <strong>il</strong>nodo?


Sez. 2.2 Codici Tree 5Figura 2.1: Esempio di albero oct-tree per l’algoritmo di Barnes-HutPer rispondere a questa domanda <strong>il</strong> metodo più semplice è di tipo geometrico propostoda Barnes-Hut: un nodo viene aperto quando <strong>il</strong> gruppo di particelle è sufficientementedistante dal<strong>la</strong> particel<strong>la</strong> su cui si vogliono calco<strong>la</strong>re le forze:lr < θ (2.3)dove θ è una costante ben definita, l e r sono rispettivamente <strong>il</strong> <strong>la</strong>to del cubo <strong>con</strong>tenutonel nodo e <strong>la</strong> distanza del<strong>la</strong> particel<strong>la</strong> dal centro di massa come si può vedere in Figura2.2 in una rappresentazione grafica di tale criterio, <strong>la</strong> figura è tratta da [Favaretto, 6].L’in<strong>con</strong>veniente principale di questo tipo di apertura è che quando c’è una distribuzioneabbastanza uniforme alcune particelle hanno forze molto piccole dovute al<strong>la</strong>cancel<strong>la</strong>zione di forze uguali e <strong>con</strong>trarie molto più grandi. Poiché questo metodo cercadi limitare l’errore re<strong>la</strong>tivo, quando si effettuano queste cancel<strong>la</strong>zioni l’errore assolutopuò risultare molto elevato (può superare anche l’entità del<strong>la</strong> forza stessa).Per ovviare a tale in<strong>con</strong>veniente si potrebbe pensare di ridurre <strong>il</strong> valore di θ <strong>il</strong>che porterebbe però ad un notevole incremento del numero di interazioni quando nonnecessario a discapito del tempo di calcolo.Un metodo migliore <strong>con</strong>siste invece nel <strong>con</strong>siderare l’accelerazione del<strong>la</strong> particel<strong>la</strong>a old e aprire l’albero maggiormente quando questa è picco<strong>la</strong> in modo da minimizzarel’errore assoluto. Un tale criterio può essere espresso dal<strong>la</strong> seguente formu<strong>la</strong>:Ml 4 > α|a old |r 6 (2.4)dove M è <strong>la</strong> massa <strong>con</strong>tenuta nel nodo, l e r sono sempre <strong>il</strong> <strong>la</strong>to del cubo e <strong>la</strong> distanzatra particel<strong>la</strong> e centro di massa. α è una costante opportuna.Studi (si veda [Springel, 7] e le sue referenze) hanno dimostrato che questo criterioè più efficiente del precedente. Il primo resta ancora necessario qualora non si abbiaa disposizione una stima per l’accelerazione del<strong>la</strong> particel<strong>la</strong> (come tipicamente accadeal primo passo di simu<strong>la</strong>zione).


6 Gli algoritmi ut<strong>il</strong>izzati Cap. 2Figura 2.2: Rappresentazione del criterio geometrico di apertura dell’albero2.2.3 Aggiornamento dell’alberoAltro problema riguarda <strong>il</strong> garantire che un nodo <strong>con</strong>tenga dei valori coerenti <strong>con</strong>le particelle che <strong>con</strong>tiene. La domanda è allora: quando e <strong>con</strong> che modalità aggiornarei nodi dell’albero?Poiché non è possib<strong>il</strong>e ricalco<strong>la</strong>re un nodo interno ogni volta che una delle sue particelleviene spostata (ne cadrebbe ogni vantaggio computazionale), si può pensare aduna linearizzazione in un intorno dell’istante temporale a cui i dati si riferis<strong>con</strong>o. Per <strong>la</strong>definizione di tale intorno si può prendere come riferimento <strong>la</strong> velocità di spostamentodel centro di massa v cm del nodo se<strong>con</strong>do <strong>la</strong> seguente formu<strong>la</strong>:v cm · dt < βl (2.5)dove l è sempre <strong>il</strong> <strong>la</strong>to del cubo che <strong>il</strong> nodo <strong>con</strong>tiene e β è una opportuna costante. dtrappresenta l’intervallo di tempo tra l’istante cui si riferis<strong>con</strong>o i dati del nodo e l’istantein cui si vogliono stimare.Quando <strong>il</strong> centro di massa si è spostato più del <strong>con</strong>sentito si ricalco<strong>la</strong>no i valoricaratteristici del nodo tramite <strong>la</strong> lista delle particelle <strong>con</strong>tenute nel nodo. Per evitarepoi che le particelle si spostino al di fuori del dominio di competenza del nodo si ricostruisceinteramente l’albero ad intervalli rego<strong>la</strong>ri, tipicamente 0.1N calcoli di forzadove N è <strong>il</strong> numero di particelle (si veda Sez. 2.4 pag. 10).2.3 Codici SPHSPH, ovvero Smoothed Particles Hydrodynamics, è una tecnica <strong>la</strong>grangiana percalco<strong>la</strong>re forze di tipo idrodinamico dovute al<strong>la</strong> pressione cui sono sottoposte le parti-


Sez. 2.3 Codici SPH 7celle di un fluido. A differenza delle forze gravitazionali che sono a lungo raggio, ossiasu una particel<strong>la</strong> interagis<strong>con</strong>o tutte le altre fino alle più lontane, queste se<strong>con</strong>de sonoa corto raggio ossia decadono a breve distanza e su una particel<strong>la</strong> influis<strong>con</strong>o solo leparticelle ad essa più vicine.Il vantaggio del metodo <strong>la</strong>grangiano rispetto ad un metodo euleriano è che mentrequest’ultimo prevede di avere una griglia a passo costante ai cui incroci vengono associatele masse delle regioni circostanti, <strong>il</strong> primo prevede di avere delle particelle da“seguire” a cui è associata una propria massa. Questo permette di avere una “grigliavariab<strong>il</strong>e” in modo da fare più calcoli dove sono <strong>con</strong>centrate più particelle (ossia avereuna griglia equivalente <strong>con</strong> passo piccolo) e sprecare poco tempo dove ci sono pocheparticelle (ossia avere una griglia equivalente <strong>con</strong> passo <strong>la</strong>rgo).Altra caratteristica fondamentale di questo tipo di forze è che non coinvolge tutti itipi di particelle ma solo alcuni e quindi richiede di essere inserita solo quando questesono presenti. È a questo punto necessaria una precisazione: l’universo <strong>con</strong>osciutoè formato da due tipi di materia, <strong>la</strong> materia barionica (quasi interamente formata daidrogeno ed elio) che è quel<strong>la</strong> a noi visib<strong>il</strong>e e che interagisce sia gravitazionalmenteche idrodinamicamente e una grande quantità di materia detta “materia oscura” (che ècirca 9÷10 volte superiore a quel<strong>la</strong> barionica) che non è a noi visib<strong>il</strong>e e che interagiscesolo gravitazionalmente.Il calcolo procede in due passi:1. si calco<strong>la</strong> <strong>la</strong> densità di materia per ogni particel<strong>la</strong>,2. si calco<strong>la</strong> <strong>la</strong> pressione e <strong>la</strong> forza cui è soggetta ogni particel<strong>la</strong> a causa dei suoivicini.Si è visto dal<strong>la</strong> pratica che tali calcoli hanno una precisione ottimale <strong>con</strong>siderando unnumero N s di particelle vicini (tipicamente qualche decina). Dato infatti che come si èdetto questa è una tecnica di tipo Lagrangiano che va a creare una griglia “variab<strong>il</strong>e”<strong>con</strong> una risoluzione maggiore nelle zone dove serve, ossia quelle più dense, e minorenelle zone meno dense. Con un numero maggiore di particelle si rischia di perdererisoluzione, <strong>con</strong> un numero inferiore si incorre in errori dovuti al<strong>la</strong> discretizzazionedei campi (shot-noise).Per definire <strong>la</strong> dimensione del<strong>la</strong> griglia nel punto di interesse come detto si prendecome riferimento un intorno di tale punto <strong>con</strong>tenente 40 particelle e a questo si associaun “raggio di smussamento” che, come dice <strong>il</strong> termine stesso, è <strong>il</strong> raggio di tale intorno.Dato che poi <strong>il</strong> sistema evolve nel tempo e le particelle si spostano si rende necessarioadattare dinamicamente tale raggio alle nuove <strong>con</strong>formazioni. Ciò viene fatto medianteun algoritmo che, a parte <strong>il</strong> primo passo, ut<strong>il</strong>izza <strong>il</strong> raggio precedente h i e fa una stimadel nuovo raggio ĥ i in base al<strong>la</strong> velocità di variazione del raggio stesso ḣ i , discendentedall’equazione di <strong>con</strong>tinuità, che èḣ i = 1 3 h i(∇ · v) i (2.6)


8 Gli algoritmi ut<strong>il</strong>izzati Cap. 2e del numero di vicini desiderato N s (che è impostab<strong>il</strong>e da utente anche diverso da 40)dal quale per qualche motivo <strong>il</strong> raggio può discostarsi andando a <strong>con</strong>tenere un numeroN i di vicini:⎡ĥ i = 1 2 h(old) i⎣1 + N 1 3 s⎤⎦ + ḣ i ∆t (2.7)N i<strong>il</strong> termine entro paren<strong>tesi</strong> quadre serve per riportare <strong>il</strong> numero di vicini realmente<strong>con</strong>tenuti dal raggio verso <strong>il</strong> valore desiderato.Per quanto riguarda <strong>il</strong> primo passo per <strong>il</strong> quale non si hanno informazioni precedentisi provvede a stimare un raggio iniziale basandosi sull’albero oct-tree creato perle forze gravitazionali.Qui di seguito si analizzano i passi e le equazioni ut<strong>il</strong>izzate per <strong>il</strong> calcolo del<strong>la</strong>densità e del<strong>la</strong> forza idrodinamica.2.3.1 Calcolo di densitàPer calco<strong>la</strong>re <strong>la</strong> densità si ut<strong>il</strong>izza un metodo di integrazione (che diventa poi unasommatoria data <strong>la</strong> discretizzazione effettuata nel trasporto sul calco<strong>la</strong>tore) su un insiemedi particelle vicine a quel<strong>la</strong> in questione. Questo permette di avere una buonastima del<strong>la</strong> densità nel punto di interesse <strong>con</strong>siderato come nodo del<strong>la</strong> “griglia virtuale”.Tale integrazione ha un kernel in modo da pesare in modo diverso i vicini più omeno lontani. Le equazioni sono:ρ i =N∑ m j W(r i j ,h i ) (2.8)j=1per calco<strong>la</strong>re <strong>la</strong> densità ρ del<strong>la</strong> particel<strong>la</strong> i in funzione delle N particelle circostanti jdove W rappresenta <strong>il</strong> kernel del<strong>la</strong> funzione che tipicamente è una spline, ad esempio <strong>la</strong>seguente spline cubica usata all’inizio da Monaghan e Lattazio e poi ripresa nel nostrocodice (<strong>il</strong> cui andamento è riportato in Figura 2.3):⎧⎪⎨W(r,h) = 1 1 − 3 ( rh) 2 (2 +3 rh) 340 ≤ r( ) h ≤ 1πh 3 1⎪ ⎩4 2 −r 3h1


Sez. 2.3 Codici SPH 9Figura 2.3: Andamento del<strong>la</strong> spline re<strong>la</strong>tiva all’equazione 2.9


10 Gli algoritmi ut<strong>il</strong>izzati Cap. 2<strong>con</strong> γ coefficiente adiabatico del gas (nel nostro caso 5/3) e u i energia interna del<strong>la</strong> particel<strong>la</strong>in esame calco<strong>la</strong>ta a partire dal<strong>la</strong> costante di Boltzmann k, dal peso moleco<strong>la</strong>remedio µ e dal<strong>la</strong> massa del protone m p in questo modo:u i =kT i(γ − 1)µm p(2.11)Infine avendo a disposizione <strong>la</strong> pressione si può passare a calco<strong>la</strong>re <strong>la</strong> forza agentesul<strong>la</strong> particel<strong>la</strong> in esame mediante integrazione del<strong>la</strong> seguente equazione di Eulero,equivalente idrodinamico del<strong>la</strong> se<strong>con</strong>da legge del<strong>la</strong> dinamica F = ma:∂v∂t+ (v · ∇)v = −∇Pρ(2.12)dove v è <strong>la</strong> velocità del<strong>la</strong> particel<strong>la</strong>. Qui non si riportano tutte le formule ut<strong>il</strong>izzatedal programma, soluzione dell’equazione di <strong>con</strong>tinuità, <strong>con</strong> cui si può calco<strong>la</strong>rel’accelerazione (si veda [Favaretto, 6, pp. 14-15]).2.4 Integrazione temporaleCome ogni sistema che evolve nel tempo è necessario che sia iterativo e ad ognipasso vada ad aggiornare i dati re<strong>la</strong>tivi alle particelle per farli avanzare. Il passo diavanzamento dipende da quanto noi possiamo andare nel futuro nel predire i parametridi una particel<strong>la</strong> <strong>con</strong>siderando i dati ottenuti attendib<strong>il</strong>i. Questo intervallo di temponon è uguale per tutte le particelle dato che l’attendib<strong>il</strong>ità dei risultati dipende sostanzialmenteda quanto rapidamente varia <strong>la</strong> sua velocità di spostamento nel tempo: ossiadal<strong>la</strong> sua accelerazione. Una tipica funzione per calco<strong>la</strong>re l’intervallo di predicib<strong>il</strong>ità∆t i di una particel<strong>la</strong> 1 è:∆t i = α tol(2.13)|a i |oppure∆t i =α cour h ih i |(∇ · v) i | + max(c i ,|v i |)(1 + 0.6α visc )(2.14)nel caso di particelle soggette anche a forze idrodinamiche, dove α tol e c i sono duecostanti per determinare <strong>la</strong> precisione che si vuole nel<strong>la</strong> stima del<strong>la</strong> posizione nell’intervallo,α visc è un coefficiente di viscosità artificiale e α cour è un fattore di accuratezzadi Courant, a i e v i rispettivamente l’accelerazione e <strong>la</strong> velocità del<strong>la</strong> particel<strong>la</strong> e infineh i <strong>il</strong> raggio di smussamento.Queste formule, se<strong>con</strong>do [Springel, 7], danno i migliori risultati rispetto a tantealtre <strong>con</strong>siderate.A questo punto si pone un problema di efficienza: se una particel<strong>la</strong> è predicib<strong>il</strong>ea grande distanza nel tempo è necessario aggiornar<strong>la</strong> sempre? Ovviamente <strong>la</strong> risposta1 <strong>con</strong> ∆t si intende l’estensione dell’intervallo di predicib<strong>il</strong>ità, ossia <strong>la</strong> particel<strong>la</strong> è predicib<strong>il</strong>enell’intervallo [t − 1 2 ∆t, t + 1 2 ∆t]


Sez. 2.4 Integrazione temporale 11è no ed infatti si prevede che sul totale di particelle presenti nel sistema quelle <strong>con</strong>maggiore accelerazione vengano avanzate più volte <strong>con</strong> piccoli passi mentre quelle <strong>con</strong>moto più uniforme vengano avanzate più raramente <strong>con</strong> passi più grandi. In sostanzaad ogni passo si vanno ad aggiornare so<strong>la</strong>mente un gruppo di particelle che hanno <strong>il</strong>più basso orizzonte di predicib<strong>il</strong>ità nel futuro.Il calcolo evolve nei seguenti passi:1. si calco<strong>la</strong> <strong>il</strong> tempo massimo al quale tutte le particelle sono predicib<strong>il</strong>i τ p =min{t i + 1 2 ∆t i , ∀i},2. si sceglie un gruppo di particelle G al limite inferiore del<strong>la</strong> timeline 2 <strong>con</strong> un certocriterio di arresto, ad esempio quello ut<strong>il</strong>izzato nel nostro codice è che ciascunadi esse sia avanzata per almeno metà del suo massimo timestep 3 permesso:G = {i : τ p ≥ t i + 1 4 ∆t i} (2.15)3. si predi<strong>con</strong>o tutte le particelle del sistema nell’istante temporale τ p (che diventa<strong>il</strong> tempo corrente del<strong>la</strong> simu<strong>la</strong>zione),4. si avanzano le particelle in G se<strong>con</strong>do <strong>il</strong> seguente schema sequenziale di calcoli:(a) posizioni di tutte le particelle in τ p˜r i = r i + v i (τ p −t i )(b) accelerazioni a metà del timestep per le particelle da avanzare a partire daicampi di forza Φ cui sono sottoposte= −∇Φ(˜r i )|˜rk(c) velocità nell’istante finalev (n+1)k= v (n)k+ 2a (n+ 1 2 )k(τ p −t k )(d) posizioni nell’istante finalea (n+ 1 2 )kr (n+1)k= r (n)k+[v (n)k+ v (n+1)k](τ p −t k )(e) nuovo istante corrente per le particellet nuovok= t k + 2(τ p −t k )A questo punto <strong>il</strong> tempo del<strong>la</strong> simu<strong>la</strong>zione è τ p e si può passare al prossimo passo diiterazione.2 per timeline si intende un elenco di tutte le particelle ordinate mediante <strong>il</strong> loro massimo tempo dipredicib<strong>il</strong>ità nel futuro.3 per timestep si intende <strong>il</strong> passo di avanzamento di una particel<strong>la</strong>.


12 Gli algoritmi ut<strong>il</strong>izzati Cap. 2


Capitolo 3Strategie di parallelizzazioneIn questo capitolo vengono <strong>il</strong>lustrate le scelte effettuate per <strong>la</strong> parallelizzazione.Esse non sono strettamente corre<strong>la</strong>te <strong>con</strong> l’implementazione del codice ma piuttostosono ad alto livello andando a vedere gli aspetti più <strong>con</strong>cettuali. Si discuterà quindidi come suddividere i dati tra i vari processori, di come effettuare i calcoli in mododistribuito una volta che i dati sono stati separati e di come trattare lo sb<strong>il</strong>anciamentoche insorge quando <strong>il</strong> <strong>la</strong>voro affidato ad ogni processore può essere molto diverso.Per un’analisi più dettagliata delle implementazioni effettuate sul codice si rimandaal Cap. 4 a pag. 27.3.1 La decomposizioneLa principale caratteristica del parallelismo è quel<strong>la</strong> di dividere <strong>il</strong> <strong>la</strong>voro da eseguiresu più processori in modo da aumentarne <strong>la</strong> velocità di e<strong>la</strong>borazione. Per fare ciò è perònecessario che anche i dati siano distribuiti.Esistono alcune e<strong>la</strong>borazioni che richiedono una elevata quantità di calcoli su unmodesto insieme di dati in ingresso: in questo caso si può pensare di duplicare i datiall’interno dei vari processori e poi di riaggregare i risultati al termine delle operazioni.Nel nostro caso ciò non è applicab<strong>il</strong>e perché <strong>la</strong> quantità di dati è elevata: è necessariomantenere delle informazioni per ogni particel<strong>la</strong> presente nel sistema da simu<strong>la</strong>reassieme alle strutture dati necessarie per gestirle. Una particel<strong>la</strong> richiede all’incirca100 byte di memoria, se pensiamo ad un sistema <strong>con</strong> 10 m<strong>il</strong>ioni di particelle (realistico)otteniamo 1 Gbyte di dati a cui dobbiamo sommarne altrettanti per le strutturedati: <strong>il</strong> risultato non è fac<strong>il</strong>mente duplicab<strong>il</strong>e nel<strong>la</strong> memoria di un singolo processoree comunque va a scapito del<strong>la</strong> sca<strong>la</strong>b<strong>il</strong>ità. Inoltre si può pensare ad un interesse <strong>con</strong>simu<strong>la</strong>zioni ancora più elevate che quindi diventerebbero impensab<strong>il</strong>i <strong>con</strong> i modernisistemi.La strategia richiede quindi di suddividere i dati all’interno dei vari processori. Unprimo approccio può essere quello di pensare di assegnare ad un processore i dati chequesto necessita per eseguire <strong>il</strong> <strong>la</strong>voro e di eseguire le e<strong>la</strong>borazioni <strong>il</strong> più possib<strong>il</strong>e localmente.Anche ciò risulta impraticab<strong>il</strong>e nel nostro caso perché <strong>la</strong> principale forza è


14 Strategie di parallelizzazione Cap. 3quel<strong>la</strong> gravitazionale a cui sono soggette tutte le particelle nel sistema e <strong>la</strong> cui interazionecoinvolge tutte le altre particelle: quindi si necessita di sincronizzarsi ad ognipasso di simu<strong>la</strong>zione per garantire che tale forza sia calco<strong>la</strong>ta nel modo corretto <strong>con</strong>gli algoritmi spiegati in precedenza (vedi Sez. 2.2 a pag. 3).3.1.1 Distribuzione randomUn primo tipo di suddivisione può essere distribuire le particelle tra i processoriin un modo random. Questo permetterebbe di non avere problemi di sb<strong>il</strong>anciamentodato che in media, per simu<strong>la</strong>zioni sufficientemente elevate, ogni processore avanzeràlo stesso numero di particelle ad ogni passo ed ogni processore gestirà sempre delleparticelle in zone altamente dense che richiedono elevati calcoli e particelle in zonepiù rarefatte che ne richiedono meno (vedi Figura 3.1).Dato che l’ammontare del tempo richiesto per <strong>la</strong> gestione del rib<strong>il</strong>anciamento eper lo sb<strong>il</strong>anciamento che inevitab<strong>il</strong>mente compare raggiunge, per quanto riportato inletteratura, <strong>il</strong> 20÷25% del tempo totale di esecuzione del programma parallelo già su16 processori, <strong>il</strong> fatto di togliere quasi completamente questa componente del tuttoindesiderata del calcolo è un fattore a vantaggio di questo approccio. Il “quasi” indicache comunque non è possib<strong>il</strong>e eliminar<strong>la</strong> interamente perché ad ogni passo i processoriavranno un numero di particelle da aggiornare che sarà leggermente diverso tra di loroper cui una qualche componente di sb<strong>il</strong>anciamento sarà sempre presente. Nei test<strong>con</strong>dotti tuttavia tale componente è sempre stata inferiore al 3%.Ciò richiederebbe come accorgimento che <strong>la</strong> distribuzione sia garantita essere randomall’inizio del<strong>la</strong> simu<strong>la</strong>zione perché altrimenti ciò potrebbe degradare le prestazioniglobali. Per quanto riguarda <strong>il</strong> nostro codice esso ha un input generato se<strong>con</strong>do unadistribuzione spaziale: ossia particelle vicine nel f<strong>il</strong>e sono vicine nello spazio, inoltreparticelle sim<strong>il</strong>i come comportamento medio nell’evoluzione sono anch’esse raggruppateassieme all’interno del f<strong>il</strong>e. Ciò ci <strong>con</strong>sente di distribuire le particelle se<strong>con</strong>do unamodalità round-robin 1 che già da so<strong>la</strong> garantisce una distribuzione ottimale.Un problema sorge per quanto riguarda le particelle di gas soggette alle forze idrodinamichein quanto essendo queste forze a corto raggio coinvolgono particelle vicineche <strong>con</strong> questa distribuzione vengono a trovarsi in processori diversi, viene a caderequindi qualsiasi speranza di poter limitare le comunicazioni ed eseguire calcoli localmenteper delle particelle <strong>con</strong> tutti i vicini sullo stesso processore. In ogni caso èsempre possib<strong>il</strong>e trovare <strong>il</strong> raggio di smussamento e quindi i vicini <strong>con</strong> cui interagisceanche in una situazione interprocessore (vedi Sez. 4.4 a pag. 30) anche se <strong>con</strong> unapenalizzazione in termini di tempo. Si rammenta comunque che per qualsiasi tipo didistribuzione esisteranno delle particelle <strong>con</strong> dei vicini su altri processori.Un altro problema più importante sorge invece in questo tipo di distribuzione, problemache rende inapplicab<strong>il</strong>e questo metodo: per <strong>il</strong> calcolo delle forze gravitazionali(che occupano sempre <strong>la</strong> maggior parte del carico di <strong>la</strong>voro) viene usato l’algoritmo diBarnes-Hut (vedi Sez. 2.2.1 a pag. 4) <strong>il</strong> quale approssima gruppi di particelle lontane1 round-robin significa distribuzione dei dati in modo circo<strong>la</strong>re tra tutti i processori.


Sez. 3.1 La decomposizione 15Proc 0 Proc 1Proc 2 Proc 3Figura 3.1: Distribuzione random di particelleusando i loro centri di massa. Quando queste particelle sono distribuite su più processoriogni processore assocerà al suo gruppo di particelle un centro di massa e <strong>con</strong>questo effettuerà una interazione <strong>con</strong> una particel<strong>la</strong> da avanzare. A questo punto da unaso<strong>la</strong> interazione originaria se ne vengono a creare N dove N è <strong>il</strong> numero di processoricoinvolti nel<strong>la</strong> simu<strong>la</strong>zione.Questo appesantimento dell’algoritmo che a parità di accuratezza esegue molti piùcalcoli porta ad un aumento <strong>con</strong>siderevole del tempo di esecuzione (fino a 3 volte su8 processori!), aumento che cresce assieme al numero di processori e va a cancel<strong>la</strong>requasi tutto <strong>il</strong> vantaggio dato dal<strong>la</strong> parallelizzazione rendendo quindi inut<strong>il</strong>izzab<strong>il</strong>e talemetodo di distribuzione.3.1.2 Distribuzione spazialeAltro metodo di distribuzione delle particelle, ampiamente ut<strong>il</strong>izzato in letteratura,<strong>con</strong>siste nel distribuire le particelle in modo che un processore abbia particellespazialmente vicine tra di loro (vedi Figura 3.2).Questo modo di procedere <strong>con</strong>sente di evitare <strong>il</strong> pesante in<strong>con</strong>veniente causatodal<strong>la</strong> distribuzione random e, nel caso di particelle di gas, permette di definire unaregione di spazio interna le cui particelle interagis<strong>con</strong>o solo localmente nel processoree non necessitano quindi di comunicazione per quanto riguarda le forze idrodinamiche(vedi Sez. 4.4 a pag. 30).Un in<strong>con</strong>veniente di questa distribuzione è che essendo <strong>la</strong> distribuzione di particellenon uniforme e inoltre evolvente nel tempo, è necessario modificare l’assegnazionedelle particelle ai vari processori dinamicamente. Altro in<strong>con</strong>veniente è che essendocinel<strong>la</strong> simu<strong>la</strong>zione zone in cui si addensano particelle in tali zone si hanno forze più


16 Strategie di parallelizzazione Cap. 3Proc 0 Proc 1Proc 4 Proc 5DecomposizioneProc 2 Proc 3Proc 6 Proc 7Figura 3.2: Distribuzione di particelle mediante dominielevate, ossia particelle che richiedono un maggiore sforzo computazionale. Come sivedrà più avanti sullo sb<strong>il</strong>anciamento (Sez. 3.3 a pag. 18) si dovrà pagare ciò <strong>con</strong>memoria aggiuntiva. Come già accennato questo overhead di gestione è indesiderato esi deve cercare pertanto di minimizzarlo.Dato che nel salvataggio su f<strong>il</strong>e dei dati per poter all’occorrenza riavviare una simu<strong>la</strong>zionesi perde traccia di come erano state distribuite le particelle tra i vari processori(a parte <strong>il</strong> caso partico<strong>la</strong>re in cui ogni processore scrive un suo f<strong>il</strong>e), è necessario aggiungerequesta informazione da qualche parte come verrà spiegato nel<strong>la</strong> Sez. 4.5 apag. 33.Nel nostro codice per quanto esposto qui e nel paragrafo precedente si è decisodi ut<strong>il</strong>izzare questa se<strong>con</strong>da tecnica di ripartizione dei dati <strong>con</strong> tutti i vantaggi e glisvantaggi che porta. Pertanto nel seguito essa verrà presa come distribuzione base perle varie <strong>con</strong>siderazioni.3.2 Le comunicazioniSi è visto quali sono le modalità di distribuzione delle particelle tra i vari processoricoinvolti nel<strong>la</strong> simu<strong>la</strong>zione, qui verranno ora presentate le strategie ut<strong>il</strong>izzab<strong>il</strong>i eut<strong>il</strong>izzate per permettere <strong>il</strong> calcolo sui dati distribuiti.Per quanto riguarda le forze gravitazionali 2 , che si ricorda sono a lungo raggio (vedisezione 2.2 a pag. 3), si presentano due modalità di comunicazione tra i processori perpermettere l’interazione tra tutte le particelle:1. un processore, quando deve avanzare una particel<strong>la</strong>, riceve dagli altri i datinecessari per poter eseguire <strong>il</strong> calcolo;2 in questa trattazione vengono <strong>con</strong>siderate solo le forze gravitazionali e non quelle idrodinamiche acorto raggio a cui, peraltro, possono essere applicati gli stessi ragionamenti.


Sez. 3.2 Le comunicazioni 17P 1P 2 P 3P 0tutti i dati sono disponib<strong>il</strong>iper i calcoli in localeFigura 3.3: Rappresentazione del processo di importazione dei dati residenti sugli altriprocessori per effettuare <strong>il</strong> calcolo in locale.Si può vedere come viene importata una grande quantità di dati per permettere alprocessore P 0 dell’esempio di svolgere tutti i calcoli sulle sue particelle.2. un processore, quando deve avanzare una particelle, invia i dati del<strong>la</strong> particel<strong>la</strong>a tutti gli altri facendo fare i dati in remoto e riassemb<strong>la</strong>ndo i risultati parziali altermine.3.2.1 Ricezione dei dati per eseguire <strong>il</strong> calcolo localmenteSe si ut<strong>il</strong>izza questa tecnica di comunicazione un processore che possiede una particel<strong>la</strong>esegue tutti i calcoli inerenti ad essa. Un esempio di codice ut<strong>il</strong>izzante questastrategia si può trovare in [Lia, 8]. Un primo in<strong>con</strong>veniente è che spesso si vengono atrovare zone altamente dense che, quando <strong>il</strong> numero di processori cresce, rischiano ditrovarsi tutte in pochi processori. Questo può creare problemi di rib<strong>il</strong>anciamento neltempo di esecuzione perché pochi processori si trovano sovraccaricati di <strong>la</strong>voro già <strong>con</strong>poche particelle mentre altri si trovano quasi privi.Altro problema fondamentale di questo metodo è che un processore necessita diricevere una grande quantità di informazioni riguardanti le particelle <strong>con</strong>tenute neglialtri processori per poter eseguire i calcoli. Inoltre non può ricevere solo i dati delleparticelle perché altrimenti l’algoritmo di Barnes-Hut e <strong>la</strong> sua semplificazione nel<strong>la</strong>complessità del problema verrebbe meno. Esso deve ricevere pertanto anche i dati


18 Strategie di parallelizzazione Cap. 3re<strong>la</strong>tivi ai nodi interni <strong>con</strong> cui effettuare i dati in forma aggregata. In Figura 3.3 si puòvedere come può avvenire questo modo di procedere.Si pone ora <strong>il</strong> problema di decidere quali dati importare perché l’apertura di un nodointerno dipende dal<strong>la</strong> distanza dal<strong>la</strong> particel<strong>la</strong> ma anche (fattore più diffic<strong>il</strong>e da prevedere)dall’accelerazione del<strong>la</strong> particel<strong>la</strong> in esame. Processori diversi richiederebberoin linea di massima anche dati diversi data <strong>la</strong> diversa distanza tra di loro.Anche supponendo di avere degli strumenti per stab<strong>il</strong>ire che cosa importare, oppuredecidendo di importare tutti gli alberi vicini, nasce <strong>il</strong> problema di dove sistemaretemporaneamente tutti i dati in arrivo dato che, come visto all’inizio del capitolo, è necessariodistribuire le particelle, essendo troppi i dati per essere mantenuti da un soloprocessore.Infine questi dati richiederebbero di essere importati ad ogni passo in quanto cisono sempre delle particelle che vengono spostate in ciascun processore e nessunotranne <strong>il</strong> processore che le detiene può sapere come si sono spostate.3.2.2 Esportazione dei dati ed esecuzione del calcolo in remotoPer tutti i motivi sopra esposti si è stati portati verso <strong>la</strong> se<strong>con</strong>da strategia di parallelizzazioneche qui verrà esposta.Dato che tutte le forze del sistema sono lineari non ha alcuna importanza l’ordine<strong>con</strong> cui i calcoli vengono fatti, l’unica cosa importante è che siano effettuati tutti.Ciò porta a pensare di inviare i dati re<strong>la</strong>tivi alle particelle da avanzare a tutti gli altriprocessori, attendere che ciascuno di questi effettui su di esse una parte dei calcoli e poiriaggregare tutti i risultati parziali nel processore detentore del<strong>la</strong> particel<strong>la</strong> (vedi Figura3.4). Questo modo di procedere permette innanzitutto una migliore distribuzione delcarico di <strong>la</strong>voro perché, anche se un processore che detiene particelle da avanzarenecessita di una maggiore quantità di calcoli dovendo aprire più nodi, <strong>il</strong> calcolo èdi per sé maggiormente partizionato.Pensare ad esportare le particelle è sensato perché ad ogni passo solo una picco<strong>la</strong>frazione del totale di particelle viene aggiornato. Inoltre si può vedere inoltre che percalco<strong>la</strong>re le forze che agis<strong>con</strong>o su una particel<strong>la</strong> non è necessario <strong>con</strong>oscere tutto diquel<strong>la</strong> particel<strong>la</strong> ma solo <strong>la</strong> sua posizione e poco altro (un po’ di più è necessario perle forze idrodinamiche). Quindi è possib<strong>il</strong>e ut<strong>il</strong>izzare dei buffer per mantenere questidati da inviare agli altri e su questi stessi ricevere i risultati parziali (di come vengonout<strong>il</strong>izzati i buffer nel nostro programma se ne par<strong>la</strong> più in dettaglio nel<strong>la</strong> Sez. 4.2 apag. 27)3.3 Lo sb<strong>il</strong>anciamentoPoiché come si è detto le particelle si muovono durante <strong>la</strong> simu<strong>la</strong>zione, se si vuolecercare di limitare lo sb<strong>il</strong>anciamento che può insorgere tra i vari processori e usufruiredi una gestione delle forze idrodinamiche in modo da avere una regione completamenteinterna al processore, è necessario predisporre un meccanismo che aggiorni i <strong>con</strong>fini


Sez. 3.3 Lo sb<strong>il</strong>anciamento 19P 0dati inizialiCalcoli parzialirisu<strong>la</strong>tati totaliP 1Calcoli parzialiP 2Calcoli parzialiCalcoli parzialiP 3Figura 3.4: Rappresentazione del processo di esportazione dei dati per <strong>il</strong> calcolo inremoto.Si può vedere come <strong>il</strong> processore P 0 che ha delle particelle da avanzare (rappresentateda cerchi vuoti) mandi a tutti gli altri (compreso se stesso) i suoi dati attendendo chequesti facciano le e<strong>la</strong>borazioni in base ai dati in loro possesso e poi i risultati venganoriassemb<strong>la</strong>ti nel processore P 0 (rappresentati da cerchi pieni).


20 Strategie di parallelizzazione Cap. 3dei domini spaziali di pertinenza di ciascun processore dinamicamente. In Figura 3.5si può vedere come si procede allo spostamento di un taglio (in partico<strong>la</strong>re di quelloche coinvolge tutti i processori).VecchioTaglioNuovoTaglioPrimaDopoFigura 3.5: Riposizionamento del taglio principale all’interno del<strong>la</strong> distribuzione diparticelleInoltre, cosa fondamentale, poiché pochi processori si troveranno ad avere le particellepiù pesanti computazionalmente, è necessario assegnare a questi un numeroinferiore di particelle rispetto agli altri. Infatti nonostante <strong>il</strong> calcolo sia distribuito inremoto, <strong>il</strong> processore che detiene una particel<strong>la</strong> richiederà un maggior numero di calcolidi tipo particel<strong>la</strong>-particel<strong>la</strong> dovendo aprire maggiormente i nodi, un processorelontano si troverà in una situazione di dover aprire meno i nodi in quanto distantedalle particelle avanzate e potrà usufruire dell’approssimazione data dall’algoritmo diBarnes-Hut.Punto fondamentale è che tutto lo spazio è coperto esattamente dai processori (comesi può vedere nelle Figure 3.2 e 3.5). Risulta anche che lungo <strong>il</strong> taglio principaletutti i processori devono adeguarsi ad avere un bordo comune, anche questo è fatto perpoter gestire <strong>il</strong> tutto in maniera efficiente.Per ridistribuire le particelle si <strong>la</strong>vora in modo ricorsivo: lungo un taglio si possonoindividuare due gruppi di processori i quali (in <strong>con</strong>dizioni ottimali) dovrebberoimpiegare un uguale tempo di calcolo. Ognuno dei due gruppi calco<strong>la</strong> quanto tempo haut<strong>il</strong>izzato nelle computazioni complessivamente (somma dei tempi sui singoli processoridel gruppo) tolte tutte le comunicazioni e le attese, poi <strong>il</strong> gruppo che ha impiegatopiù tempo invia delle particelle al gruppo che ha <strong>la</strong>vorato meno.Questo semplice algoritmo permette di ridurre lo sb<strong>il</strong>anciamento in quanto tendere


Sez. 3.3 Lo sb<strong>il</strong>anciamento 21a rende uguale <strong>il</strong> <strong>la</strong>voro effettuato da ciascun gruppo. Esso ha <strong>il</strong> vantaggio che, a parteper <strong>il</strong> taglio principale, <strong>il</strong> calcolo dei tempi e lo scambio di particelle può avvenire inparallelo.Dato che i livelli di suddivisione risentono degli scambi effettuati ai livelli superiori,si è ritenuto più efficiente effettuare <strong>il</strong> <strong>con</strong>trollo solo su una dimensione al<strong>la</strong> volta equindi per un rib<strong>il</strong>anciamento globale si devono effettuare tre successive ridivisioni.L’equazione ut<strong>il</strong>izzata per decidere quante particelle devono essere scambiate è <strong>la</strong>seguente:N · c part = t max −t min(3.1)2nel<strong>la</strong> quale t max e t min corrispondono ai tempi re<strong>la</strong>tivi ai due gruppi, N è <strong>il</strong> numerodi particelle scambiate e c part è <strong>il</strong> costo di una particel<strong>la</strong>, ossia quanto tempo è statomediamente ut<strong>il</strong>izzato per gestire una particel<strong>la</strong> all’interno di un processore.Una volta calco<strong>la</strong>to <strong>il</strong> numero di particelle da scambiare è necessario trovare unanuova posizione del taglio e questo viene fatto mediante una ricerca binaria all’internodel gruppo di processori che deve inviare in modo che selezioni tale taglio. Per motividi efficienza e per non entrare in cicli infiniti, vengono poi stab<strong>il</strong>iti due paramentri dicui uno da utente (ExchangePartTolerance) che permettono di interrompere <strong>la</strong> ricercaqualora non si riesca a trovare precisamente <strong>il</strong> taglio perché molte particelle sono<strong>con</strong>centrate in una sezione (l’arresto avviene quando si raggiunge <strong>la</strong> precisione dei realinel calco<strong>la</strong>tore) oppure qualora l’imprecisione sul numero di particelle selezionatedal nuovo taglio diventa inferiore all’errore commesso comunque dall’approssimazionedi <strong>con</strong>siderare <strong>la</strong> media sui tempi di tutte le particelle (si veda <strong>la</strong> Sez. 4.7 per unadescrizione di questo parametro).Successivamente le particelle così selezionate vengono mandate all’altro gruppo diprocessori. Poiché però un processore può non avere posto a sufficienza per accoglieretutte le particelle che gli vengono inviate è stata stab<strong>il</strong>ita anche una modalità per cui unprocessore ricevente può decidere di non accettare tutte le particelle ma di scegliere unnuovo taglio (ovviamente che riduce l’entità del taglio deciso da chi invia) in modo dalimitare <strong>il</strong> rib<strong>il</strong>anciamento per motivi di memoria insufficiente.Come si vede è necessario che un processore allochi più memoria di quel<strong>la</strong> strettamentenecessaria a <strong>con</strong>tenere le particelle per far fronte a questi sb<strong>il</strong>anciamenti nelcarico di <strong>la</strong>voro. Stimare quanto sovradimensionare <strong>la</strong> memoria rispetto al minimoindispensab<strong>il</strong>e per <strong>con</strong>tenere tutte le particelle non è fac<strong>il</strong>e perché si <strong>con</strong>trastano dueaspetti: da una <strong>la</strong>to <strong>la</strong> necessità di avere molta memoria in più per permettere una ottimaleripartizione del carico di <strong>la</strong>voro tra tutti i processori e dall’altra <strong>il</strong> vincolo del<strong>la</strong>memoria fisica a disposizione nel calco<strong>la</strong>tore. Pertanto esiste un parametro impostab<strong>il</strong>eda utente per permettere di stab<strong>il</strong>ire a se<strong>con</strong>da del<strong>la</strong> simu<strong>la</strong>zione quanto sovradimensionare<strong>la</strong> memoria (MemoryFactor, vedi Sez. 4.7 a pag. 39 per una descrizione delparametro).In Figura 3.6 si può vedere graficamente come procede l’algoritmo.Per evitare instab<strong>il</strong>ità se si è prossimi all’equ<strong>il</strong>ibrio vi è poi una <strong>con</strong>dizione aggiuntivache inibisce lo scambio di particelle ossia quandot max −t min < t · ∆ imb


22 Strategie di parallelizzazione Cap. 3ReceiverQuante particelle inviareElenco particelleSendercalcolo di quante particelleinviare dall’altra parte mediantericerca binariainvio delle particellericezione delleparticelle e verificase spazio sufficienteNuova posizione asse di splitTempocancel<strong>la</strong>zione particelle inviate<strong>con</strong> successo dall’altra partedel taglioFigura 3.6: Protocollo di scambio delle particelle tra i due blocchi di processoricomponenti <strong>il</strong> tagliodove ∆ imb è un parametro impostab<strong>il</strong>e da utente (Imba<strong>la</strong>nceTolerance, si vedaSez. 4.7 a pag. 39 per una descrizione del parametro) che indica quanto essere precisi et è invece indistintamente uno dei due tempi dato che, essendo tipicamente ∆ imb∼ = 0.05,i due tempi tendono ad avvicinarsi quando <strong>la</strong> re<strong>la</strong>zione è soddisfatta.Nell’introdurre questo algoritmo di rib<strong>il</strong>anciamento sorgono alcuni problemi chesono trattati nei sottoparagrafi seguenti e sono:• caricamento iniziale dei dati formando <strong>la</strong> decomposizione• mantenimento del<strong>la</strong> situazione del<strong>la</strong> decomposizione per un riavvio• problemi qualora i tempi si b<strong>il</strong>anciano e si creano sfuocature nei bordi3.3.1 Il caricamento inizialeUn primo problema da affrontare riguarda come caricare i dati inizialmente dalf<strong>il</strong>e. Dato che non esiste alcuna suddivisione dei domini preimpostata e, soprattuttoal crescere del numero di processori coinvolti, lo spazio di competenza assegnato aivari processori può non essere uguale dato che tipicamente <strong>la</strong> distribuzione iniziale diparticelle non è uniforme su tutto lo spazio, ma presenta delle <strong>con</strong>centrazioni in alcunipunti.


Sez. 3.3 Lo sb<strong>il</strong>anciamento 23P 0 calco<strong>la</strong>i domin<strong>il</strong>etturadatiP 0P 1Broadcast dei dominia tutti i processsoriP 2P 3ognuno caricai suoi datiP 1 P 2 P 3Figura 3.7: Schema di come avviene <strong>il</strong> caricamento iniziale dei dati per l’avvio di unanuova simu<strong>la</strong>zione.Il processore P 0 legge i dati dal f<strong>il</strong>e e costruisce una tabel<strong>la</strong> tridimensionale <strong>con</strong>tenentein ogni cel<strong>la</strong> <strong>il</strong> numero di particelle in quel<strong>la</strong> regione. Successivamente <strong>con</strong>siderandouniforme <strong>la</strong> distribuzione di particelle all’interno di ogni cel<strong>la</strong> viene effettuata unaripartizione evidenziata in linea tratteggiata. Il processore P 0 invia i dati così ottenutia tutti gli altri. Infine ognuno va a caricare i dai di suo interesse dal f<strong>il</strong>e.


24 Strategie di parallelizzazione Cap. 3In alcuni codici come [Springel, 7] in cui esiste una gestione del rib<strong>il</strong>anciamentodiversa da quel<strong>la</strong> da noi implementata viene caricato <strong>il</strong> f<strong>il</strong>e iniziale in modo round-robine poi viene generata una suddivisione che assegna a ciascun processore un eguale numerodi particelle e queste vengono scambiate tra i processori in memoria. Nel nostrocaso invece non è possib<strong>il</strong>e perché l’algoritmo prevede di averne una suddivisione preesistente:è quindi necessario approntare un codice apposito che sopperisca a questoin<strong>con</strong>veniente.Per risolvere <strong>il</strong> problema viene in nostro aiuto <strong>il</strong> formato dei f<strong>il</strong>e di ingresso, formatopartico<strong>la</strong>re scritto dal prof. Tormen (vedi [Tormen, 9]), nei quali vengono elencatetutte le particelle <strong>con</strong> le loro posizioni, velocità e masse.È stato implementato un metodo, <strong>il</strong> cui funzionamento si può vedere graficamentein Figura 3.7, che va a leggere l’input e a mappare lo spazio di simu<strong>la</strong>zione in una tabel<strong>la</strong>tridimensionale in modo che in ogni cel<strong>la</strong> del<strong>la</strong> griglia sia indicata <strong>la</strong> quantità diparticelle in quel<strong>la</strong> regione di spazio. Si va poi a partizionare <strong>il</strong> dominio <strong>con</strong>siderandouniforme <strong>la</strong> distribuzione delle particelle all’interno di una cel<strong>la</strong> (in figura <strong>il</strong> partizionamentogenerato è in linea tratteggiata). Da sperimentazioni si può vedere che già<strong>con</strong> qualche centinaio di celle per <strong>la</strong>to <strong>la</strong> decomposizione effettuata è errata di qualchepunto percentuale, del tutto irr<strong>il</strong>evante per <strong>il</strong> caricamento.La complessità di tale algoritmo, che viene eseguito da un solo processore <strong>il</strong> qualepropaga poi <strong>il</strong> risultato agli altri, è O(N + P). È lineare nel numero di particelle N inquanto queste vengono lette una so<strong>la</strong> volta dal f<strong>il</strong>e. È lineare nel numero di processoriperché dati P processori devono essere calco<strong>la</strong>ti P − 1 tagli ognuno dei quale richiedeun numero proporzionale al<strong>la</strong> profondità del taglio e al<strong>la</strong> dimensione del<strong>la</strong> tabel<strong>la</strong> cheè una costante.Al<strong>la</strong> fine ogni processore va a leggere dal f<strong>il</strong>e di input i dati che gli interessano.3.3.2 Mantenimento datiDato che l’algoritmo è totalmente dinamico è necessario che i dati re<strong>la</strong>tivi ai dominisiano salvati su f<strong>il</strong>e qualora si voglia poter riavviare <strong>la</strong> simu<strong>la</strong>zione in un se<strong>con</strong>domomento. Le modalità di riavvio di una simu<strong>la</strong>zione (come spiegato in [Favaretto, 6,pp. 31]) sono due: mediante f<strong>il</strong>e di restart oppure mediante snapshot.Un f<strong>il</strong>e di restart <strong>con</strong>tiene una copia del<strong>la</strong> memoria al momento del salvataggio eviene ut<strong>il</strong>izzato solo dal nostro programma pertanto non è necessaria <strong>la</strong> compatib<strong>il</strong>ità<strong>con</strong> altri codici e si è potuto modificarne <strong>il</strong> formato in modo tale da salvare anche leinformazioni re<strong>la</strong>tive ai domini.Uno snapshot è invece un f<strong>il</strong>e <strong>con</strong>tenente solo alcuni dati re<strong>la</strong>tivi alle particelle cheservono poi per delle analisi post-simu<strong>la</strong>zione. Il fatto che tale f<strong>il</strong>e debba interagire <strong>con</strong>altri programmi ha posto immediatamente dei vincoli sul suo formato. La soluzionesi è trovata andando a creare un f<strong>il</strong>e aggiuntivo, comune a tutti gli snapshot di unasimu<strong>la</strong>zione, che <strong>con</strong>tiene indicazione su quante particelle ogni processore <strong>con</strong>tenevaal momento del salvataggio dello snapshot e di quale dominio gli competeva.In tale modo è poi possib<strong>il</strong>e andare a recuperare dallo snapshot (che magari è scrittoda più f<strong>il</strong>e come si vedrà nel<strong>la</strong> Sez. 4.5 a pag. 33) esattamente <strong>la</strong> situazione esistente


Sez. 3.3 Lo sb<strong>il</strong>anciamento 25al momento del salvataggio. Tale f<strong>il</strong>e va pertanto allegato agli snapshot per permetterne<strong>il</strong> riavvio, è invece ininfluente per l’analisi post-simu<strong>la</strong>zione permettendo di nonmodificare tali altri programmi.3.3.3 La ridefinizione dei dominiAltro problema sorto è che durante l’evoluzione, qualora per lunghi intervalli ditempo i tempi impiegati dai vari processori siano pressoché uguali (o almeno tali danon eseguire lo scambio di particelle) oppure le spostamento di particelle avvenga semprenel<strong>la</strong> stessa direzione, le particelle lungo i bordi dei domini si fondano tra i diversiprocessori andando a sfocare i bordi e riducendo i benefici del<strong>la</strong> decomposizione adomini andando, al<strong>la</strong> lunga, a in<strong>con</strong>trare i problemi occorsi al<strong>la</strong> distribuzione random.Per tale motivo è stato implementato un altro metodo invocato dopo un certo numerodi decomposizioni fissato, nel nostro codice 3 decomposizioni globali (ossia effettuatesu tutti e tre gli assi), in modo da ridelineare i domini e permettere lo scambiodelle particelle che non competono più ad un processore.Si è visto dalle simu<strong>la</strong>zioni che mentre senza l’ut<strong>il</strong>izzo di questa accortezza unabuona parte delle particelle veniva a cadere al di fuori del dominio di competenza diun processore (fino ad averne anche più del 50%), <strong>con</strong> <strong>il</strong> suo ut<strong>il</strong>izzo <strong>il</strong> numero diparticelle che fuoriesce dal dominio di competenza risulta essere inferiore al 3%.


26 Strategie di parallelizzazione Cap. 3


Capitolo 4Modifiche al codiceIn questo capitolo verranno ripercorse tutte le modifiche attuate nel codice perpermettere l’interazione tra i diversi processi e le nuove strutture dati introdotte.4.1 Implementazione in MPIDato che nel passaggio da un sistema monoprocessore ad uno multiprocessore è necessariogestire l’interazione tra i vari processori coinvolti nel<strong>la</strong> soluzione del problemaè stato necessario ut<strong>il</strong>izzare una libreria di routine atte a questo scopo. È stata pertantoscelta <strong>la</strong> libreria MPI in quanto ampiamente diffusa e supportata da vari tipologie dimacchine oltre che dal<strong>la</strong> macchina da noi ut<strong>il</strong>izzata: RS/6000 SP del<strong>la</strong> IBM.Queste librerie sono descritte in maggiore dettaglio in [MPI, 2] e [Aoyama, 1] pervari esempi di ut<strong>il</strong>izzo. Qui verranno so<strong>la</strong>mente riproposte quelle tipologie che sonostate ut<strong>il</strong>izzate per i nostri scopi.Tra le varie tipologie di routine ne sono state prese in <strong>con</strong>siderazione due: routinecollettive e routine point-to-point. Sono state valutate le prestazioni di entrambe all’internodel nostro programma per i compiti descritti nei paragrafi seguenti e si è visto chequelle collettive risultavano estremamente lente sul sistema da noi adottato rispetto aquelle point-to-point. È stato quindi adottato questo se<strong>con</strong>do sistema di comunicazionidescritto più in dettaglio nei paragrafi seguenti.Non è stato invece possib<strong>il</strong>e sfruttare le routine per <strong>la</strong> gestione dei f<strong>il</strong>e in quantoqueste verranno supportate a partire dal<strong>la</strong> versione 2 di MPI mentre quel<strong>la</strong> a nostradisposizione è <strong>la</strong> versione 1.2. Tale aggiornamento potrà essere fatto in un futuroqualora si abbiano a disposizione tali strumenti e soprattutto si senta <strong>la</strong> necessità dimaggiori prestazioni per scrittura dei f<strong>il</strong>e (per <strong>la</strong> gestione dei f<strong>il</strong>e si veda Sez. 4.5 apag. 33).4.2 Buffer di comunicazioneAllo scopo di permettere ai vari processori di scambiarsi i dati come spiegato nelcapitolo precedente (vedi Sez. 3.2.2 a pag. 18) sono stati creati due buffer di comunica-


28 Modifiche al codice Cap. 4zione: uno locale e uno globale <strong>la</strong> cui dimensione è impostab<strong>il</strong>e dall’utente (CommSize,vedi Sez. 4.7 a pag. 39 per una descrizione del parametro).P 0P 1P 2P 3Dati da e<strong>la</strong>borare(in buffer Locale)Esportazione a tuttii processoriut<strong>il</strong>izzo di SendRecvper <strong>la</strong> comunicazionediretta <strong>con</strong> tutti iprocessori singo<strong>la</strong>rmenteDati esportati per e<strong>la</strong>borazione(in buffer Globale)P 0P 1P 2P 3Ogni processorefa i calcoli sui datiricevuti <strong>con</strong> i datiin suo possessoP 0I <strong>con</strong>tributi parziali dei variP 0P 1processori vengonoriaggregati sommandoliP 1P 2P 3Risultati totali riaggregati(in buffer Locale)ut<strong>il</strong>izzo di SendRecvpiù somme eseguitelocalmenteRisultati parziali dei calcoli locali(in buffer Globale)P 2P 3Figura 4.1: Schema di come vengono ut<strong>il</strong>izzati i buffer per <strong>il</strong> calcolo delle forze inremotoNel buffer locale vengono posti i dati dai singoli processori prima di essere esportatie i dati raccolti dai processori dopo le e<strong>la</strong>borazioni in remoto. Poiché in questi bufferdevono essere <strong>con</strong>tenuti solo i dati re<strong>la</strong>tivi ad un processore <strong>la</strong> loro dimensione è metàdi quel<strong>la</strong> dei buffer globali in quanto un processore non deve mai poter avere più dimetà di tutti i dati da gestire, altrimenti ci si troverebbe sicuramente in una situazionedi forte sb<strong>il</strong>anciamento, cosa da evitare.Nel buffer globale vengono invece posti tutti i dati provenienti da tutti i processoriin modo che quando un processore deve fare i suoi calcoli trovi tutto in un array unicoe possa scandirlo <strong>con</strong> maggiore fac<strong>il</strong>ità. Questi buffer vengono poi sovrascritti a manoa mano che i dati vengono <strong>con</strong>sumati e si produ<strong>con</strong>o i risultati. In questo modo si evitadi dover allocare due buffer per mantenere input e output. Per evitare di cancel<strong>la</strong>re datiprima che siano stati ut<strong>il</strong>izzati basta avere l’accortezza di iniziare ad e<strong>la</strong>borare i dati apartire dal<strong>la</strong> fine del buffer qualora i dati in uscita siano più grandi di quelli in ingresso.La Figura 4.1 mostra come tale procedimento evolve nel tempo: ogni processoreha una certa quantità di particelle da avanzare e quindi su cui calco<strong>la</strong>re le forze. Questevengono inviate a tutti i processori (compreso se stesso) e posizionate nel buffer globale.A questo punto ogni processore può eseguire i calcoli <strong>con</strong> i dati in suo possesso


Sez. 4.3 Spostamento di particelle 29ReceiverSenderGlobaleGlobaleProcessori difrontieraProcessoreROOTLocaleAltri processorinon di frontieraLocaleAltri processoriFigura 4.2: Rappresentazione di come avviene lo spostamento delle particelle tra ledue parti di un taglio quando si necessità di un rib<strong>il</strong>anciamento.su tutte le particelle ricevute e sovrascrivere i dati iniziali <strong>con</strong> i risultati parziali (datiin grigio nel<strong>la</strong> figura), infine questi vengono rimandati ai proprietari delle particelle iquali provvederanno a sommare tutti i <strong>con</strong>tributi ricevuti e a sistemarli nel buffer localee da qui poi dove sono tenute le particelle.Ovviamente può accadere che <strong>il</strong> buffer globale non sia in grado di tenere tutte leparticelle da aggiornare, in questo caso si ripete <strong>la</strong> procedura più volte fino ad esauriretutti i dati. In ogni passo di trasmissione <strong>il</strong> buffer verrà a <strong>con</strong>tenere le particelle da tutti iprocessori che necessitano aggiornamenti in maniera proporzionale a quante particellevogliono avanzare, in questo modo un processore avrà alcune particelle vicine su cuidovrà effettuare più calcoli e alcune particelle lontane su cui ne dovrà effettuare dimeno andando quindi a distribuire <strong>il</strong> carico in modo più uniforme possib<strong>il</strong>e.4.3 Spostamento di particelleUna volta che <strong>il</strong> programma ha deciso se<strong>con</strong>do le modalità analizzate nel<strong>la</strong> Sez. 3.3a pag. 18 che per rib<strong>il</strong>anciare i tempi di calcolo è necessario spostare delle particelle,queste vengono spostate mediante l’ut<strong>il</strong>izzo dei buffer come <strong>il</strong>lustrato in Figura 4.2.Come si può vedere, i processori che devono ricevere particelle si predispongonoa riceverle nel loro buffer globale per poi analizzarle e decidere se tenerle. È da evi-


30 Modifiche al codice Cap. 4denziare che non tutti i processori di sinistra ricevono le particelle, ma solo quelli difrontiera, ossia quelli che hanno un bordo sul taglio in movimento, in modo da nonmandare particelle a chi non è minimamente interessato rispar<strong>mia</strong>ndo tempo. Ciò vienead essere un vantaggio quando <strong>il</strong> numero di processori coinvolto sale e si stannogestendo quei tagli che li coinvolgono tutti o in buona parte.Invece i processori che inviano si coordinano mandando le particelle ad uno solodi essi <strong>il</strong> quale si prende l’incarico di inviarle dall’altra parte del taglio. Come si puòvedere i processori che inviano usano <strong>il</strong> buffer locale per mandare le particelle al rootper <strong>il</strong> forwarding e quest’ultimo ut<strong>il</strong>izza <strong>il</strong> buffer globale per poi rinviarle dall’altraparte.Ciò permette di non dovere instaurare una comunicazione tutti <strong>con</strong> tutti come perle ridefinizioni (vedi Sez. 3.3.3 a pag. 25) e per i calcoli di forze ma di semplificarel’invio mediante un forward. Questo può rappresentare un collo di bottiglia delloscambio, tuttavia si può notare che quando è coinvolto un numero sufficiente di processor<strong>il</strong>ungo i tagli principali i tempi tenderanno ad essere abbastanza uguali tra le dueparti o comunque faranno spostare <strong>il</strong> tagli gradualmente. Nei tagli più piccoli, invece,dove ci può essere una maggiore variab<strong>il</strong>ità, <strong>il</strong> processo è maggiormente parallelizzato.4.4 Ricerca dei vicini e domini interniPoiché come anticipato nel<strong>la</strong> Sez. 3.1.2 a pag. 15 avendo una distribuzione adomini è possib<strong>il</strong>e individuare una regione interna al processore tale che le particelle digas ivi <strong>con</strong>tenute non necessitino di esportazione per i calcoli re<strong>la</strong>tivi all’idrodinamica,è necessario dividere le particelle in due gruppi: completamente interne ed esportab<strong>il</strong>i.


Sez. 4.4 Ricerca dei vicini e domini interni 31P 1P 0dominio di competenza(le particelle possono fuoriuscire)dominio tagliato da tuttii domini di influenzadefinito internodominio di influenzadi tutte le particelledel processoreP 2Figura 4.3: Illustrazione di come avviene <strong>la</strong> definizione di dominio interno.L’esempio è re<strong>la</strong>tivo al processore P 0. Ogni processore <strong>con</strong>tiene le sue particelle chepossono anche fuoriuscire dal suo dominio di competenza. In ogni caso viene cercato<strong>il</strong> dominio (tratteggiato) di influenza di tutte le particelle di gas: esso è formato dal<strong>la</strong>massima estensione dei raggi di smussamento di tutte le particelle di gas. A questopunto <strong>con</strong> questi domini si va a “tagliare” <strong>il</strong> dominio del processore sotto analisi (P 0)andando a determinare una regione al cui interno le particelle interagis<strong>con</strong>o solo <strong>con</strong>particelle situate nel processore (rettangolo in grassetto).Innanzitutto è necessario decidere come determinare se una particel<strong>la</strong> necessiti diinterazioni <strong>con</strong> gli altri processori oppure no. A questo scopo viene implementato unmetodo che si preoccupa di calco<strong>la</strong>re tale regione interna, come <strong>il</strong>lustrato in Figura 4.3.A questo punto le particelle che se<strong>con</strong>do quanto visto vengono dichiarate completamenteinterne non necessitano di attenzioni partico<strong>la</strong>ri rispetto a quanto fattonel programma sequenziale. Per le particelle esportab<strong>il</strong>i sono invece necessarie delleaggiunte.Prima fra tutte <strong>la</strong> ricerca dei vicini, infatti da quanto visto anche nel Cap. 2.3 a pag.6 è necessario calco<strong>la</strong>re un raggio comprendente un numero di particelle prestab<strong>il</strong>ito.Ciò viene fatto mediante una ricerca binaria, come si può vedere in Figura 4.4, tra unraggio minimo e uno massimo fino ad arrivare a definire <strong>il</strong> raggio voluto. Le <strong>con</strong>dizionidi arresto di tale algoritmo sono due:• quando <strong>il</strong> numero di vicini <strong>con</strong>tenuto nel raggio corrente è corretto a meno di unerrore definib<strong>il</strong>e dall’utente nel f<strong>il</strong>e dei parametri(SPHNeighboursDeviation, vedi Sez. 4.7 a pag. 39)


32 Modifiche al codice Cap. 4massimocorrenteminimoFigura 4.4: Metodo di ricerca binaria del raggio di smussamento delle particelle dimateria barionica


Sez. 4.5 Metodi di scrittura dei f<strong>il</strong>e 33• oppure quando <strong>la</strong> differenza tra i due raggi è sufficientemente picco<strong>la</strong> da risultareinut<strong>il</strong>e un maggior approfondimento (nel nostro codice tale dimensione è1/100.000 del raggio).Si è visto nelle simu<strong>la</strong>zioni svolte che <strong>il</strong> numero di iterazioni per trovare un raggio<strong>con</strong>tenente 40±2 particelle sono necessari sempre meno di 10 iterazioni.In se<strong>con</strong>do luogo è necessario esportare tali particelle ed effettuare i calcoli inremoto. Ciò viene fatto come spiegato precedentemente nel<strong>la</strong> Sez. 4.2 a pag. 27.Una so<strong>la</strong> differenza è stata necessaria per quanto riguarda <strong>il</strong> calcolo del<strong>la</strong> pressione inquanto <strong>la</strong> particel<strong>la</strong> in esame non deve essere <strong>con</strong>siderata come negli altri calcoli ma,mentre per gli altri tale eliminazione avviene in modo implicito a causa del fatto che<strong>la</strong> posizione coincide, deve essere fatta in modo esplicito implementando un modo perri<strong>con</strong>oscere quando si sta <strong>con</strong>siderando <strong>la</strong> particel<strong>la</strong> in esame ed eliminar<strong>la</strong>.4.5 Metodi di scrittura dei f<strong>il</strong>eInnanzitutto vi è <strong>il</strong> problema del<strong>la</strong> dimensione di tali f<strong>il</strong>e in quanto <strong>il</strong> parallelismopermette di gestire una quantità maggiore di informazioni che quindi possono superare<strong>la</strong> capacità di un singolo f<strong>il</strong>e. Per tale motivo viene data <strong>la</strong> possib<strong>il</strong>ità all’utente didecidere in quante parti un f<strong>il</strong>e debba essere diviso (NumberOfF<strong>il</strong>es, si veda 4.7 a pag.39 per maggiori dettagli). Questo permette anche una parallelizzazione nel<strong>la</strong> scritturain quanto su f<strong>il</strong>e diversi è possib<strong>il</strong>e una scrittura simultanea per quanto riguarda <strong>il</strong>programma, ovviamente demandando <strong>il</strong> problema al sistema operativo.Esistono poi due tipi di f<strong>il</strong>e scritti dal programma:• f<strong>il</strong>e di restart che <strong>con</strong>tiene tutti i dati re<strong>la</strong>tivi al<strong>la</strong> simu<strong>la</strong>zione in corso e permette<strong>il</strong> riavvio in caso di problemi• snapshot che <strong>con</strong>tiene un sottoinsieme dei dati del<strong>la</strong> simu<strong>la</strong>zione necessari perle e<strong>la</strong>borazioni a posteriori e in grado anch’esso di permettere <strong>il</strong> riavvio di unasimu<strong>la</strong>zione.Dato che, come si è già detto nel<strong>la</strong> Sez. 3.3.2 a pag. 24, si è dovuto procedere in mododiverso nel<strong>la</strong> gestione dei due tipi dati i diversi vincoli che su essi erano presenti diseguito si analizzano le metodologie impiegate nel<strong>la</strong> scrittura e r<strong>il</strong>ettura di tali f<strong>il</strong>e.4.5.1 F<strong>il</strong>e di restartPer questi f<strong>il</strong>e è stato deciso di far scrivere ad ogni processore <strong>la</strong> sezione di suacompetenza. Ciò principalmente per due motivi:1. <strong>la</strong> quantità di dati scritta è notevole in quanto tutte le informazioni <strong>con</strong>tenute inmemoria sulle particelle vanno scritte,


34 Modifiche al codice Cap. 4P 0HeaderDati P0P 1Dati P1P 2Dati P2P 3Dati P3Figura 4.5: Procedura di salvataggio di un f<strong>il</strong>e di restart2. i dati re<strong>la</strong>tivi ad un processore sono scritti in posizioni <strong>con</strong>tigue del f<strong>il</strong>e dato cheè stato possib<strong>il</strong>e modificarne <strong>la</strong> struttura come già detto nel<strong>la</strong> Sez. 3.2.2 a pag.18.Tale metodo di procedere ha <strong>il</strong> vantaggio che non si ha <strong>il</strong> problema di dover far transitarei dati da un processore ad un altro come nel caso in cui uno solo scriva tutto.Inoltre nel passaggio dei dati si dovrebbe affrontare <strong>il</strong> problema di dati diversi tra d<strong>il</strong>oro, infatti ci sono interi, reali e booleani a diverse precisioni.In Figura 4.5 si può vedere graficamente come avviene <strong>la</strong> scrittura.Un in<strong>con</strong>veniente che è stato in<strong>con</strong>trato è che nel<strong>la</strong> versione 1.2 di MPI presentenel sistema non sono implementate le routine di gestione paralle<strong>la</strong> dei f<strong>il</strong>e per cui èstato necessario effettuar<strong>la</strong> manualmente serializzando le scritture effettuate dai diversiprocessori. In tale compito è stato ut<strong>il</strong>e poter ut<strong>il</strong>izzare una struttura già esistente nelcodice sequenziale per gestire i f<strong>il</strong>e in formato binario al<strong>la</strong> quale sono state apportatealcune modifiche per permettere l’interazione su uno stesso f<strong>il</strong>e di più processi diversi.


Sez. 4.5 Metodi di scrittura dei f<strong>il</strong>e 35La struttura modificata del f<strong>il</strong>e di restart risulta essere <strong>la</strong> seguente:⎧Variab<strong>il</strong>i di simu<strong>la</strong>zione⎪⎨ Numero particelle processore 0Dati di validità generale.⎪⎩⎧Numero particelle processore n-1⎨ Dominio di competenza proc. 0Dati processore 0 Informazioni materia oscura proc. 0⎩Informazioni materia barionica proc. 0Altri processoriDati processore n-1⎧.⎨ Dominio di competenza proc. n-1Informazioni materia oscura proc. n-1⎩Informazioni materia barionica proc. n-1Per <strong>la</strong> r<strong>il</strong>ettura di questo f<strong>il</strong>e per <strong>il</strong> riavvio si procede allo stesso modo andandoa leggere i dati globali all’inizio del f<strong>il</strong>e, spostandosi poi nel<strong>la</strong> zona di propriacompetenza per leggere tutti gli altri dati.4.5.2 SnapshotPer gli snapshot è stata invece ut<strong>il</strong>izzata una tecnica diversa di scrittura dovutaprincipalmente al vincolo sul<strong>la</strong> struttura di tale f<strong>il</strong>e che qui si riporta:⎧HeaderPosizioni⎪⎨VelocitàMateria oscura e gasPotenzialiID ⎪⎩⎧ Masse (di alcune)⎨ Energia specificaSolo gas (se c’è) Densità⎩Cooling (opzionale)Ut<strong>il</strong>izzare <strong>la</strong> stessa tecnica usata per i f<strong>il</strong>e di restart risulta molto diffic<strong>il</strong>e data <strong>la</strong>notevole frammentazione dei dati scritti da un processore all’interno del f<strong>il</strong>e. Per talemotivo è stata in questo caso scelta <strong>la</strong> soluzione di un unico processo che scrive <strong>il</strong> f<strong>il</strong>ee tutti gli altri inviano i dati a lui, come si può vedere in Figura 4.6. Inoltre per questif<strong>il</strong>e si ha una maggiore omogeneità di dati in quanto sono tutti reali o al più interi, macomunque tutti del<strong>la</strong> stessa dimensione.Dato che viene scritto più di un f<strong>il</strong>e per ognuno di essi esisterà un processore dedicatoal<strong>la</strong> scrittura. Tale meccanismo non rappresenta un collo di bottiglia significativoper <strong>il</strong> sistema poiché <strong>il</strong> tempo impiegato per <strong>la</strong> scrittura è re<strong>la</strong>tivamente piccolo rispettoal totale.Come spiegato in precedenza nel<strong>la</strong> Sez. 3.3.2 a pag. 24, è stato poi aggiunto unf<strong>il</strong>e che raccoglie le informazioni non presenti nello snapshot e necessarie al riavvio


36 Modifiche al codice Cap. 4InfoP 0dati generali(quantità, domini)P 1dati delleparticelleSnapshotparte 1P 2P 3dati delleparticelleSnapshotparte 2Figura 4.6: Procedura di salvataggio di uno snapshot


Sez. 4.6 Modifiche al<strong>la</strong> struttura modu<strong>la</strong>re 37di simu<strong>la</strong>zione. Tale f<strong>il</strong>e è unico per tutti gli snapshot creati durante <strong>la</strong> simu<strong>la</strong>zione inquanto di piccole dimensioni. Come si può vedere dallo schema seguente, in esso sonopresenti le particelle possedute da ciascun processore e <strong>il</strong> dominio di competenza diciascuno.{ Numero di processori nel<strong>la</strong> simu<strong>la</strong>zioneDati globali⎧ Numero di processori per f<strong>il</strong>eNumero snapshot⎪⎨ Quantità particelle e domini proc. 0Snapshot 1Altri snapshotSnapshot k⎪⎩⎪⎩.Quantità particelle e domini proc. n-1⎧.Numero snapshot⎪⎨ Quantità particelle e domini proc. 0.Quantità particelle e domini proc. n-1Tale f<strong>il</strong>e viene scritto da uno solo dei processori (processore 0) <strong>il</strong> quale raccoglie leinformazioni re<strong>la</strong>tive a tutti gli altri.In Figura 4.6 si può vedere anche <strong>la</strong> scrittura del f<strong>il</strong>e di info da parte del processore0.Per quanto riguarda <strong>il</strong> riavvio <strong>il</strong> processore 0 va a copiare tutti i dati re<strong>la</strong>tivi aglisnapshot precedenti a quello di riavvio in un nuovo f<strong>il</strong>e e poi comunica a tutti gli altri<strong>il</strong> dominio e quante particelle competono a ciascuno di essi. A questo punto ognunova a leggere <strong>il</strong> f<strong>il</strong>e <strong>con</strong>tenente i suoi dati e a caricare ciò che gli serve.4.6 Modifiche al<strong>la</strong> struttura modu<strong>la</strong>reRispetto a quanto riportato in [Favaretto, 6, pp. 54 e seg.] (a cui si rimanda perulteriori dettagli) sono state apportate poche modifiche al<strong>la</strong> struttura dei moduli.Principalmente è stato aggiunto un nuovo modulo chiamato “domain_m” <strong>il</strong> cuicompito è quello di gestire i domini, ossia <strong>il</strong> rib<strong>il</strong>anciamento del carico e <strong>la</strong> ridefinizionedei domini come spiegato nel<strong>la</strong> Sez. 3.3 a pag. 18 e seguenti. Tale modulo va adut<strong>il</strong>izzare le variab<strong>il</strong>i globali di sistema <strong>con</strong>tenute nei diversi moduli:• GLOBAL_m per le definizioni delle strutture dati più generali,• BH_force_m per le definizioni degli alberi e• TI_timeline_m per le definizioni del<strong>la</strong> timeline per gestire l’aggiornamento parzialedelle particelle.Viene poi ut<strong>il</strong>izzato so<strong>la</strong>mente all’interno del ciclo di “run” per le chiamate alle sueroutine.


38 Modifiche al codice Cap. 4Figura 4.7: Schema delle inclusioni dei moduli


Sez. 4.7 Modifiche al f<strong>il</strong>e dei parametri 39Un’altra modifica alle inclusioni è stata l’aggiunta dei TI_predict_m all’internodi SPH_neighbour_m. Ciò è stato fatto perché nel<strong>la</strong> ricerca dei vicini dovendo iterarepiù volte sulle stesse particelle per trovare <strong>il</strong> raggio corretto (si veda Sez. 4.4 apag. 30), viene modificata <strong>la</strong> lista delle particelle da aggiornare ed è perciò necessarioripristinar<strong>la</strong> una volta finita <strong>la</strong> ricerca.In figura 4.7, ripresa da [Favaretto, 6, pp. 54], si può vedere <strong>la</strong> struttura preesistentedei moduli modificata <strong>con</strong> le aggiunte sopra elencate.4.7 Modifiche al f<strong>il</strong>e dei parametriLe modifiche riguardanti <strong>il</strong> f<strong>il</strong>e dei parametri sono delle aggiunte ai parametri preesistentie reperib<strong>il</strong>i in [Favaretto, 6, appendice B]. Tali aggiunte sono elencate nel<strong>la</strong>tabel<strong>la</strong> seguente:Parametro Valore di default DescrizioneNumberOfF<strong>il</strong>es 1DomainDecompFrequency 0.2Imba<strong>la</strong>nceTolerance 0.05ExchangePartTolerance 0.05CommSize 4Il numero di parti in cui vienespezzato ogni f<strong>il</strong>e durante<strong>la</strong> scrittura, sia di restart chesnapshotIndica quanti calcoli di forze devonoessere fatti prima di ridecomporrei domini. Sarebbe benefosse un multiplo di TreeUpdatingLimitin modo da non sprecaretempo per ricostruire un alberose poi vanno ridecomposti idominiIndica di quanto devono discostarsitra di loro i tempi re<strong>la</strong>tivi aidue blocchi del taglio perché vengaeseguito <strong>il</strong> rib<strong>il</strong>anciamento sudi essiIndica <strong>la</strong> precisione <strong>con</strong> cui individuare<strong>il</strong> numero di particelle dainviare dall’altra parte del taglioquando si è deciso di rib<strong>il</strong>anciareLa dimensione del buffer di comunicazioneglobale espressa inMB


40 Modifiche al codice Cap. 4SPHNeighbousDeviation 2MemoryFactor 2Indica di quanto può discostarsi<strong>il</strong> numero di vicini individuatoda un raggio durante <strong>la</strong> ricercada quello desiderato perché <strong>la</strong>ricerca terminiIl fattore di allocazione del<strong>la</strong> memoria,esprime di quante volte<strong>la</strong> memoria allocata è sovradimensionataper compensare glisb<strong>il</strong>anciamenti di carico


Capitolo 5PrestazioniDato che sul codice non sono state effettuate operazioni di ottimizzazione e vi sonoanche delle scelte non presenti in letteratura come <strong>la</strong> decisione di rendere <strong>il</strong> rib<strong>il</strong>anciamentodel carico totalmente dinamico, <strong>il</strong> codice presenta ancora delle imperfezioni dasistemare, pertanto non sono stati fatti numerosi test per valutarne le prestazioni.I test qui presenti hanno lo scopo di valutare ad un primo stadio se le scelte effettuatee l’implementazione attuale sono validi nel loro complesso ossia se sono promettentiper dare buoni risultati.Per quanto detto i test sono stati effettuati <strong>con</strong> un solo processore ut<strong>il</strong>izzando <strong>il</strong>programma sequenziale di partenza per questa <strong>tesi</strong>, <strong>con</strong> quattro e <strong>con</strong> otto processori,non sono state fatte invece <strong>con</strong> un maggior numero di processori. Esistono infattiancora delle instab<strong>il</strong>ità negli algoritmi da aggiustare.Tutte le simu<strong>la</strong>zioni sono state effettuate su una macchina IBM RS/6000 SP <strong>con</strong> 4nodi da 4 processori ciascuno, processori Power3-II da 375MHz <strong>con</strong> 8MB di cache L2ciascuno e 2GB di ram per nodo acquistata di recente dal Dipartimento di Elettronicae Informatica del<strong>la</strong> Facoltà di Ingegneria di Padova (per ulteriori informazioni sul<strong>la</strong>macchina o sul<strong>la</strong> sua <strong>con</strong>figurazione si rimanda a [Benini, 5] e [Mazzon, 4]).Nota: <strong>il</strong> tempo “Totale” per <strong>il</strong> programma parallelo è sempre riferito al<strong>la</strong> sommadei tempi impiegati da tutti i processori coinvolti nel<strong>la</strong> simu<strong>la</strong>zione.Tutti i test derivano da una simu<strong>la</strong>zione di una porzione significativa di universo abassa risoluzione eseguita in passato. Su di essa sono state individuate delle zone incui si sono formati degli ammassi di ga<strong>la</strong>ssie. A questo punto partendo dalle stesse<strong>con</strong>dizioni iniziali sono state sostituite alcune particelle a bassa risoluzione <strong>con</strong> dellealtre a risoluzione molto più elevata per poter andare a studiare più in dettaglio <strong>la</strong>formazione di queste partico<strong>la</strong>ri strutture.Le <strong>con</strong>dizioni iniziali descrivono quindi tutte una sfera di circa 700 Mpc di diametro<strong>con</strong>tenente una buona prozione di universo a bassa risoluzione e al cui interno sitrova una zona di circa 50 Mpc ad alta risoluzione che andrà a formare le strutture inesame.Il primo test effettuato riguarda l’analisi di un singolo ammasso di ga<strong>la</strong>ssie centratonel<strong>la</strong> sfera di simu<strong>la</strong>zione <strong>con</strong> 75000 particelle ad alta risoluzione e 49000 a bassarisoluzione da redshift (vedi glossario) z=35 a z=0. Nel<strong>la</strong> tabel<strong>la</strong> 5.1 si possono vedere


42 Prestazioni Cap. 5Monoprocessore 4 processori 8 processoriTotale (s) Rel. (%) Totale (s) Rel. (%) Totale (s) Rel. (%)Totale 49641 100.0 55643 100.0 59713 100.0Potenziale 4822 9.7 4795 8.6 4608 7.7Gravitazionale 39863 80.3 39039 70.2 40694 68.2Costruzione tree 4243 8.5 5020 9.0 2754 4.6Decomposizione 1013 1.8 1077 1.8Comunicazioni 137 0.2 887 1.5Sb<strong>il</strong>anciamento 4646 8.3 7344 12.3Varie ∼600 1.2 ∼600 1.1 ∼700 1.2Tabel<strong>la</strong> 5.1: Risultati del<strong>la</strong> simu<strong>la</strong>zione <strong>con</strong> solo materia oscura di un ammasso diga<strong>la</strong>ssie ad alta risoluzione e un <strong>con</strong>torno a bassa risoluzioneMonoprocessore 4 processori 8 processoriTotale (s) Rel. (%) Totale (s) Rel. (%) Totale (s) Rel. (%)Totale 192402 100.0 216175 100.0 218133 100.0Potenziale 17249 9.0 17511 8.1 17291 7.9Gravitazionale 151038 78.5 143210 66.2 146723 67.3Costruzione tree 20265 10.5 39626 18.3 28684 13.1Decomposizione 6234 2.9 4783 2.2Comunicazioni 393 0.2 2412 1.1Sb<strong>il</strong>anciamento 6710 3.1 12558 5.8Varie ∼2450 1.3 ∼2600 1.2 ∼2500 1.2Tabel<strong>la</strong> 5.2: Risultati del<strong>la</strong> simu<strong>la</strong>zione <strong>con</strong> solo materia oscura di due ammassi diga<strong>la</strong>ssie ad alta risoluzione e un <strong>con</strong>torno a bassa risoluzionea <strong>con</strong>fronto i vari tempi impiegati nel<strong>la</strong> varie zone del codice <strong>con</strong> a fianco le percentualirispetto al totale.Nel<strong>la</strong> tabel<strong>la</strong> 5.2 invece si possono vedere a <strong>con</strong>fronto i tempi impiegati per simu<strong>la</strong>rel’evoluzione di due ammassi di ga<strong>la</strong>ssie ad alta risoluzione descritte usando369000 particelle e un <strong>con</strong>torno a bassa risoluzione sempre <strong>con</strong> 49000 particelle, <strong>il</strong>tutto sempre centrato nel<strong>la</strong> sfera <strong>con</strong> intervallo temporale da z=35 a z=0. Entrambequeste prime due simu<strong>la</strong>zioni <strong>con</strong>tengono solo elementi di materia oscura, quindisenza materia barionica e forze idrodinamiche.Nel<strong>la</strong> voce “Varie” vengono raggruppate tutte quelle e<strong>la</strong>borazioni che richiedonoun ridotto ammontare di calcolo quali l’avanzamento delle particelle, <strong>la</strong> loro predizionemediante linearizzazione e <strong>la</strong> scrittura di f<strong>il</strong>e.Si può vedere come per entrambe queste simu<strong>la</strong>zioni <strong>il</strong> tempo aggiuntivo introdottonel<strong>la</strong> decomposizione, dalle comunicazioni e dallo sb<strong>il</strong>anciamento del carico tra i variprocessori raggiunge un massimo del 15% nel<strong>la</strong> prima simu<strong>la</strong>zione <strong>con</strong> 8 processori edel 10% nel<strong>la</strong> se<strong>con</strong>da <strong>con</strong> un numero più elevato di particelle.Per quanto riguarda le forze gravitazionali o <strong>il</strong> calcolo del potenziale si notanoaddirittura delle riduzioni del tempo impiegato per eseguire i calcoli ut<strong>il</strong>izzando <strong>la</strong> versioneparalle<strong>la</strong>. Molto più variab<strong>il</strong>e risulta invece <strong>la</strong> costruzione degli alberi risultando


43Monoprocessore 4 processori 8 processoriTotale (s) Rel. (%) Totale (s) Rel. (%) Totale (s) Rel. (%)Totale 71668 100.0 112420 100.0 126154 100.0Idrodinamica 12750 17.8 12425 11.0 15183 12.0Potenziale 4287 6.0 7216 6.4 6991 5.5Gravitazionale 43559 60.8 49069 43.6 50144 39.7Costruzione tree 9776 13.6 29664 26.4 19734 15.6Decomposizione 1072 1.0 1505 1.2Comunicazioni 410 0.4 3913 3.1Sb<strong>il</strong>anciamento 7564 6.7 23422 18.5Ricerca dei vicini 3887 3.5 4706 3.7Varie ∼1000 1.4 ∼1000 0.9 ∼900 0.7Tabel<strong>la</strong> 5.3: Risultati del<strong>la</strong> simu<strong>la</strong>zione di un ammasso di ga<strong>la</strong>ssie ad alta risoluzionedescritto sia <strong>con</strong> materia oscura che <strong>con</strong> materia barionica cir<strong>con</strong>dato da materia oscuraa bassa risoluzionemolto migliore nel<strong>la</strong> prima simu<strong>la</strong>zione e molto peggiore nel<strong>la</strong> se<strong>con</strong>da.Per quanto riguarda <strong>la</strong> sca<strong>la</strong>b<strong>il</strong>ità nel passaggio dal sequenziale al parallelo si puònotare che passando a quattro processori <strong>il</strong> tempo totale 1 cresce del 12% circa mentrenel passaggio a otto processori l’incremento risulta del 20% nel primo caso e del 13%nel se<strong>con</strong>do.Tali risultati sono incoraggianti per <strong>il</strong> <strong>con</strong>tinuamento dello sv<strong>il</strong>uppo del codice infavore del<strong>la</strong> parallelizzazione.Nel<strong>la</strong> tabel<strong>la</strong> 5.3 invece viene presentata una simu<strong>la</strong>zione <strong>con</strong>tenente anche del<strong>la</strong>materia barionica <strong>con</strong> quindi le forze idrodinamiche. In partico<strong>la</strong>re si tratta del<strong>la</strong> stessasimu<strong>la</strong>zione di un singolo ammasso di ga<strong>la</strong>ssie effettuata nel primo test in cui sono stateaggiunte delle particelle di gas in corrispondenza delle particelle di materia oscura adalta risoluzione. Qui <strong>la</strong> simu<strong>la</strong>zione è stata svolta da z=35 a z=0.5 .Qui <strong>con</strong> l’aggiunta delle particelle di gas i tempi peggiorano sensib<strong>il</strong>mente, in partico<strong>la</strong>reper lo sb<strong>il</strong>anciamento che passa al 18% del totale per <strong>il</strong> caso <strong>con</strong> otto processori.Qui <strong>il</strong> peggioramento nel passaggio dal programma sequenziale al parallelo risulta del76% nel caso a otto processori.Da quest’ultima simu<strong>la</strong>zione si può vedere come sia ancora necessario stab<strong>il</strong>iremeglio le strategie di rib<strong>il</strong>anciamento per ridurre <strong>il</strong> tempo inut<strong>il</strong>izzato nell’attesa tra iprocessori.Sempre buono risulta invece <strong>il</strong> tempo ut<strong>il</strong>izzato per effettuare <strong>la</strong> decomposizionedei domini validando l’ipo<strong>tesi</strong> che ut<strong>il</strong>izzare un metodo differenziale per rib<strong>il</strong>anciare <strong>il</strong>carico è promettente.Un’altra cosa che risulta da questi test è che <strong>il</strong> tempo ut<strong>il</strong>izzato nel<strong>la</strong> ricostruzionedegli alberi risulta generalmente maggiore nel programma parallelo indicando chesono effettuate più ricostruzioni degli alberi. Questo spinge verso <strong>la</strong> ricerca di quandovengono fatte queste ricostruzioni aggiuntive in modo da ridurne l’impatto sulleprestazioni.1 si ricorda che <strong>il</strong> tempo totale è sempre dato dal<strong>la</strong> somma dei tempi impiegati da tutti i processori


44 Prestazioni Cap. 5Viene infine riportata un’immagine (Figura 5.1), generata a partire dal<strong>la</strong> simu<strong>la</strong>zionedi due ga<strong>la</strong>ssie ad alta risoluzione <strong>con</strong> so<strong>la</strong> materia oscura (se<strong>con</strong>da simu<strong>la</strong>zione),raffigurante <strong>il</strong> sistema a redshift zero, ossia allo stato finale.


Figura 5.1: Immagine a redshift zero di una simu<strong>la</strong>zione <strong>con</strong> due ammassi di ga<strong>la</strong>ssiead alta risoluzione <strong>con</strong> so<strong>la</strong> materia oscura45


46 Prestazioni Cap. 5


Capitolo 6ConclusioniLa parallelizzazione di un codice richiede uno studio approfondito del codice originalee successivamente di effettuare scelte sulle strategie ut<strong>il</strong>izzab<strong>il</strong>i per distribuire<strong>il</strong> <strong>la</strong>voro tra i processori coinvolti. In questo <strong>la</strong>voro si è analizzato un codice ut<strong>il</strong>izzatoper <strong>la</strong> simu<strong>la</strong>zione di sistemi fisici avente lo scopo di ricerca scientifica in ambito cosmologico.Sono stati <strong>con</strong>siderati gli algoritmi ut<strong>il</strong>izzati in tale codice e le modificheapportate per renderlo parallelo. Il risultato è un codice funzionante su cui sono statefatte delle simu<strong>la</strong>zioni di prova.Sono state fatte scelte nuove per <strong>il</strong> tipo di codice e<strong>la</strong>borato come <strong>la</strong> gestione delrib<strong>il</strong>anciamento mediante un algoritmo dinamico che va a minimizzare <strong>la</strong> differenza ditempo ut<strong>il</strong>izzato dai diversi processori per svolgere <strong>il</strong> loro <strong>la</strong>voro.Il <strong>la</strong>voro non è tuttavia finito in quanto è necessario procedere sia ad una ottimizzazionedel codice andando ad analizzare più a livello macchina <strong>il</strong> suo comportamento,sia ad un raffinamento delle tecniche di definizione dei domini per aumentare le prestazionirispetto al<strong>la</strong> sca<strong>la</strong>b<strong>il</strong>ità e allo stesso tempo evitare l’istaurarsi di anomalie o diosc<strong>il</strong><strong>la</strong>zione di particelle tra i processori durante <strong>la</strong> simu<strong>la</strong>zione.


48 Conclusioni Cap. 6


Appendice AGlossarioAAstrofisica Disciplina che studia <strong>la</strong> fisica oggetti astronomici come le stelle e le ga<strong>la</strong>ssie.BBarioni vedi Materia barionica.Big Bang Il modello del Big Bang prevede un universo in espansione a partire da unpunto iniziale estremamente caldo e denso. L’istante iniziale è chiamato “grandeesplosione” o “Big Bang”.CCluster (o ammasso di ga<strong>la</strong>ssie) Le più grandi strutture cosmiche gravitazionalmentelegate. Sono composte da almeno un centinaio di ga<strong>la</strong>ssie, gas e materiaoscura.Condizioni iniziali Insieme di dati necessari per definire l’universo alle sue originie permettere quindi l’esecuzione di una simu<strong>la</strong>zione. Esse <strong>con</strong>tengono una descrizionedel fluido primordiale piccole fluttuazioni al suo interno (vedi Originedell’universo).Conservazione Si dice di quantità (carica elettrica, energia, quantità di moto...) cherimane costante nel tempo.Cosmologia Parte dell’astrofisica che si occupa del<strong>la</strong> formazione ed evoluzione dell’universo.DDoppler, effetto Effetto che causa <strong>il</strong> cambiamento di frequenza delle onde emesse daun oggetto in movimento rispetto ad un altro e permette di misurare <strong>la</strong> velocitàdi allontanamento o avvicinamento dei due oggetti. Si può ris<strong>con</strong>trare nelle


50 Glossario Appendice AGonde sonore, come ad esempio una sirena che passa, o nel<strong>la</strong> luce delle ga<strong>la</strong>ssienell’universo in espansione.Ga<strong>la</strong>ssie Sistema legato gravitazionalmente <strong>con</strong>tenente vari m<strong>il</strong>iardi di stelleGas vedi Materia barionicaHHubble, costante di L’universo osservab<strong>il</strong>e è ritenuto uniforme in tutto le direzione ein espansione. Questa espansione è descrivib<strong>il</strong>e per mezzo di un solo parametro.La costante di Hubble è data dal<strong>la</strong> velocità media di allontanamento di dueregioni qualsiasi dell’universo divise per <strong>la</strong> distanza che le separa.IInterazione La forza esercitata reciprocamente da due particelle soggette ad un qualchecampo, quale ad esempio <strong>il</strong> campo gravitazionale.JJob, f<strong>il</strong>e di F<strong>il</strong>e di testo <strong>con</strong>tenente le direttive per <strong>la</strong> richiesta a LoadLeveler (vedi) dirisorse di calcolo.LLoadLeveler Sistema di gestione ut<strong>il</strong>izzato su un multiprocessore per allocare i <strong>la</strong>voridegli utenti sui vari processori disponib<strong>il</strong>i distribuendo <strong>il</strong> carico in modoottimale.MMateria barionica Particelle pesanti che costituis<strong>con</strong>o <strong>la</strong> materia visib<strong>il</strong>e dell’universo.Questa materia è composta principalmente da idrogeno ed elio <strong>con</strong> tracce dialtri materiali pesanti. Spesso i termini materia barionica e gas vengono ut<strong>il</strong>izzaticome sinonimi, anche se non è propriamente corretto.Materia oscura Materia esistente nello spazio ma non visib<strong>il</strong>e a noi perché non emettealcuna radiazione che <strong>la</strong> renda osservab<strong>il</strong>e. La sua esistenza viene data dalleleggi di gravitazione per spiegare <strong>il</strong> movimento delle stelle attorno ai centri dimassa delle ga<strong>la</strong>ssie a cui appartengono. Si presume che circa <strong>il</strong> 90% del<strong>la</strong>materia sia oscura e che tale materia si estenda anche tra le ga<strong>la</strong>ssie.MPI Message Passing Interface. È lo standard definito dall’omonimo Forum per <strong>la</strong>costruzione di un’interfaccia di comunicazione basata sul paradigma “messagepassing” che sia pratica, portab<strong>il</strong>e, efficiente e flessib<strong>il</strong>e.


51Multiprocessore Sistema al cui interno si trovano più processori, ut<strong>il</strong>izzato per distribuire<strong>il</strong> carico su di essi in modo da diminuire <strong>il</strong> tempo di attesa per ottenere irisultati finali.OOrigine dell’universo La teoria attuale sostiene che nell’universo subito dopo <strong>il</strong> BigBang (vedi) si sono formate delle piccole fluttuazioni di densità tali da causare,sotto l’effetto del<strong>la</strong> gravità del fluido stesso, delle grosse disomogeneitàosservate oggi nel<strong>la</strong> struttura visib<strong>il</strong>e dell’universo.PParsec Unità di distanza (simbolo pc), pari a circa 3,26 anni luce. È usata per <strong>il</strong> calcolodelle distanze in ambito cosmologico, di solito i suoi multipli kpc e Mpc.Particel<strong>la</strong> Nel nostro programma un qualsiasi corpo dotato di massa che entra nel<strong>la</strong>simu<strong>la</strong>zione.Processo Un programma o comando che va effettivamente in esecuzione sul<strong>la</strong> macchinaed esegue <strong>il</strong> <strong>la</strong>voro cui è destinato.RRedshift Spostamento verso <strong>il</strong> rosso nel<strong>la</strong> luce emessa da ga<strong>la</strong>ssie lontane. Esso ècausato dall’effetto Doppler (vedi) per cui è funzione del<strong>la</strong> velocità re<strong>la</strong>tiva tradue ga<strong>la</strong>ssie. Poiché l’universo è in <strong>con</strong>tinua espansione dal momento del BigBang (vedi), dal<strong>la</strong> teoria si sa che le ga<strong>la</strong>ssie a noi più lontane si muovono <strong>con</strong>velocità re<strong>la</strong>tiva maggiore e <strong>la</strong> luce che da loro ci giunge proviene da istantitemporali più remoti. Pertanto in cosmologia per indicare <strong>il</strong> tempo si usa <strong>il</strong>redshift.SSnapshot F<strong>il</strong>e generati dal programma durante una simu<strong>la</strong>zione rappresentanti dellevere e proprie fotografie del sistema simu<strong>la</strong>to, sono usati per analisi postsimu<strong>la</strong>zione,permettono inoltre <strong>il</strong> riavvio del<strong>la</strong> simu<strong>la</strong>zione.SP IBM RS/6000 SP. Sistema sca<strong>la</strong>b<strong>il</strong>e organizzato in varie <strong>con</strong>figurazioni che fornisceun sistema di calcolo multiprocessore ad elevata potenza.Submit Operazione <strong>con</strong> <strong>la</strong> quale un f<strong>il</strong>e di job viene sottoposto a LoadLeveler perl’esecuzione.


52 Glossario Appendice A


Appendice BUt<strong>il</strong>izzo del codiceDato che <strong>il</strong> codice parallelo richiede un’architettura partico<strong>la</strong>re a multiprocessore eun sistema di gestione per l’ut<strong>il</strong>izzo efficiente di tali risorse. Sul<strong>la</strong> macchina ut<strong>il</strong>izzataper effettuare i test è presente come allocatore LoadLeveler (per ulteriori informazionisi rimanda a [LoadLeveler, 3]).Qui verranno <strong>il</strong>lustrate le procedure per avviare <strong>il</strong> nostro programma sotto taleallocatore.Innanzitutto è necessario creare <strong>il</strong> f<strong>il</strong>e dei parametri per <strong>la</strong> simu<strong>la</strong>zione che si intendeeseguire come per <strong>il</strong> programma sequenziale <strong>con</strong> l’aggiunta dei parametri indicatinel<strong>la</strong> Sez. 4.7 a pag. 39. Successivamente è necessario creare un “f<strong>il</strong>e di job” dasottomettere al LoadLeveler per <strong>con</strong>sentirgli di eseguire <strong>il</strong> nostro programma.Un tale f<strong>il</strong>e può avere <strong>la</strong> struttura seguente:#@ job_name = inSPHector#@ job_type = parallel#@ environment = MP_SHARED_MEMORY=yes#@ node_usage = NOT_SHARED#@ c<strong>la</strong>ss = long#@ blocking = 4#@ error = /ext/F<strong>il</strong>ippo/pardark1/error.txt#@ output = /ext/F<strong>il</strong>ippo/pardark1/out.txt#@ network.MPI = css0, , US#@ total_tasks = 8#@ queue/home/gioachin/F-Sph /home/gioachin/dark1.paramCon tale f<strong>il</strong>e andiamo a chiedere al LoadLeveler di allocarci un programma su ottoprocessori (total_task) ut<strong>il</strong>izzando 4 processori per ogni nodo (blocking) in modoesclusivo (node_usage). Questo evita che possano essere allocati altri programmi suinodi che stiamo usando, sappiamo che ci sono 4 processori per nodo e li vogliamousare in esclusiva.


54 Ut<strong>il</strong>izzo del codice Appendice BChiediamo poi di ut<strong>il</strong>izzare lo switch ad alte prestazioni per effettuare le comunicazionitra i nodi (network.MPI) e di usare invece <strong>la</strong> Shared_Memory per le comunicazioniall’interno dello stesso nodo (environment).Dichiariamo poi che <strong>il</strong> nostro programma è parallelo (job_type) e che necessita d<strong>il</strong>unghi tempi di calcolo (c<strong>la</strong>ss) e chiediamo che i f<strong>il</strong>e di output e di error siano salvatidove desiderato (output e error), è buona norma che questi si trovino nel<strong>la</strong> stessadirectory indicata nel f<strong>il</strong>e dei parametri per salvare gli altri f<strong>il</strong>e del<strong>la</strong> simu<strong>la</strong>zione inmodo da averli tutti assieme.Infine andiamo ad accodare <strong>il</strong> job appena creato (queue).L’ultima riga serve perché l’eseguib<strong>il</strong>e è per default <strong>il</strong> f<strong>il</strong>e che <strong>con</strong>tiene <strong>il</strong> f<strong>il</strong>e di jobe in questo modo andiamo a chiedere di eseguire su tutti i processori <strong>il</strong> programma danoi voluto: ossia <strong>la</strong> nostra simu<strong>la</strong>zione.Per avere <strong>la</strong> descrizione di tutti i comandi ut<strong>il</strong>izzati e di tutti gli altri disponib<strong>il</strong>i sirimanda a [LoadLeveler, 3].In seguito è necessario chiedere a LoadLeveler di far partire <strong>il</strong> nostro programmaparallelo mediante <strong>il</strong> seguente comando:gioachin@spnd01:~$ llsubmit dark1.jobdove dark1.job è <strong>il</strong> f<strong>il</strong>e prima creato e al quale LoadLeveler risponde <strong>con</strong> <strong>il</strong> seguentemessaggio se tutto è andato correttamente:llsubmit:The job “spnd01.470” has been submitted.Ora dobbiamo attendere che si liberino i processori che abbiamo richiesto e che <strong>il</strong>programma poi svolga <strong>il</strong> suo <strong>la</strong>voro.Per ulteriori informazioni su come amministrare poi <strong>il</strong> job appena sottomesso sirimanda a [Mazzon, 4].


Bibliografia[Aoyama, 1][MPI, 2]Y. Aoyama, J. Nakano, RS/6000 SP: Practical MPI <strong>Programming</strong>,ITSO (1999)MPI: A Message-Passing Interface Standard 1.1, University ofTennessee, Knoxv<strong>il</strong>le, 1995[LoadLeveler, 3] LoadLeveler 2.2: Using and Administering, IBM Corp., 2000[Mazzon, 4][Benini, 5][Favaretto, 6][Springel, 7][Lia, 8][Tormen, 9]P. Mazzon, Progetto di un Laboratorio per <strong>la</strong> Programmazione diMultiprocessori, Università di Padova, <strong>tesi</strong> di <strong>la</strong>urea, 2002D. Benini, Configurazione e messa in opera di un multiprocessoreIBM RS/6000 SP3, Università di Padova, <strong>tesi</strong> di <strong>la</strong>urea, 2002R. Favaretto, Ottimizzazione di un codice tree-sph, Università diVeneria, <strong>tesi</strong> di <strong>la</strong>urea, 2000V. Springel, N. Yoshida, S. D.M. White, GADGET: a code forcollisionless and gasdynamical cosmological simu<strong>la</strong>tions, NewAstronomy, Vol. 6, pp. 79-117, 2001C. Lia, G. Carraro, A <strong>Parallel</strong> Tree-SPH Code for Ga<strong>la</strong>xy Formation,MNRAS, Vol. 314, pp. 145-161, 2000G. Tormen, F. R. Bouchet, S. D. M. White, The structure and dynamicalevolution of dark haloes, MNRAS, Vol. 268, pp. 865-884,1997

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!