La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Claudio Gheller Gruppo Supercalcolo Settore Sistemi ad Alte Prestazioni CINECA 5–16 Luglio 2004 6–17 Settembre 2004 COMMUNICATOR e.

Presentazioni simili


Presentazione sul tema: "Claudio Gheller Gruppo Supercalcolo Settore Sistemi ad Alte Prestazioni CINECA 5–16 Luglio 2004 6–17 Settembre 2004 COMMUNICATOR e."— Transcript della presentazione:

1 Claudio Gheller Gruppo Supercalcolo Settore Sistemi ad Alte Prestazioni c.gheller@cineca.it CINECA 5–16 Luglio 2004 6–17 Settembre 2004 COMMUNICATOR e TOPOLOGIE

2 Claudio Gheller 2 Topologie – MPI2 Remote Memory Access Communicators e Topologie Communicator: insieme di processi che possono comunicare reciprocamente attraverso lo scambio di messaggi Topologia: struttura imposta sui processi che fanno parte di un communicator al fine di indirizzare specifici pattern di comunicazione

3 Claudio Gheller 3 Topologie – MPI2 Remote Memory Access Case study 1: moltiplicazione di matrici A, B, C matrici NxN C = A x B c ij = a ik b kj Npes = 4 Pe0Pe1 Pe3 A Pe2 Pe0Pe1 Pe3Pe2 B

4 Claudio Gheller 4 Topologie – MPI2 Remote Memory Access Case study 1: moltiplicazione di matrici Algoritmo di Fox: 1.Per ogni colonna invio ciascun sottoblocco di A a tutti i processori della riga di appartenenza 2.Ciascun sottoblocco effettua la moltiplicazione 3.Sommo i sottoblocchi per colonna Pe0Pe1 Pe3 A Pe2 Pe0Pe1 Pe3Pe2 B Queste operazioni richiedono delle send da un processore a tutti gli altri su una riga (fase 1) o su una colonna (fase 2). Assomigliano molto a broadcast o a reduce parziali, ovvero su un sottoinsieme di processi. somma

5 Claudio Gheller 5 Topologie – MPI2 Remote Memory Access Communicator Questo però è possibile ridefinendo il communicator, spezzandolo in una serie di communicator più piccoli Ad esempio, per il passo 1, e comodo avere un communicator per ciascuna riga di sottoblocchi. A quel punto ogni riga vede soltanto i processi che appartengono alla riga stessa e si possono utilizzare le operazioni collettive per effettuare la moltiplicazione parziale. Analogo per la fase 3, con communicator definiti per colonne.

6 Claudio Gheller 6 Topologie – MPI2 Remote Memory Access Communicator: implementazione MPI_group MPI_GROUP_WORLD MPI_group first_row_group MPI_Comm first_row_comm Integer row_size Parameter(row_size=2) Integer process_ranks(row_size) Do i = 1, row_size process_ranks(i) = i-1 Enddo Call MPI_COMM_GROUP(MPI_COMM_WORLD, MPI_GROUP_WORLD, ierr) Call MPI_GROUP_INCL(MPI_GROUP_WORLD, row_size, process_ranks, first_row_group, ierr) Call MPI_COMM_CREATE(MPI_COMM_WORLD, first_row_group, first_row_comm ) Definisco il gruppo di default associato allintero communicator di partenza. Definisco il nuovo gruppo a partire da quello preesistente Definisco il nuovo communicator OPERAZIONI LOCALI OPERAZIONE COLLETTIVA HANDLE

7 Claudio Gheller 7 Topologie – MPI2 Remote Memory Access Case Study 2: parallelizzazione di un problema su griglia regolare. E il caso di un problema descritto da una (o più) variabili rappresentate sui nodi di una griglia regolare. E uno dei casi più semplici, ma è estremamente comune. Ad esempio è tipico di molte applicazioni di fluidodinamica. A(i, j) A(i-1, j) A(i, j-1)

8 Claudio Gheller 8 Topologie – MPI2 Remote Memory Access Case Study 2. Spesso i problemi numerici su griglia sono caratterizzati dalla località della soluzione. In altri termini il valore della grandezza nel punto (i, j) è influenzato solo dalle celle immediatamente circostanti. Ricadono in questa categoria i problemi di fluidodinamica classica. Sono invece esempi opposti quelli forniti dal calcolo del campo gravitazionale o coulombiano e dalla fisica dei plasmi. A(i, j)

9 Claudio Gheller 9 Topologie – MPI2 Remote Memory Access Case Study 2. Parallelizzazione del problema su griglia: distribuzione a piani paralleli Si può dividere il dominio computazionale a bande. Data la località della soluzione il processo N ha bisogno di conoscere SOLO la prima riga di dati dei processi N-1 e N+1 PE N+1 PE N PE N-1 Larray contenente la variabile viene definito con 2 righe in più, contenenti le Ghost Regions. La comunicazione coinvolge esclusivamente le ghost regions e i bordi. Il resto del calcolo è completamente locale. Ghost Region

