Calcolo Parallelo con MPI (2 parte)

Documenti analoghi
Calcolo parallelo con MPI (2ª parte)

Calcolo parallelo con MPI (2ª parte)

Non blocking. Contro. La programmazione di uno scambio messaggi con funzioni di comunicazione non blocking e' (leggermente) piu' complicata

Comunicazione. La comunicazione point to point e' la funzionalita' di comunicazione fondamentale disponibile in MPI

Alcuni strumenti per lo sviluppo di software su architetture MIMD

MPI Quick Refresh. Super Computing Applications and Innovation Department. Courses Edition 2017

Programma della 1 sessione di laboratorio

Alcuni strumenti per lo sviluppo di software su architetture MIMD

Laboratorio di Calcolo Parallelo

Gruppo di collaboratori Calcolo Parallelo

Presentazione del corso

Programmazione di base

Introduzione a MPI Algoritmi e Calcolo Parallelo. Daniele Loiacono

Presentazione del corso

Alcuni strumenti per lo sviluppo di software su architetture MIMD

MPI è una libreria che comprende:

MPI: comunicazioni point-to-point

int MPI_Recv (void *buf, int count, MPI_Datatype type, int source, int tag, MPI_Comm comm, MPI_Status *status);

Calcolo parallelo. Una sola CPU (o un solo core), per quanto potenti, non sono sufficienti o richiederebbero tempi lunghissimi.

Concetti base di MPI. Introduzione alle tecniche di calcolo parallelo

Il linguaggio C. Puntatori e dintorni

Il modello a scambio di messaggio

I.I.S. G.B. PENTASUGLIA MATERA ISTITUTO TECNICO SETTORE TECNOLOGICO LICEO SCIENTIFICO SCIENZE APPLICATE. Classe: 5Ci

Primi Programmi con MPI 1

Alcuni strumenti per lo sviluppo di software su architetture MIMD

Calcolo parallelo. Una sola CPU (o un solo core), per quanto potenti, non sono sufficienti o richiederebbero tempi lunghissimi

MPI in dettaglio. Chi ha definito MPI. Salvatore Orlando. CALCOLO PARALLELO - S. Orlando. CALCOLO PARALLELO - S. Orlando

Modello a scambio di messaggi

Boost.MPI Library Algoritmi e Calcolo Parallelo. Daniele Loiacono

A.d'Alessio. Calcolo Parallelo. Esempi di topologie

Esercitazioni 13 e 14

Modello di sviluppo della popolazione: Matrice di Leslie

Università degli Studi di Napoli Parthenope. Corso di Calcolo Parallelo e Distribuito. Virginia Bellino Matr. 108/1570

Esercizi MPI. Algoritmi e Calcolo Parallelo. Daniele Loiacono

MPI: MESSAGE PASSING INTERFACE

Corso di Informatica A.A

Modelli di programmazione parallela

Libreria MPI. (Message Passing Interface)

AA 2016/2017. MPI: concetti di base

MPI. MPI e' il risultato di un notevole sforzo di numerosi individui e gruppi in un periodo di 2 anni, tra il 1992 ed il 1994

Laboratorio di Informatica I

Tipi di dato semplici

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Funzioni, Stack e Visibilità delle Variabili in C

Lezione 6: Array e puntatori

Introduzione al C. Lezione 4 Allocazione dinamica della memoria. Rossano Venturini. Pagina web del corso

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Mai fidarsi. int main() { int a,i=2; a = 1*abs(i 1); printf ( "%d\n", a); } $ gcc W Wall o first main.c $./first 1

Algoritmi e Programmazione Avanzata. Pile e code. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Il linguaggio C. Puntatori e dintorni

Parallel Computing. Architetture Hardware e Software per l elaborazione parallela. 2 Giugno Lorenzo Muttoni Anno Accademico

Cominciamo ad analizzare la rappresentazione delle informazioni... di Cassino. C. De Stefano Corso di Fondamenti di Informatica Università degli Studi

14/12/2018 Informatici e di Telecomunicazioni

Pile e code. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Libreria MPI. (Message Passing Interface) Standard Message Passing Interface (MPI)

