Fusione termonucleare controllata e High Performance Computing S. Briguglio e G. Vlad ENEA Frascati
Sommario La fusione nucleare La simulazione particle in cell (PIC) Il porting di un codice PIC su architetture parallele Risultati
La fusione nucleare 3.5 MeV Schema di reattore 14.1 MeV Il neutrone cede la sua energia a un mantello che circonda la camera calore raffreddamento ad acqua vapore turbina energia elettrica Vantaggi: combustibile quasi inesauribile; scarsa produzione di scorie rischio di fuga radioattiva trascurabile; sistema intrinsecamente sicuro
La fusione nucleare (segue ) D + T: repulsione elettrostatica a grandi distanze; attrazione nucleare a piccolissima distanza (10-15 m) Energia cinetica iniziale dei nucleoni molto alta Acceleratore? Non conviene Alta temperatura (>107 C): centro delle stelle B Contenimento? Nucleoni carichi: forza di Lorentz Solenoide campo magnetico E le pareti di fondo?
La fusione nucleare (segue ) Tokamak: тороидальная камера с магнитными катушками (camera toroidale con bobine magnetiche) JET: il più grande tokamak in attività
La fusione nucleare (segue ) Road map verso il reattore: riscaldare un gas (plasma) di deuterio-deuterio (corrente, microonde, fasci di particelle) idem, con deuterio-trizio (attivazione dei materiali, ma reazioni di fusione numerose) garantire che i nuclei di elio siano ben confinati e trasferiscano la loro energia al plasma spegnere il riscaldamento dall esterno e lasciare che siano i nuclei di elio a tener caldo il plasma (ignizione)
La fusione nucleare (segue ) Per tenere caldo il centro del plasma è necessario un trasporto di energia e di particelle ridotto Onde elettromagnetiche che si sviluppano nel plasma, però, incrementano il trasporto Risonanze tra onde elettromagnetiche e particelle cariche che viaggiano in fase con l onda: l onda cresce in ampiezza a spese dell energia della particella il campo elettromagnetico che così si produce trascina la particella verso il bordo del plasma
Le equazioni del sistema Funzione di distribuzione (densità nello spazio x,v) Equazione di Vlasov Forza su ciascuna particella Equazioni per i campi nel limite non relativistico: Eq. Coulomb Eq. Ampère
Perché l approccio computazionale? Tipiche semplificazioni per una trattazione analitica: limite perturbativo (la struttura del campo elettromagnetico è data; le particelle agiscono su di esso come una piccola perturbazione) limite fluido (le particelle sono caratterizzate da pochi parametri medi: densità, temperatura, etc.; non conta il loro comportamento individuale) limite lineare (si valuta solo il grado di stabilità di un equilibrio, non la sua evoluzione in caso di instabilità) Una conoscenza piena del comportamento del sistema richiede invece una trattazione auto-consistente (campi determinati dalle particelle; moto delle particelle determinato dai campi) cinetica (particelle con velocità diverse interagiscono con i campi in modo diverso: risonanze) non lineare (il confinamento delle particelle dipende da quanto i campi modificano le loro orbite: ampiezza di saturazione) approccio computazionale
La simulazione a particelle Discretizzazione: Eq. moto: Eq. campi:
Plasma numerico e plasma fisico Discretizzazione dello spazio fisico e dello spazio delle velocità: ciascuna particella rappresenta un gran numero di particelle fisiche con coordinate x,v in un intorno di x i,v i (macroparticella) Nota: è una scelta obbligata: in un Tokamak: circa 10 20 10 21 particelle per ciascuna particella occorre memorizzare 6 variabili real*8 (x,v) per descriverle tutte, occorrerebbero circa 10 13 Gbytes di memoria Discretizzazione del tempo: scelta obbligata, in mancanza di una soluzione esatta Quanto può essere lasca la discretizzazione? accuratezza (campionamento): molte macroparticelle in un volume ρ L 3 (lunghezza d onda tipica ρ L ) molti step temporali in un tempo 1/ω (frequenza tipica = ω ) vincoli più stringenti?
La soluzione più immediata: simulazione N-corpi Calcolo dei campi nel punto in cui si trova la macroparticella come sovrapposizione dei campi prodotti da ciascuna delle altre macroparticelle: Due problemi: il numero di operazioni per l evoluzione delle coordinate delle macroparticelle scala con N part 2 (con N part numero di macroparticelle) interazioni a piccole distanze
N-corpi (segue ) n particelle con carica e + rappresentate da una macroparticella con carica ne + : l interazione da lontano non è alterata l interazione da vicino può essere sovrastimata da lontano da vicino Condizione per curare il problema: molte macroparticelle in un volume λ 3 D (λ D =lunghezza di Debye) nota: λ D << ρ L vincolo molto più stringente del bisogno di accuratezza E n e + n e + 1 ne + 1 ne + E E E
Alternativa: particle in cell Benché le particelle si muovano nel continuo, il dominio spaziale viene suddiviso in celle (griglia)
Ciascuna particella distribuisce la propria densità di carica e di corrente ai vertici vicini: density computing ( N part ) I campi vengono calcolati solo sui vertici delle celle, in base alle densità di carica e di corrente: field solving ( N celle Log N celle ) Posizione e velocità di ciascuna particella sono ricalcolate in base ai campi nella posizione della particella, ottenuti da un interpolazione dei valori calcolati sui vertici vicini: pushing ( N part )
Vantaggi (rispetto all approccio N-corpi): Il numero delle operazioni scala con N part (anziché con N part2 ) L estrapolazione dei campi e la suddivisione di carica e corrente tra i vertici produce un taglio delle interazioni a distanza inferiore alla dimensione di una cella: le interazioni a piccola distanza, che con numeri ragionevoli di macroparticelle acquisterebbero un peso eccessivo, sono artificiosamente soppresse a parità di accuratezza, si guadagna un fattore (ρ L / λ D ) 3 10 4 nel numero N part richiesto
Struttura di un codice PIC: c call inizializza(x,field) do istep=1,nstep call pushing(field,x) call compute_density(x,density) call field_solver(density,field) enddo
Ancora guai: il problema degli alias Una griglia spaziale con celle di ampiezza Δx confonde perturbazioni con numero d onda k e k n =k+n(2π/δx): l una è vista come alias dell altra Il sistema presenta instabilità non fisiche (scompaiono per Δx 0) Ne deriva un limite superiore sul Δx tollerabile In un plasma confinato magneticamente, si riottiene Δx < λ D Δx x Problema analogo per Δt: Δt < ω p -1 (ω p = frequenza di plasma)
I fenomeni da investigare sono caratterizzati da scale di variazione molto più lente: 1/k ρ L 20 λ D 1/ω 1/ω 10 4 1/ω p Per sopprimere le instabilità non fisiche occorrerebbe una discretizzazione inutilmente fine: a fissata accuratezza N part più grande di un fattore (ρ L / λ D ) 3 10 4 n step più grande di un fattore (ω p / ω ) 3 10 4 CPU time più grande di un fattore 10 8 Soluzione: mediare le equazioni del moto rispetto alla girazione (rapida) intorno alle linee di campo (formalismo girocinetico) Risultato: si perde l informazione su ciò che succede su scale spaziotemporali brevi, ma si sopprimono le instabilità numeriche su quelle scale si può rilassare la risoluzione: Δx < ρ L Δt < 1/ω
Parallelizzazione di un codice PIC su architettura distributed memory Esigenze: Esplorare l effetto di perturbazioni di campo elettromagnetico su scale di ordine ρ L per macchine con dimensioni 10 2 ρ L Descrivere accuratamente (basso rumore numerico) la funzione di distribuzione nello spazio delle velocità (alto numero di particelle per cella) Problema di dimensioni medie: N celle 10 6 N particelle 10 2 10 3 N celle 10 8 10 9 N time-steps 10 4 N particelle >> N celle prioritaria la distribuzione dei carichi (memoria e calcolo) relativi alle particelle Due strategie possibili: decomposizione per particelle decomposizione per dominio
Decomposizione per particelle Ogni nodo vede tutto il dominio spaziale, ma solo una parte delle particelle
Decomposizione per dominio Ogni nodo vede solo una parte del dominio spaziale, e tutte le particelle che vi si trovano
Decomposizione per particelle Dominio replicato, particelle distribuite Pro: carichi perfettamente bilanciati nessuna migrazione di particelle da un nodo all altro implementazione relativamente semplice Contro: memoria relativa ai campi e alle densità replicata (la risoluzione massima ottenibile non scala perfettamente con N nodi ) necessaria una riduzione tra nodi delle densità (comunicazione: lo speed up non scala perfettamente con N nodi )
Scheletro del codice parallelo (MPI) c c c call MPI_Init(ierr) call MPI_Comm_size(MPI_COMM_WORLD, n_nodi, ierr) call MPI_Comm_Rank(MPI_COMM_WORLD,my_rank,ierr) call decomposizione(n_part,n_nodi,peso_nodo,n_part_nodo) allocate (x(n_part_nodo)) call inizializza(my_rank,x,field) do istep=1,nstep call pushing(field,x) call compute_density(x,density_nodo) call MPI_ALLREDUCE(density_nodo,density,n_celle, & MPI_DOUBLE_PRECISION,MPI_SUM, & MPI_COMM_WORLD,ierr) call field_solver(density,field) enddo call MPI_Finalize(ierr)
Decomposizione per dominio Dominio distribuito; particelle distribuite Pro: memoria relativa a campi e densità distribuita (risoluzione spaziale massima ottenibile N nodi ) non è necessaria riduzione tra nodi delle densità (speed up N nodi ) eccezione: confini tra sub-domini adiacenti (v. prossima slide) Contro: migrazione di particelle da un nodo all altro: check su ogni particella dopo il pushing ed eventuale riassegnazione al nuovo nodo (comunicazione) possbile sbilanciamento dei carichi con perdita dello scaling quasi ideale di risoluzione ottenibile e speed up con N nodi cura: bilanciamento dinamico (riassegnazione di dominio e particelle quando necessario) più difficile da implementare
Decomposizione per dominio: problema dei sub-domini adiacenti Al confine tra sub-domini adiacenti, i vertici sono in comune tra celle appartenenti a sub-domini diversi Conseguenza: particelle assegnate a nodi diversi richiedono, per il pushing, i valori dei campi su quei vertici contribuiscono alle densità di quegli stessi vertici Due possibilità: nodo 1 nodo 2 assegnare i vertici in comune a uno solo dei nodi (ogni particella di pertinenza di quel vertice, ma appartenente all altro nodo, richiede comunicazione per conoscere i campi e contribuire alle densità) replicare sui due nodi le locazioni di memoria relative ai vertici comuni ed operare la riduzione delle densità: lieve peggioramento degli scaling con N nodi Conviene la seconda!
Scheletro del codice parallelo (MPI) c c c call MPI_Init(ierr) call MPI_Comm_size(MPI_COMM_WORLD, n_nodi, ierr) call MPI_Comm_Rank(MPI_COMM_WORLD,my_rank,ierr) call decomposizione(n_part,n_celle,n_nodi,peso_nodo,n_part_nodo,ncelle_nodo) allocate (x(n_part_nodo)) allocate(field_nodo) call inizializza(my_rank,x,field_nodo) do istep=1,nstep call load_balancing(n_part_left,n_part_right) call riassegna_dominio(n_part_left,n_part_right,n_part_nodo,n_celle_nodo, & x,field_nodo) call pushing(field_nodo,x) call riassegna_particelle(n_part_nodo,x) call compute_density(x,density_nodo) call density_bordo(density_nodo) call field_solver(density,field_nodo) enddo call MPI_Finalize(ierr)
Esempio: bilanciamento dei carichi dinamico 0 1 2 N part-left (1) > 0 N part-left (2) < 0 N part-rght (0) < 0 N part-rght (1) > 0 & & & & & & if(my_rank.eq.0)then do irank=1,n_nodi-1 call MPI_RECV(n_part_nodo(irank),1,MPI_INTEGER, irank,itag1,mpi_comm_world,status,ierr) enddo calcola il numero di particelle che ciascun nodo deve scambiare con i nodi adiacenti do irank=1,n_nodi-1 call MPI_SEND(n_part_left(irank),1,MPI_INTEGER, irank,itag2,mpi_comm_world,status,ierr) call MPI_SEND(n_part_right(irank),1,MPI_INTEGER, irank,itag3,mpi_comm_world,status,ierr) enddo else call MPI_SEND(n_part_nodo(my_rank),1,MPI_INTEGER, 0,itag1,MPI_COMM_WORLD,status,ierr) call MPI_RECV(n_part_left(my_rank),1,MPI_INTEGER, 0,itag2,MPI_COMM_WORLD,status,ierr) call MPI_RECV(n_part_right(my_rank),1,MPI_INTEGER, 0,itag3,MPI_COMM_WORLD,status,ierr) endif individua la porzione di dominio che ciascun nodo deve scambiare con i nodi adiacenti
Parallelizzazione su architettura shared memory: il pushing I processori condividono la memoria Distribuiamo le iterazioni dei loops sulle particelle tra i diversi processori mediante direttive OpenMP Distribuzione delle iterazioni del loop relativo al pushing: è possibile che una particella (iterazione) legga le stesse locazioni di memoria lette simultaneamente da altra particella (field); scrive però solo su locazioni di memoria non toccate da altre particelle (x); sufficiente privatizzare le variabili locali!$omp parallel do default(shared) private(i,j) do i=1,n_particelle j = g(i) x(i) = x(i) + field(j) enddo!$omp end parallel do
Parallelizzazione su architettura shared memory: il calcolo delle densità Distribuzione delle iterazioni del loop relativo al calcolo delle densità: particelle diverse spazialmente vicine possono cercare di scrivere simultaneamente (race conditions) sulla stessa locazione di memoria (es.: densità di carica in un certo vertice di cella) Possibili ricette: decomposizione per particelle tra processori decomposizione per dominio tra processori
Decomposizione per particelle Si introducono copie private (una per processore) degli arrays da aggiornare e si effettua la riduzione delle copie al termine del loop OpenMP prevede la clausola reduction a questo scopo, ma non è affatto certo che sia utilizzabile anche per arrays Più sicura un implementazione fatta in casa: density(:) = 0.!$OMP parallel default(shared) private(i,j,density _aux) density_aux(:) = 0.!$OMP do do i=1,n_particelle j = g(i) density_aux(j) = density_aux(j) + d(i) enddo!$omp end do!$omp critical density(:) = density(:) + density_aux(:)!$omp end critical!$omp end parallel Pro: semplicità Contro: operazione di riduzione seriale memoria richiesta da density_aux N processori
Decomposizione per dominio Loop sulle particelle per identificare il sub-dominio in cui si trova ciascuna particella: viene definito il numero delle particelle n_part_sub(j) che si trovano in ciascun sub-dominio j a ciascuna particella i sono assegnati gli indici j_sub(i)=j e k(i) 1,n_part_sub(j) La definizione di n_part_sub(j) e di k(i) presenta il rischio di race conditions: viene effettuata all interno di una critical section n part-sub (j) k(i)
Decomposizione per dominio (segue ) La serializzazione può essere minimizzata limitando la riassegnazione alle sole particelle che hanno appena cambiato subdominio di appartenenza) Pro: il supplemento di memoria richiesto (j_sub, k) è modesto rispetto a quello già richiesto per le particelle, e non scala con N processori Contro: un loop in più sulle particelle implementazione non semplice (ma divertente )
Decomposizione per dominio (segue ) Calcolo delle densità: loop sui subdomini dispari - loop sulle particelle contenute nel sub-dominio loop sui subdomini pari - loop sulle particelle contenute nel sub-dominio Pro: non c è rischio di race conditions (iterazioni effettuate da processori diversi aggiornano locazioni di memoria relative a sub-domini diversi e non adiacenti non è necessario introdurre copie degli arrays di densità, né operazioni di riduzione 1 3 5 2 4 6
Architetture a memoria distribuita/condivisa La combinazione di questi concetti si può applicare per la parallelizzazione su cluster di sistemi shared-memory multiprocessor (SMP) particelle/ particelle dominio/ dominio nodi processori o le altre possibili combinazioni (particelle/dominio, dominio/particelle)
Performances Confronto tra strategie (IBM sp3, nel 2003) particle-particle (Cresco; 256 nodi Intel-Xeon con 2 processori quad core per nodo)
Bibliografia B. Di Martino, S. Briguglio, G. Vlad and P. Sguazzero, Parallel PIC plasma simulation through particle decomposition techniques, Parallel Computing, 27: 295-314, 2001 G. Vlad, S. Briguglio, G. Fogaccia and B. Di Martino, Gridless finite-size-particle plasma simulation, Computer Physics Communication, 134: 58-77, 2001 S. Briguglio, G. Vlad, B. Di Martino, and G. Fogaccia, Parallelization of plasma simulation codes: Gridless finite size particle versus particle in cell approach, Future Generation Computer Systems, 16: 541-552 (2000) B. Di Martino, S. Briguglio, M. Celino, G. Fogaccia, G. Vlad, V. Rosato, and M. Briscolin,. Development of large scale high performance applications with a parallelizing compiler. International Journal of Computer Research. Special Issue: Practical Parallel Computing, 10: 439-454, 2001 B. Di Martino, S. Briguglio, G. Vlad and G. Fogaccia, Workload decomposition strategies for Shared Memory Parallel Systems with OpenMP, Scientific Programming: Special Issue on OpenMP, 9: 109-122, 2001 B. Di Martino, S. Briguglio, M. Celino, G. Fogaccia, G. Vlad, V. Rosato, and M. Briscolini, Chapter "Experiences on Parallelizing Compilation for development and porting of large scale applications on Distributed Memory Parallel Systems", in Advances in Computation: Theory and Practice. 2001 S. Briguglio, B. Di Martino, and G. Vlad, Workload decomposition strategies for hierarchical distributedshared memory parallel systems and their implementation with integration of high level parallel languages. Concurrency and Computation: Practice and Experience, 14: 933-956, 2002 S. Briguglio, B. Di Martino, and G. Vlad, A performance-prediction model for PIC applications on clusters of Symmetric MultiProcessors: Validation with hierarchical HPF+OpenMP implementation. Scientific Programming: Special Issue, 11:159-176, 2003 S. Briguglio, B. Di Martino, G. Fogaccia and G. Vlad, MPI+OpenMP Implementation of memory-saving parallel PIC applications on hierarchical distributed-shared memory architectures, Proceedings of the 2003 European Simulation and Modelling Conference, ESMC2003, October 27-29, 2003, Naples, Italy, 2003 B. Di Martino, S. Venticinque, S. Briguglio, G. Fogaccia, and G. Vlad, High Performance Computing: Paradigm and Infrastructure, chapter 27: "A Grid based distributed simulation of Plasma Turbulence", pages 523 534. John Wiley and Sons, 2005 S. Venticinque, R. Aversa, B. Di Martino, R. Donini, S. Briguglio, and G. Vlad, Management of high performance scientific applications using mobile agents based services. Scalable Computing: Practice and Experience, 11(2): 149-159, July 2010