10 Claudio Gheller 10 Topologie – MPI2 Remote Memory Access Case Study. Parallelizzazione del problema su griglia: distribuzione a griglia cartesiana Si può dividere il dominio computazionale a blocchi. Questo tipo di suddivisione del dominio computazionale è preferibile perché: E compatibile con la geometria del problema Permette una maggiore granularità Riduce la comunicazione Però è più complessa da trattare !!! Chi sono i vicini di ciascun processore ??? Cosa devo comunicare ai processori vicini ??? … PE N+1 PE N+3PE N+2 PE N

11 Claudio Gheller 11 Topologie – MPI2 Remote Memory Access Introduzione La topologia di comunicazione identifica i pattern (principali) di comunicazione che avvengono in un codice parallelo Le MPI virtual topologies sono uno strumento utile per: –risparmiare tempo –evitare errori –strutturare il codice Di default, MPI assegna a ciascun processo in un gruppo un rank da 0 a n-1: topologia lineare. Con adeguate funzioni MPI supporta anche topologie cartesiane e in generale a grafo. Ridefinizione del communicator Utili quando il/i pattern di comunicazione seguono una o più strutture precise

12 Claudio Gheller 12 Topologie – MPI2 Remote Memory Access Topologia cartesiana I processori sono sui vertici di una griglia N- dimensionale. Caratteristiche di questa topologia sono: –numero di dimensioni –numero di processori in ogni dimensione –periodicità o meno nelle varie dimensioni

13 Claudio Gheller 13 Topologie – MPI2 Remote Memory Access MPI_CART_CREATE MPI_CART_CREATE(comm_old, ndims, dims, periods, reorder, comm_cart) [ IN comm_old] input communicator (handle) [ IN ndims] number of dimensions of cartesian grid (integer) [ IN dims] integer array of size ndims specifying the number of processes in each dimension [ IN periods] logical array of size ndims specifying whether the grid is periodic ( true) or not ( false) in each dimension [ IN reorder] ranking may be reordered ( true) or not ( false) (logical) [ OUT comm_cart] communicator with new cartesian topology (handle)

14 Claudio Gheller 14 Topologie – MPI2 Remote Memory Access Esempio integer :: comm_cart integer :: ierr integer :: dims(3) logical :: periods(3) dims(1) = NprocX dims(2) = NprocY dims(3) = NprocZ periods =.true. call MPI_CART_CREATE (MPI_COMM_WORLD, 3, dims, periods, &.true., comm_cart,ierr)

15 Claudio Gheller 15 Topologie – MPI2 Remote Memory Access reorder 012345 reorder=false 012 345 processor grid 3x2 012345 reorder=true 012 345 processor grid 3x2

16 Claudio Gheller 16 Topologie – MPI2 Remote Memory Access Funzioni di supporto MPI_CARTDIM_GET(COMM, NDIMS, IERROR) INTEGER COMM, NDIMS, IERROR MPI_CART_GET(COMM, MAXDIMS, DIMS, PERIODS, COORDS, IERROR) INTEGER COMM, MAXDIMS, DIMS(*), COORDS(*), IERROR LOGICAL PERIODS(*) Date le coordinate nella process grid, determina il rank MPI_CART_RANK(COMM, COORDS, RANK, IERROR) INTEGER COMM, COORDS(*), RANK, IERROR Dato il rank del processo, determina le coordinate: MPI_CART_COORDS(COMM, RANK, MAXDIMS, COORDS, IERROR) INTEGER COMM, RANK, MAXDIMS, COORDS(*), IERROR out in out

17 Claudio Gheller 17 Topologie – MPI2 Remote Memory Access SHIFT Determina chi sono i processi di destra e sinistra (sopra, sotto, avanti, dietro, …) MPI_CART_SHIFT(comm, direction, disp, rank_source, rank_dest) [ IN comm] communicator with cartesian structure (handle) [ IN direction] coordinate dimension of shift (integer) [ IN disp] displacement (integer) [ OUT rank_source] rank of source process (integer) [ OUT rank_dest] rank of destination process (integer)

18 Claudio Gheller 18 Topologie – MPI2 Remote Memory Access Esempio rank da chiedere nuovamente se reorder=true call MPI_COMM_RANK (comm_cart, me,ierr) identifica i primi vicini call MPI_CART_SHIFT(comm_cart,0,1, left,right,ierr) call MPI_CART_SHIFT(comm_cart,1,1, front,rear,ierr) call MPI_CART_SHIFT(comm_cart,2,1, down,up,ierr) identifica le coordinate del processore nella processor grid call MPI_CART_COORDS(comm_cart,me,3,coords,ierr) Xproc = coords(1) Yproc = coords(2) Zproc = coords(3)