Somma di un array di N numeri in MPI

Ingresso ed Uscita in C. Informatica 1 / 15

Sistemi di Calcolo - Secondo modulo (SC2) Programmazione dei Sistemi di Calcolo Multi-Nodo

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

Tipi di dato semplici

Breve Ripasso del linguaggio C

L uso di Socket UDP. Usiamo le API Winsock incluse in <Winsock.h> A.A. 2005/06. Dott.ssa Valeria Carofiglio

Sistemi Operativi (M. Cesati)

Circular shift: una topologia cartesiana 1D

Politecnico di Milano - Dipartimento di Elettronica, informazione e Bioingegneria Prof. Mauro Negri

La gestione della memoria dinamica Heap

Gestione dinamica della memoria

Esercizi Calcolo Parallelo Algoritmi, Strutture Dati e Calcolo Parallelo. Daniele Loiacono

Programmazione Procedurale in Linguaggio C++

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente. per variabili di tipo array, in cui dover

Breve Ripasso del linguaggio C

Le topologie. Message Passing Interface MPI Parte 2. Topologie MPI. Esempi di topologie. Definizione: topologia. Laura Antonelli

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO III Indice

Indirizzi e tipi puntatore a

Prodotto Matrice - Vettore in MPI - III Strategia

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO III Indice

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

I puntatori /2. Ad esempio. // inizio codice. #include <stdio.h> void mostra(int); int main() {int a = 10; mostra(a); return 0;}

2 Operatori matematici e costrutto if

Message Passing Interface (MPI) e Parallel Virtual Machine (PVM)

Uso avanzato dei puntatori Allocazione dinamica della memoria

Passaggio dei parametri

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

OOP in C++ ha membro (dati membro) e funzioni membro In Java i dati membro sono chiamati attributi e le funzioni membro metodi

Programmazione C: Esercizi su vettori e funzioni. Titolo presentazione. sottotitolo. Milano, XX mese 20XX

Introduzione al linguaggio C Primi programmi

METODI in Java. Prof.Angela Bonifati. Metodi e Sottoprogrammi

Transcript:

2 Calcolo Parallelo con MPI (2 parte) Approfondimento sulle comunicazioni point-to-point Pattern di comunicazione point-to-point: sendrecv Synchronous Send Buffered Send La comunicazione non-blocking Laboratorio 2

Cosa abbiamo imparato di MPI Concetto di aritmetica parallela : gruppo di collaboratori che lavorano indipendentemente su parti del problema sulla base dei risultati parziali, si ottiene il risultato complessivo: questa fase richiede la comunicazione tra collaboratori MPI come strumento per implementare la comunicazione tra processi (l equivalente informatico dei collaboratori) Le 6 funzioni di base ed alcune costanti di MPI che ci permettono di implementare lo scambio di messaggi tra due processi: Communication Environment: MPI_Init e MPI_Finalize MPI_Comm_rank e MPI_Comm_size Communication point-to-point: MPI_Send e MPI_Recv Comunicatore di default MPI_COMM_WORLD ed alcuni MPI_Datatype C. Truini, M. Ippolito: MPI_2 3

4 Pattern di comunicazione Nella parallelizzazione di programmi reali, alcuni schemi di invio/ricezione del messaggio sono largamente diffusi: pattern di comunicazione I pattern di comunicazione possono essere di tipo point-to-point, coinvolgono solo due processi collettivi, coinvolgono più processi MPI mette a disposizione strumenti (funzioni MPI) per implementare alcuni pattern di comunicazione in modo corretto, robusto e semplice il corretto funzionamento NON deve dipendere dal numero di processi

Pattern di comunicazione point-to-point: shift Molti algoritmi paralleli richiedono la comunicazione tra ciascun processo ed uno (o più) dei suoi vicini, con rank maggiore o minore. Questo tipo di pattern di comunicazione è lo shift Lo shift è un pattern point-to-point: Ogni processo invia/riceve un set di dati in un verso (positivo/negativo) con una certa distanza di rank (Drank). Per esempio: se Drank=1 con verso positivo: il processo i comunica al processo i+1 se Drank=3 con verso positivo: il processo i comunica al processo i+3 se Drank=1 con verso negativo:il processo i comunica al processo i-1 Se lo shift è periodico: Il processo con rank=size Drank invia il set di dati al processo 0 C. Truini, M. Ippolito: MPI_2 5

6 Shift Circolare periodico Esercizio 6 Ogni processo genera un array A, popolandolo con interi pari al proprio rank Ogni processo invia il proprio array A al processo con rank immediatamente successivo Periodic Boundary: l ultimo processo invia l array al primo processo Ogni processo riceve l array A dal processo immediatamente precedente e lo immagazzina in un altro array B. Periodic Boundary: il primo processo riceve l array dall ultimo processo Provare il programma dimensionando l array A a 2000, 4000 e 5000 elementi.

7 Shift circolare periodico: versione naive PROC 0 PROC 1 Esercizio 6 PROC 2 Send(1) Send(2) Send(0) Recv(2) Recv(0) Recv(1) 0 2 1

8 Shift circolare periodico: versione naive Esercizio 6 Cosa succede girando l esempio al crescere del valore di MSIZE? Utilizzando l ambiente parallelo OpenMPI sul nostro cluster, il programma funziona correttamente a MSIZE = 4000 Se MSIZE = 5000, il programma va in hang

9 Il deadlock L implementazione naive dello shift circolare non è corretta: per MSIZE>4000 si genera un deadlock Il deadlock è la condizione in cui ogni processo è in attesa di un altro per terminare la comunicazione e procedere poi nell esecuzione del programma Per comprendere perché il deadlock si verifica per MSIZE>4000 è necessario entrare nel dettaglio del meccanismo di scambio di messaggi tra due processi

Cenni sul meccanismo di comunicazione 10 Le funzioni send standard di MPI non ritornano sino a che l invio del messaggio non sia stato completato secondo una delle due modalità seguenti: Buffered: l invio del messaggio avviene attraverso una copia dal buffer di invio in un buffer di sistema Synchronous: l invio del messaggio avviene attraverso la copia diretta nel buffer di ricezione

Cosa fa MPI_Send nel nostro esempio 11 La modalità di completamento di MPI_Send varia a seconda della size dei dati da inviare: Buffered per size piccole Synchronous per size grandi Nel nostro caso, sino a 4000 elementi di tipo MPI_INT la MPI_Send si comporta come buffered, mentre a 5000 si comporta come synchronous per MSIZE=4000 il processo può uscire fuori dalla send dopo che A sia stato copiato nel buffer locale al sistema in cui il processo è in esecuzione Per MSIZE=5000 il processo può uscire fuori dalla send solo quando ci sia in esecuzione un operazione di receive pronta ad accogliere A

Perché il deadlock? Nel nostro caso l algoritmo è del tipo if (myrank = 0) SEND A to Process 1 RECEIVE B from Process 1 else if (myrank = 1) SEND A to Process 0 RECEIVE B from Process 0 endif Per MSIZE=5000, ci sono due send in attesa di due receive, ma le receive potranno essere eseguite solo dopo che le reciproche send siano state completate. DEADLOCK! 0 1 C. Truini, M. Ippolito: MPI_2 12

Soluzione del deadlock nello shift circolare: Send-Receive Abbiamo la necessità di una funzione che tratti internamente l ordine delle operazioni di send e receive La funzione che svolge questo compito è MPI_Sendrecv La funzionalità MPI send-receive è utile quando un processo deve contemporaneamente inviare e ricevere dati Può essere usata per implementare pattern di comunicazione di tipo shift C. Truini, M. Ippolito: MPI_2 13

Binding MPI_Sendrecv In C int MPI_Sendrecv(void *sbuf,int scount,mpi_datatype s_dtype, int dest,int stag,void *rbuf,int rcount,mpi_datatype r_type, int src, int rtag,mpi_comm comm, MPI_Status *status) In Fortran MPI_SENDRECV(SBUF, SCOUNT, S_DTYPE, DEST, STAG, I primi argomenti sono relativi alla send, gli altri alla receive Argomenti significativi: [IN] dest è il rank del receiver all interno del comunicatore comm [IN] stag è l identificativo del send message [IN] src è il rank del sender all interno del comunicatore comm [IN] rtag è l identificativo del receive message [OUT] rbuf, status C. Truini, M. Ippolito: MPI_2 RBUF, RCOUNT, R_DTYPE, SRC, RTAG, COMM, STATUS, ERR) 14