19 Claudio Gheller 19 Topologie – MPI2 Remote Memory Access Esempio left right up down front rear x (0) y (1) z (2)

20 Claudio Gheller 20 Topologie – MPI2 Remote Memory Access Comunicazioni circolari (shift) right to left ! call MPI_SENDRECV(snd_buffer, N, MPI_REAL, right, sndtag,& rcv_buffer, N, MPI_REAL, left, rcvtag, & comm_cart, istatus, ierr) left to right ! call MPI_SENDRECV (snd_buffer, N, MPI_REAL, left, sndtag,& rcv_buffer, N, MPI_REAL, right, rcvtag, & comm_cart, istatus, ierr)

21 Claudio Gheller 21 Topologie – MPI2 Remote Memory Access Periodicità 0123 periods(1)=.true. left 0 =3 right 3 =0 0123 periods(1)=.false. left 0 =MPI_PROC_NULL right 3 =MPI_PROC_NULL MPI gestisce i bordi implicitamente: le comunicazioni a/da MPI_PROC_NULL non danno errore, non vengono eseguite e non danno tempi di attesa. Non è necessario infarcire i codici di IF!

22 Claudio Gheller 22 Topologie – MPI2 Remote Memory Access Esempio: Topologia 2D su matrice 0 (0,0) ROW (cresce lindice di colonna) COLUMN (cresce lindice di riga) Lindicizzamento è sempre: PROC(row,column) La coordinata 0 è la row, la 1 è la column. La coordinata che incrementa più rapidamente è la riga, ovvero è lindice di colonna. La dimensione della griglia di processori è Nrow x Ncol 1 (0,1) 2 (1,0)3 (1,1) 4 (2,0)5 (2,1) 6 (3,0)7 (3,1) matrice 4x2 process grid row column

23 Claudio Gheller 23 Topologie – MPI2 Remote Memory Access Suggerimenti Mantenere per i processori un layout analogo a quello dei dati. Evitare (se possibile!) di affidarsi alla numerazione dei processori: usare il processore 0 per operazioni particolari, gli altri in maniera uniforme. usare MPI_CART_SHIFT() per stabilire quali sono i processori vicini. La numerazione diventa critica nel momento in cui dobbiamo estrarre la configurazione globale dallunione delle partizione locali, esempio nellI/O. MPI_TYPE_DARRAY usa lo stesso ordine (row-major) delle topologie cartesiane: usarla per lI/O

24 Claudio Gheller 24 Topologie – MPI2 Remote Memory Access Suddividere una processor grid crea sotto-griglie di dimensionalità inferiore a quella originale (solo le dimensioni true vengono mantenute): MPI_CART_SUB(comm, remain_dims, newcomm) [ IN comm] communicator with cartesian structure (handle) [ IN remain_dims] the ith entry of remain_dims specifies whether the ith dimension is kept in the subgrid ( true) or is dropped ( false) (logical vector) [ OUT newcomm] communicator containing the subgrid that includes the calling process (handle) Ciascuna sotto-griglia viene identificata da un comunicatore NEWCOMM differente.

25 Claudio Gheller 25 Topologie – MPI2 Remote Memory Access Esempio comm=2x3x4 6 x REMAIN_DIMS=(false,false,true) REMAIN_DIMS=(true,true,false) 4 x newcomm=4 newcomm=2x3

26 Claudio Gheller 26 Topologie – MPI2 Remote Memory Access Topologia Grafo Con uno o più grafi è possibile descrivere qualunque topologia (inclusa quella cartesiana) Un grafo è costituito da un insieme di nodi (nodes) e un insieme di segmenti (edges) che li collegano

27 Claudio Gheller 27 Topologie – MPI2 Remote Memory Access Topologia a grafo Pe0 Pe3 Pe1 Pe2 ProcessNeighbours 01,3 10 23 30,2

28 Claudio Gheller 28 Topologie – MPI2 Remote Memory Access Topologia a grafo MPI_GRAPH_CREATE(comm_old, nnodes, index, edges, reorder, comm_graph) [ IN comm_old] input communicator (handle) [ IN nnodes] number of nodes in graph (integer) [ IN index] array of integers describing node degrees (see below) [ IN edges] array of integers describing graph edges (see below) [ IN reorder] ranking may be reordered ( true) or not ( false) (logical) [ OUT comm_graph] communicator with graph topology added (handle) Nel nostro esempio: nnodes = 4 index = 2, 3, 4, 6 edges = 1, 3, 0, 3, 0, 2

29 Claudio Gheller Gruppo Supercalcolo Settore Sistemi ad Alte Prestazioni c.gheller@cineca.it CINECA 5–16 Luglio 2004 6–17 Settembre 2004 MPI-2