Shift circolare: versione con Send-Receive 15 Esercizio 7 PROC 0 PROC 1 PROC 2 Send (1) Send (2) Send (0) Recv (2) Recv (0) Recv (1) Sendrecv(1,2) Sendrecv(2,0) Sendrecv(0,1)

16 Modalità di comunicazione Una comunicazione tipo point-to-point può essere: Blocking: il controllo è restituito al processo che ha invocato la primitiva di comunicazione solo quando la stessa è stata completata Non blocking: il controllo è restituito al processo che ha invocato la primitiva di comunicazione quando la stessa è stata eseguita il controllo sull effettivo completamento della comunicazione deve essere fatto in seguito nel frattempo il processo può eseguire altre operazioni

17 Criteri di completamento della comunicazione Dal punto di vista non locale, ovvero di entrambi i processi coinvolti nella comunicazione, è rilevante il criterio in base al quale si considera completata la comunicazione Funzionalità Synchronous send Buffered send Standard send Receive Criterio di completamento è completa quando è terminata la ricezione del messaggio è completa quando è terminata la scrittura dei dati da comunicare sul buffer predisposto (non dipende dal receiver!) Può essere implementata come una synchronous o una buffered send è completa quando il messaggio è arrivato Nella libreria MPI esistono diverse primitive di comunicazione point-to-point, che combinano le modalità di comunicazione ed i criteri di completamento

Synchronous SEND blocking: MPI_Ssend 18 Per il completamento dell operazione il sender deve essere informato dal receiver che il messaggio è stato ricevuto Gli argomenti della funzione sono gli stessi della MPI_Send Pro: è la modalità di comunicazione point-to-point più semplice ed affidabile Contro: può comportare rilevanti intervalli di tempo in cui i processi coinvolti non hanno nulla di utile da fare, se non attendere che la comunicazione sia terminata

Synchronous Send: esempio (C) 19

Buffered SEND blocking: MPI_Bsend Una buffered send è completata immediatamente, non appena il processo ha copiato il messaggio su un opportuno buffer di trasmissione Il programmatore non può assumere la presenza di un buffer di sistema allocato per eseguire l operazione, ma deve effettuare un operazione di BUFFER_ATTACH per definire un area di memoria di dimensioni opportune come buffer per il trasferimento di messaggi BUFFER_DETACH per rilasciare le aree di memoria di buffer utilizzate Pro ritorno immediato dalla primitiva di comunicazione Contro È necessaria la gestione esplicita del buffer Implica un operazione di copia in memoria dei dati da trasmettere C. Truini, M. Ippolito: MPI_2 20

In C Gestione dei buffer: MPI_Buffer_attach MPI_Buffer_attach(void *buf, int size) In Fortran MPI_BUFFER_ATTACH(BUF, SIZE, ERR) Consente al processo sender di allocare il send buffer per una successiva chiamata di MPI_Bsend Argomenti: [IN] buf è l indirizzo iniziale del buffer da allocare [IN] size è un int (INTEGER) e contiene la dimensione in byte del buffer da allocare C. Truini, M. Ippolito: MPI_2 21

In C Gestione dei buffer: MPI_Buffer_detach MPI_Buffer_detach(void *buf, int *size) In Fortran MPI_BUFFER_DETACH(BUF, SIZE, ERR) Consente di rilasciare il buffer creato con MPI_Buffer_attach Argomenti: [OUT] buf è l indirizzo iniziale del buffer da deallocare [OUT] size è un int* (INTEGER) e contiene la dimensione in byte del buffer deallocato C. Truini, M. Ippolito: MPI_2 22

#include <stdio.h> #include <mpi.h> #define MSIZE 10 Buffered Send: un esempio (C) int main(int argc, char *argv[]) { MPI_Status status; int rank, size, i, mpibuffer_length; double *mpibuffer; double vector[msize]; /* Start up MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if (rank == 0) { for (i = 0; i < MSIZE; i++) vector[i] = (double) i; mpibuffer_length = (MSIZE * sizeof(double) + MPI_BSEND_OVERHEAD); mpibuffer = (double *) malloc (mpibuffer_length); MPI_Buffer_attach(mpibuffer, mpibuffer_length); MPI_Bsend(vector, MSIZE, MPI_DOUBLE, 1, 666, MPI_COMM_WORLD); MPI_Buffer_detach(mpibuffer, &mpibuffer_length); } else if (rank == 1) { MPI_Recv(vector, MSIZE, MPI_DOUBLE, 0, 666, MPI_COMM_WORLD, &status); } /* Quit */ MPI_Finalize(); return 0; } C. Truini, M. Ippolito: MPI_2 23

24 Buffered Send: un esempio (FORTRAN)

25 Calcolo Parallelo con MPI (2 parte) Approfondimento sulle comunicazioni point-to-point Pattern di comunicazione point-to-point: sendrecv Synchronous Send Buffered Send La comunicazione non blocking Laboratorio 2

26 Modalità di comunicazione Una comunicazione tipo point-to-point può essere: Blocking: il controllo è restituito al processo che ha invocato la primitiva di comunicazione solo quando la stessa è stata completata Non blocking: il controllo è restituito al processo che ha invocato la primitiva di comunicazione quando la stessa è stata eseguita il controllo sull effettivo completamento della comunicazione deve essere fatto in seguito nel frattempo il processo può eseguire altre operazioni

27 Comunicazioni non-blocking Una comunicazione non-blocking è tipicamente costituita da tre fasi successive: 1. L inizio della operazione di send o receive del messaggio 2. Lo svolgimento di un attività che non implichi l accesso ai dati coinvolti nella operazione di comunicazione avviata 3. Controllo/attesa del completamento della comunicazione Pro Performance: una comunicazione non-blocking consente di: sovrapporre fasi di comunicazioni con fasi di calcolo ridurre gli effetti della latenza di comunicazione Le comunicazioni non-blocking evitano situazioni di deadlock Contro La programmazione di uno scambio di messaggi con funzioni di comunicazione non-blocking è (leggermente) più complicata

SEND non-blocking: MPI_Isend 28 Dopo che la spedizione è stata avviata il controllo torna al processo sender Prima di riutilizzare le aree di memoria coinvolte nella comunicazione, il processo sender deve controllare che l operazione sia stata completata, attraverso opportune funzioni della libreria MPI Anche per la send non-blocking, sono previste le diverse modalità di completamento della comunicazione

RECEIVE non-blocking : MPI_Irecv 29 Dopo che la fase di ricezione è stata avviata il controllo torna al processo receiver Prima di utilizzare in sicurezza i dati ricevuti, il processo receiver deve verificare che la ricezione sia completata, attraverso opportune funzioni della libreria MPI Una receive non-blocking può essere utilizzata per ricevere messaggi inviati sia in modalità blocking che non blocking

In C Binding di MPI_Isend e MPI_Irecv int MPI_Isend(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm, MPI_request *req) int MPI_Irecv(void *buf, int count, MPI_Datatype dtype, int src, int tag, MPI_Comm comm, MPI_request *req) In Fortran MPI_ISEND(buf, count, dtype, dest, tag, comm, req, err) MPI_IRECV(buf, count, dtype, src, tag, comm, req, err) Le funzione MPI_Isend e MPI_Irecv prevedono un argomento aggiuntivo rispetto alle MPI_Send e MPI_Recv: [OUT] un handler di tipo MPI_Request (INTEGER) è necessario per referenziare l operazione di send/receive nella fase di controllo del completamento della stessa C. Truini, M. Ippolito: MPI_2 30