30 Claudio Gheller 30 Topologie – MPI2 Remote Memory Access MPI: message passing standard Cosè MPI 2 ??? MPI2: estensione di MPI Vengono introdotte 3 nuove famiglie di funzionalità: Parallel I/O Remote Memory Operations Dynamic Process management Inoltre, vengono introdotte alcune funzionalità per rendere MPI (1+2) più robusto e facilmente utilizzabile, come: Supporto per C++ e F90 Supporto per i threads Programmazione mista Ci focalizzeremo su: Parallel I/O Remote Memory Operations

31 Claudio Gheller 31 Topologie – MPI2 Remote Memory Access MPI 2 al CINECA La libreria MPI 2 attualmente è presente esclusivamente sul sitema IBM SP4 Per compilare: mpxlf90 _r -o mycode mycode.f mpcc _r -o mycode mycode.c mpCC _r -o mycode mycode.cxx Per eseguire poe mycode -procs 2 -tasks_per_node 2 Oppure attraverso load leveler con comandi standard (già utilizzati per MPI)

32 Claudio Gheller 32 Topologie – MPI2 Remote Memory Access Remote Memory Operations Scambio di informazioni tra processi. Esistono 2 approcci principali: Message Passing MPI 1 Accesso Diretto MPI 2 Message Passing: Cooperativo. Un processo invia ed uno riceve. Solo quando la riceive è completa il dato è disponibile Vantaggi Completo controllo della memoria (solo i buffer specificati possono essere modificati) Completo controllo del momento in cui la comunicazione può avvenire Limiti Facilità di programmazione Performance In linea di principio si può (quasi) sempre paral- lelizzare con il message passing. In pratica questo a volte è difficile e rende il codice macchinoso e complesso…

33 Claudio Gheller 33 Topologie – MPI2 Remote Memory Access Case Study: contatore parallelo A volte, per ragioni di bilanciamento del carico di lavoro, è utile distribuire i dati in modo dinamico. Solo una frazione dei dati viene distribuita inizialmente tra i processori. Il processore che per primo finisce il proprio lavoro, carica un nuovo blocco di dati e prosegue. Pe0 N-3 Pe1 N-2 Pe2 N-1 Pe3 N Pe ? N+1 Il primo blocco di dati libero è identificato da un indice (N+1) determinato da un contatore GLOBALE, al quale devono accedere TUTTI i processori sia in lettura (per vedere qual è il blocco disponibile) che in scrittura (per aggiornare il blocco stesso) Ma questa operazione e ASINCRONA e non è possibile (in modo semplice) con MPI

34 Claudio Gheller Gruppo Supercalcolo Settore Sistemi ad Alte Prestazioni c.gheller@cineca.it CINECA 5–16 Luglio 2004 6–17 Settembre 2004 MPI-2 RMA

35 Claudio Gheller 35 Topologie – MPI2 Remote Memory Access Remote Memory Operations MPI 2 introduce il modello di programmazione Remote Memory Access (RMA) che elimina i problemi del message passing, conservandone però molti dei vantaggi. Lo scambio di dati è gestito da un unico processo, che specifica sia lorigine che la destinazione dei dati stessi (one-side communication) Attenzione: MPI 2 NON è shared memory Lapproccio Shared Memory è più naturale (esiste un unico spazio degli indirizzi) MA richiede hardware specifico. MPI 2 (e più in generale MPI) lavora su qualsiasi sistema parallelo più o meno accoppiato, a memoria distributia o condivisa !!!

36 Claudio Gheller 36 Topologie – MPI2 Remote Memory Access PE0PE1 Riassumendo… Message Passing PE0PE1Shared Memory PE0PE1Remote Memory Access Memory

37 Claudio Gheller 37 Topologie – MPI2 Remote Memory Access RMA: basics Lapproccio RMA prevede 3 step fondamentali: 1. Definire la memoria accessibile attraverso operazioni RMA. Questa è detta MEMORY WINDOW ed è creata attraverso il comando MPI_WIN_CREATE 2. Specificare quali dati devono essere comunicati e a chi. Si usano le routine MPI_PUT, MPI_GET, MPI_ACCUMULATE 3. Specificare quando il dato è accessibile, corrispondente alla finalizzazione di una receive. Definire la sincronizzazione dei processi. Questo si può realizzare in più modi, in base a considerazioni di implementazione e performance.

38 Claudio Gheller 38 Topologie – MPI2 Remote Memory Access Comparing MPI and MPI 2: an example. MPI 2 MPI

39 Claudio Gheller 39 Topologie – MPI2 Remote Memory Access Memory Windows La Memory Window è lo spazio di memoria complessivo reso disponibile ad operazioni RMA Non tutta la memoria locale è accessibile via RMA. Solo la parte definita nella Memory Window. Fisicamente è una sezione di memoria contigua descritta da un indirizzo base più una dimensione in bytes. Creazione: MPI_WIN_CREATE(base, size, disp_unit, info, comm, win, ierr) Distruzione: MPI_WIN_FREE(win, ierr) PE0 memory Win PE 1 IN base = indirizzo di partenza IN Size = dimensione in bytes IN Disp_unit = unità di conteggio dei dati (bytes, sizeof()). Essenziale per la portabilità IN Info = legata alle performance (vedi in seguito). MPI_INFO_NULL sempre OK IN Comm = communicator OUT Win = nome della finestra