Comunicazioni non blocking: completamento 31 Quando si usano comunicazioni point-to-point non blocking è essenziale assicurarsi che la fase di comunicazione sia completata per: utilizzare i dati del buffer (dal punto di vista del receiver) riutilizzare l area di memoria coinvolta nella comunicazione (dal punto di vista del sender) La libreria MPI mette a disposizione dell utente due tipi di funzionalità per il test del completamento di una comunicazione: tipo WAIT : consente di fermare l esecuzione del processo fino a quando la comunicazione in argomento non sia completata tipo TEST: ritorna al processo chiamante un valore TRUE se la comunicazione in argomento è stata completata, FALSE altrimenti

32 Binding di MPI_Wait In C int MPI_Wait(MPI_Request *request, MPI_Status *status) In Fortran MPI_WAIT (REQUEST, STATUS, ERR) Argomenti: [IN] request è l handler necessario per referenziare la comunicazione di cui attendere il completamento (INTEGER) [OUT] status conterrà lo stato (envelope) del messaggio di cui si attende il completamento (INTEGER)

33 Binding di MPI_Test In C int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status) In Fortran MPI_TEST (REQUEST, FLAG, STATUS, ERR) Argomenti [IN] [OUT] [OUT] request è l handler necessario per referenziare la comunicazione di cui controllare il completamento (INTEGER) flag conterrà TRUE se la comunicazione è stata completata, FALSE altrimenti (LOGICAL) status conterrà lo stato (envelope) del messaggio di cui si attende il completamento (INTEGER(*))

La struttura di un codice con send non blocking 34

35 Calcolo Parallelo con MPI (2 parte) Approfondimento sulle comunicazioni point-to-point Pattern di comunicazione point-to-point: sendrecv Synchronous Send Buffered Send La comunicazione non blocking Laboratorio 2

Programma della 2 sessione di laboratorio Pattern di comunicazione Shift circolare con MPI_Sendrecv (Esercizio 7) Modalità di completamento della comunicazione Uso della synchronous send, della buffered send e delle funzioni di gestione dei buffer (Esercizio 12) Uso delle funzioni di comunicazione non-blocking Non blocking circular shift (Esercizio 13) C. Truini, M. Ippolito: MPI_2 36

37 Shift Circolare periodico con MPI_Sendrecv Esercizio 7 Ogni processo genera un array A, popolandolo con interi pari al proprio rank Ogni processo invia il proprio array A al processo con rank immediatamente successivo Periodic Boundary: L ultimo processo invia l array al primo processo Ogni processo riceve l array A dal processo immediatamente precedente e lo immagazzina in un altro array B. Periodic Boundary: il primo processo riceve l array dall ultimo processo Le comunicazioni devono essere di tipo Sendrecv

Funzioni per il timing: MPI_Wtime e MPI_Wtick È importante conoscere il tempo impiegato dal codice nelle singole parti per poter analizzare le performance MPI_Wtime: fornisce il numero floating-point di secondi intercorso tra due sue chiamate successive double starttime, endtime; starttime = MPI_Wtime();... stuff to be timed... endtime = MPI_Wtime(); printf("that took %f seconds\n",endtime-starttime); MPI_Wtick: ritorna la precisione di MPI_Wtime, cioè ritorna 10 ³ se il contatore è incrementato ogni millesimo di secondo. NOTA: anche in FORTRAN sono funzioni C. Truini, M. Ippolito: MPI_2 38

Synchronous Send blocking Esercizio 12 Modificare il codice dell Esercizio 2, utilizzando la funzione MPI_Ssend per la spedizione di un array di float Misurare il tempo impiegato nella MPI_Ssend usando la funzione MPI_Wtime C. Truini, M. Ippolito: MPI_2 39

Buffered Send blocking Esercizio 12 Modificare l Esercizio 2, utilizzando la funzione MPI_Bsend per spedire un array di float N.B.: la MPI_Bsend prevede la gestione diretta del buffer di comunicazione da parte del programmatore Misurare il tempo impiegato nella MPI_Bsend usando la funzione MPI_Wtime C. Truini, M. Ippolito: MPI_2 40

Circular Shift non-blocking Esercizio 13 Modificare il codice dello shift circolare periodico in versione naive (Esercizio 6) utilizzando le funzioni di comunicazione non-blocking per evitare la condizione deadlock per N=5000 C. Truini, M. Ippolito: MPI_2 41