40 Claudio Gheller 40 Topologie – MPI2 Remote Memory Access Altri approcci: La Memory Window serve ad individuare univocamente dove sono i dati che si possono comunicare e a proteggere le zone di memoria che non entrano in gioco nella parallelizzazione. Altre librerie seguono approcci simili. Le LAPI, implementate da IBM allocano una parte di memoria espressamente per operazioni di RMA. Tale operazione è realizzata da una funzione analoga alla MPI_WIN_CREATE. Le Shmem, implementate da SGI (e, originariamente da CRAY) usano la convenzione che le variabili accessibili via RMA devono essere allocate staticamente su ciascun processore e occupano gli stessi indirizzi di memoria.

41 Claudio Gheller 41 Topologie – MPI2 Remote Memory Access Comunicazione delle informazioni Scrittura su memoria remota: MPI_PUT (origin_ad, origin_count, origin_type, target_rank, target_disp, target_count, target_datatype, win, ierr) origin_ad, origin_count, origin_type = caratterizzano i dati che devono essere comunicati. NON DEVONO NECESSARIAMENTE ESSERE NELLA MEMORY WINDOW. target_rank = processore di destinazione target_disp = è loffset della locazione di memoria in cui scrive la put IN UNITA della DISP_UNIT definita per la Window target_count = numero di elementi target_datatype = tipo dei dati win = nome della Memory Window MPI_PUT può essere pensata come una coppia di send e receive non bloccanti. Questultima caratteristica è fondamentale per le prestazioni… Non esiste nessuna versione bloccante di funzioni RMA. Comunicazione e Sincronizzazione sono SEMPRE separate !!! I TARGET DEVONO ESSERE NECESSARIAMENTE NELLA MEMORY WINDOW !!!

42 Claudio Gheller 42 Topologie – MPI2 Remote Memory Access Comunicazione delle informazioni Lettura da memoria remota: MPI_GET( origin_ad, origin_count, origin_type, target_rank, target_disp, target_count, target_datatype, win, ierr ) origin_ad, origin_count, origin_type = caratterizzano i buffer che devono essere caricati. NON DEVONO NECESSARIAMENTE ESSERE NELLA MEMORY WINDOW. target_rank = processore di destinazione target_disp = è loffset della locazione di memoria in cui scrive la put IN UNITA della DISP_UNIT definita per la Window target_count = numero di elementi target_datatype = tipo dei dati win = nome della Memory Window I TARGET DEVONO ESSERE NECESSARIAMENTE NELLA MEMORY WINDOW !!!

43 Claudio Gheller 43 Topologie – MPI2 Remote Memory Access Process 0Process 1 A(10) B(20) A(10) B(20) C(4) Get Put MEMORY MPI WIN

44 Claudio Gheller 44 Topologie – MPI2 Remote Memory Access Comunicazione delle informazioni Combinazione di comunicazione e calcolo: MPI_ACCUMULATE( origin_ad, origin_count, origin_type, target_rank, target_disp, target_count, target_datatype, OP, win, ierr) OP = operazione sui dati che vengono comunicati. Ad esempio MPI_SUM, somma i termini dorigine sul target MPI_REPLACE, sostituisce il valore di target con quello dorigine MPI_ACCUMULATE corrisponde ad una Reduce di MPI, anche se non è altrettanto generale (ad es. non consente luso di operazioni definite dallutente) (…anche in questo caso) I TARGET DEVONO ESSERE NECESSARIAMENTE NELLA MEMORY WINDOW !!!

45 Claudio Gheller 45 Topologie – MPI2 Remote Memory Access Completamento della comunicazione In MPI 1 limpostazione della comunicazione può essere disaccoppiata dal suo completamento. Questo permette di migliorare le performance. Infatti, la finalizzazione porta via tempo !!! In MPI 2 comunicazione e sincronizzazione sono disaccoppiate MPI 2 permette di finalizzare con ununica chiamata (quindi con ununica operazione) tutte le comunicazioni impostate su una stessa window !!! HIGH PERFOMANCE La finalizzazione si può ottenere in vari modi: MPI_WIN_FENCE MPI_WIN_LOCK MPI_WIN_POST

46 Claudio Gheller 46 Topologie – MPI2 Remote Memory Access Completamento della comunicazione La FENCE è la procedura più comune per finalizzare la comunicazione. Si può pensare come una specie di barriera. Una FENCE finalizza tutti i processi RMA impostati da una precedente chiamata alla FENCE stessa. La FENCE è collettiva e coinvolge tutti i processi della window (active target synchronization) Fino alla chiamata di una FENCE non cè nessuna garanzia che: Le operazioni di RMA siano concluse I dati locali siano disponibili alla Memory Window MPI_WIN_FENCE(assert, win, ierr) il parametro assert indica sempre una possibile ottimizzazione: 0 va bene sempre Regola Generale La FENCE separa zone di codice in cui avvengono accessi (in scrittura) alla memoria locale da zone in cui avvengono accessi (in scrittura) alla memoria remota. In pratica: PUT e ACCUMULATE non stanno mai nella stessa zona di load/store locali e GET

47 Claudio Gheller 47 Topologie – MPI2 Remote Memory Access Completamento della comunicazione: Fence Allinterno di una sezione FENCE NON modificare MAI con unoperazione di PUT per più di una volta una variabile La stessa cosa non vale per lACCUMULATE. Anzi, loperazione e ottimizzata per accessi concorrenti !!! Attenzione allutilizzo di ACCUMULATE con operazioni non commutative (es. mischiare somme e prodotti) in modo concorrente dato che lordine di esecuzione non è garantito. Ad esempio: MPI_Accumulate(a, 2, …, MPI_REPLACE) a(0) potrebbe avere il valore che proviene dal processo 0 e a(1) quello che viene dal processo 1 (o viceversa)!!

48 Claudio Gheller 48 Topologie – MPI2 Remote Memory Access Riassumendo: FENCE PUT ACCUMULATE GET e load locali su variabili non soggette a precedenti PUT e ACCUMULATE FENCE GET Load/store locali FENCE WIN_CREATE WIN_FREE

49 Claudio Gheller 49 Topologie – MPI2 Remote Memory Access Completamento della comunicazione La LOCK provvede una sincronizzazione di tipo Passive Target. LOCK e UNLOCK definiscono la access epoch durante la quale la window remota può essere acceduta da uno specifico processo Il target non sa nulla della comunicazione. Vera e propria one side communication La LOCK non è collettiva. MPI_WIN_LOCK(lock_type, rank, assert, win, ierr) MPI_WIN_UNLOCK(rank, win, ierr) Il parametro rank definisce il target della RMA Il parametro lock_type può essere: MPI_LOCK_SHARED: più operazioni possono operare su una window MPI_LOCK_EXCLUSIVE: accesso atomico alla window Il LOCK su una window locale impedisce laccesso in RMA da altri processi (altrimenti non è possibile evitare laccesso passivo !!!). Anche sulle variabili locali, si deve operare con lock, put e get.

50 Claudio Gheller 50 Topologie – MPI2 Remote Memory Access LOCK: esempio La sincronizzazione passiva permette di definire, ad esempio, una PUT bloccante: Subroutine MPE_Blocking_put ( target_rank, win, …parametri della PUT… ) Call MPI_WIN_LOCK ( MPI_LOCK_SHARED, target_rank, 0, win, ierr ) Call MPI_PUT (…) Call MPI_WIN_UNLOCK ( target_rank, win, ierr) return La stessa cosa non avrebbe avuto senso con una FENCE dato che questa è unoperazione collettiva che non permette una sincronizzazione di singoli processi.

51 Claudio Gheller 51 Topologie – MPI2 Remote Memory Access Completamento della comunicazione POST e START definiscono una sincronizzazione attiva, analoga alla FENCE ma limitata ai processi che effettivamente concorrono alla comunicazione. In questo modo si ottiene una migliore scalabilità MPI_WIN_POST(from_group, assert, win, ierr) MPI_WIN_WAIT(win, ierr) MPI_WIN_START(to_group, assert, win, ierr) MPI_WIN_COMPLETE(win, ierr) POST apre la local window ai processi che fanno parte del gruppo from_group, per un periodo detto exposure epoch. WAIT chiude la exposure ephoc. START inizializza la comunicazione di un gruppo verso una window aperta dal POST COMPLETE finalizza la comunicazione Sono necessarie entrambe MPI_WIN_FENCE Codice MPI_WIN_FENCE MPI_WIN_POST MPI_WIN_START Codice MPI_WIN_ COMPLETE MPI_WIN_WAIT

52 Claudio Gheller 52 Topologie – MPI2 Remote Memory Access Case Study. Implementazione Fortran MPI 1 per piani paralleli Subroutine exchang1(a, nx, s, e, comm1d, bottom_nbr, top_nbr) use mpi integer nx, s, e double precision a(0:nx+1, s-1:e+1) integer comm1d, bottom_nbr, top_nbr integer status_array(MPI_STATUS_SIZE, 4), ierr, req(4) call MPI_IRECV (a(1,s-1), nx, MPI_DOUBLE_PRECISION, bottom_nbr, 0, comm1d, req(1), ierr) call MPI_ISEND (a(1,e), nx, MPI_DOUBLE_PRECISION, top_nbr, 0, comm1d, req(3), ierr call MPI_IRECV (a(1,e+1), nx, MPI_DOUBLE_PRECISION, top_nbr, 1, comm1d, req(2), ierr) call MPI_ISEND (a(1,s), nx, MPI_DOUBLE_PRECISION, bottom_nbr, 1, comm1d, req(4), ierr call MPI_WAITALL (4, req, status_array, ierr) return end Nota la necessità di utilizzare comunicazioni NON bloccanti per evitare deadlock

53 Claudio Gheller 53 Topologie – MPI2 Remote Memory Access Case Study. Implementazione Fortran MPI 2 integer sizedouble, ierr, win double precision a(0:nx+1, s-1:e+1) call MPI_TYPE_SIZE (MPI_DOUBLE_PRECISION, sizedouble, ierr) call MPI_WIN_CREATE (a, (nx+2)*(e-s+3)*sizedouble, sizedouble, MPI_INFO_NULL, MPI_COMM_WORLD, win, ierr) … Subroutine exchang1(a, nx, s, e, win, bottom_nbr, top_nbr) use mpi integer nx, s, e, ierr, win, bottom_nbr, top_nbr, bottom_ghost_disp, top_ghost_disp double precision a(0:nx+1, s-1:e+1) call MPI_FENCE (0, win,ierr) top_ghost_disp=1+(nx+2)*(e-s+2) bottom_ghost_disp=1 call MPI_PUT (a(1,s), nx, MPI_DOUBLE_PRECISION, bottom_nbr, top_ghost_disp, nx, MPI_DOUBLE_PRECISION & win, ierr) call MPI_PUT (a(1,e), nx, MPI_DOUBLE_PRECISION, top_nbr, bottom_ghost_disp, nx, MPI_DOUBLE_PRECISION & win, ierr) call MPI_FENCE (0, win,ierr) return end Il displacement è in unità di sizedouble, con offset di 1 per evitare di comunicare i boundary laterali Possiamo trascrivere il codice in MPI 2 ottenendo una versione esattamente equivalente alla precedente. Con MPI 2 però si deve inizializzare la memory window. Nota la presenza del Fence anche prima che la comunicazione inizi La dimensione della window è in BYTES MPI_TYPE_SIZE è il corrispondente di sizeof per il Fortran Nella stessa zona di Fence possono convivere due PUT in quanto modificano aree di memoria diverse

54 Claudio Gheller 54 Topologie – MPI2 Remote Memory Access Case Study. Osservazioni Le due versioni MPI 1 e MPI 2 del codice sono equivalenti nel funzionamento. Nella versione MPI 2 tuttavia non è necessaria la presenza di send e corrispondenti receive. Il processo origine può scrivere liberamente nella memoria esposta dalla window del processo target. La sincronizzazione si verifica solo alla chiamata del FENCE quando TUTTE le comunicazioni sono già state impostate Eventuali store locali sulle aree ghost avrebbero dovuto essere situate in una diversa zona FENCE !!! Problema nel calcolo del displacement assumiamo che i parametri e ed s siano gli stessi per TUTTI i processi. Ma questo potrebbe non essere vero !!! In tal caso è necessario comunicare preliminarmente il corretto displacement remoto !!! OPPURE …

55 Claudio Gheller 55 Topologie – MPI2 Remote Memory Access Case Study. …OPPURE: modifico la routine exchang1 come segue: Subroutine exchang1(a, nx, s, e, win, bottom_nbr, top_nbr) use mpi integer nx, s, e, ierr, win, bottom_nbr, top_nbr, bottom_ghost_disp, top_ghost_disp double precision a(0:nx+1, s-1:e+1) top_nbr = nx + 2 bottom_nbr = 1 call MPI_FENCE (0, win,ierr) call MPI_GET ( a(1,e+1), nx, MPI_DOUBLE_PRECISION, top_nbr, nx+1, nx, MPI_DOUBLE_PRECISION, win, ierr) call MPI_PUT ( a(1,e), nx, MPI_DOUBLE_PRECISION, bottom_nbr, 1, nx, MPI_DOUBLE_PRECISION, win, ierr) call MPI_FENCE (0, win,ierr) return end Anche in questo caso, nella stessa zona di Fence possono convivere PUT e GET in quanto accedono ad aree di memoria diverse

56 Claudio Gheller 56 Topologie – MPI2 Remote Memory Access Case Study. Nota conclusiva: nel precedente esempio lunità di displacement è stata scelta pari alla dimensione di un double. Tuttavia questa è solo una delle possibili scelte. La si sarebbe potuta fissare pari alla lunghezza di una riga: (nx+2) * sizedouble in tal caso loffset della put sarebbe semplicemente il numero della riga. In tal caso però comunicheremmo più dati, dato che verrebbero comunicate anch e le celle di bordo delle regioni ghost.

57 Claudio Gheller 57 Topologie – MPI2 Remote Memory Access Case Study: contatore parallelo, soluzione 1 call MPI_WIN_LOCK( MPI_LOCK_EXCLUSIVE, 0, 0, win, ierr) call MPI_GET(ix,1,MPI_INTEGER, 0,0,1,MPI_INTEGER,win,ierr) call MPI_ACCUMULATE(1,1,MPI_INTEGER,0,0,1,MPI_INTEGER,MPI_SUM,win,ierr) call MPI_WIN_UNLOCK(0, win, ierr) NON FUNZIONA!!! 1.Lo standard MPI proibisce esplicitamente laccesso e lupdate della stessa locazione di memoria nella medesima access epoch 2.MPI_GET è asincrona: abbiamo la certezza che ix è up-to-date solo al termine del periodo di sincronizzazione, sia in remoto che in locale: solo dopo lunlock. Potrebbe quindi avvenire prima laccumulate e poi il get !!! Recupera il valore attuale del contatore Aggiorna il contatore

58 Claudio Gheller 58 Topologie – MPI2 Remote Memory Access Case Study: contatore parallelo, soluzione 2 call MPI_WIN_LOCK( MPI_LOCK_SHARED, 0, 0, win, ierr) call MPI_GET(ix,1,MPI_INTEGER, 0,0,1,MPI_INTEGER,win,ierr) call MPI_WIN_UNLOCK(0, win, ierr) call MPI_WIN_LOCK( MPI_LOCK_SHARED, 0, 0, win, ierr) call MPI_ACCUMULATE(1,1,MPI_INTEGER,0,0,1,MPI_INTEGER,MPI_SUM,win,ierr) call MPI_WIN_UNLOCK(0, win, ierr) NON FUNZIONA!!! Così abbiamo reso sincrone sia la MPI_GET che la MPI_ACCUMULATE, quindi localmente non abbiamo più problemi, ma tra il primo unlock ed il secondo lock, un altro processo può inserirsi e leggere il valore non incrementato.

59 Claudio Gheller 59 Topologie – MPI2 Remote Memory Access Case Study: contatore parallelo, soluzione ideale call MPI_WIN_LOCK( MPI_LOCK_EXCLUSIVE, 0, 0, win, ierr) call MPI_WIN_LOCK( MPI_LOCK_SHARED, 0, 0, win, ierr) call MPI_GET(ix,1,MPI_INTEGER, 0,0,1,MPI_INTEGER,win,ierr) call MPI_WIN_UNLOCK( 0, win, ierr) call MPI_WIN_LOCK( MPI_LOCK_SHARED, 0, 0, win, ierr) call MPI_ACCUMULATE(1,1,MPI_INTEGER, 0,0,1,MPI_INTEGER,MPI_SUM,win,ierr) call MPI_WIN_UNLOCK( 0, win, ierr) nidificare i lock, esclusivo allesterno per evitare che altri processi si inseriscano e shared allinterno per rendere sincrone le chiamate sarebbe lideale, ma NON E POSSIBILE!!! MPI non lo permette.

60 Claudio Gheller 60 Topologie – MPI2 Remote Memory Access Case Study: contatore parallelo, soluzione pratica Separo la locazione di memoria da incrementare da quella da ottenere con la get. In pratica: 1.Definisco sul pe 0 un array di dimensione pari al numero di processori. Larray contiene lincremento specifico per ogni processore. 2.Il processore M istanzia un lock exclusive sul pe 0 3.Il processore M preleva tutti gli elementi dellarray (get) tranne lM-esimo 4.Incremento di 1 dellM-esimo elemento sul processore 0 5.Unlock della window 6.Aggiornamento del contatore locale sul processore M-esimo 7.Calcolo del valore del contatore sul processore M-esimo come somma di tutti i termini dellarray più il contatore locale

61 Claudio Gheller 61 Topologie – MPI2 Remote Memory Access Implementazione Integer count_array(Npes) … CALL MPI_WIN_LOCK(MPI_LOCK_EXCLUSIVE, 0, 0, counter_win, ierr) Do i= 1, Npes if (i -1 = mype) then CALL MPI_ACCUMULATE(one, 1, MPI_INT, 0, i, 1, MPI_INT, counter_win, ierr) else CALL MPI_GET(count_array(i), 1, MPI_INT, 0, i, 1, MPI_INT, counter_win, ierr) endif Enddo CALL MPI_WIN_UNLOCK(0, counter_win) Myval = Myval + 1 count_array(mype+1) = Myval tot_count = 0 Do i= 1, Npes tot_count=tot_count + count_array(i) enddo


Scaricare ppt "Claudio Gheller Gruppo Supercalcolo Settore Sistemi ad Alte Prestazioni CINECA 5–16 Luglio 2004 6–17 Settembre 2004 COMMUNICATOR e."

Presentazioni simili


Annunci Google