Alcuni strumenti per lo sviluppo di software su architetture MIMD

Documenti analoghi
Alcuni strumenti per lo sviluppo di software su architetture MIMD

MPI è una libreria che comprende:

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

Funzioni. Il modello console. Interfaccia in modalità console

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Una interfaccia GA ad alcune routines di ScaLAPACK

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

TUTORATO di LINGUAGGI I

Processi in Linux. Stru/ura file eseguibili

Comunicazione tra Processi

Comunicazione tra Processi

Somma di un array di N numeri in MPI

Esempi di Applicazioni Parallele e di Metodologie di parallelizzazione

Sistemi Operativi. Lez. 13: primitive per la concorrenza monitor e messaggi

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Si digita login e password e si clicca su accedi. Si apre la finestra di collegamento:

Processi UNIX. I Processi nel SO UNIX. Gerarchie di processi UNIX. Modello di processo in UNIX

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Esempio 1: stampa locale di file remoto

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Introduzione al calcolo scientifico ad alte prestazioni

ENEA GRID. CRESCO: Corso di introduzione. Autore: Alessandro Secco

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

ENEA GRID. Corso di introduzione all'uso ed all'amministrazione. Autore: Alessandro Secco

Introduzione al Linguaggio C

Linguaggio C. Fondamenti. Struttura di un programma.

Introduzione a GCC: GNU Compiler Collection

AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema

Fondamenti di Informatica 2

Creare una funzione float square(float x). La funzione deve restituire il quadrato del parametro x.

Prodotto Matrice - Vettore in OpenMP

Openmosix e Beowulf: introduzione e confronto

Problem solving avanzato

Chiamate di sistema per la Gestione dei processi in POSIX. E.Mumolo, DEEI

Cos è una stringa (1) Stringhe. Leggere e scrivere stringhe (1) Cos è una stringa (2) DD Cap. 8 pp KP Cap. 6 pp

Parallelizzazione Laplace 2D: MPI e MPI+OMP. - Cineca - SuperComputing Applications and Innovation Department

Esercizi di programmazione in C

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

maurizio pizzonia sicurezza dei sistemi informatici e delle reti. esercizi su vulnerabilità del software e delle reti

Elettronica dei Sistemi Programmabili A.A Microcontrollori. Introduzione allo sviluppo di progetti

Introduzione al linguaggio C Gli array

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

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

Alcune regole di base per scrivere un programma in linguaggio C

Informatica Medica C++ Informatica Medica I semestre Docenti: Fabio Solari e Manuela Chessa. Sviluppo di un applicazione eseguibile

Esercitazione 7. Procedure e Funzioni

Bloodshed Dev-C++ è l IDE usato durante le esercitazioni/laboratorio. IDE = Integrated Development Environment

Gestione di files Motivazioni

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

Introduzione. Laboratorio di Calcolo Corso di Laurea in Fisica. Università degli Studi di Roma La Sapienza

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Algoritmi paralleli per la moltiplicazione di matrici

Linguaggio C - Funzioni

Lab. di Sistemi Operativi - Esercitazione n 7- -Gestione dei processi Unix-

Sistemi Operativi. Esercitazione 2 Compilazione, Makefile e Processi

Ricerca sequenziale di un elemento in un vettore

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

2) FILE BINARI: è una sequenza di byte avente una corrispondenza uno a uno con la sequenza ricevuta dal dispositivo esterno.

2. I THREAD. 2.1 Introduzione

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ&

SAP Manuale del firmatario DocuSign

Gestione dei processi

Java Native Interface Appunti

Comunicazione. Prof. Antonino Mazzeo. Corso di Laurea Specialistica in Ingegneria Informatica

SMARTFAX Quick Start

IL LINGUAGGIO C++ Configurazione di Dev-C++

Esame di Informatica Generale 25 giugno 2012 Professori: Carulli, Fiorino. Docente Risultati Scritto Fiorino Carulli

Obiettivi d esame PHP Developer Fundamentals on MySQL Environment

Una prima applicazione in C per l utilizzo delle socket

Introduzione alla programmazione in C

MAGAZZINO.CPP January 2, 2008 Page 1

SOLUZIONE ESERCIZIO 1

Processi e thread. Dipartimento di Informatica Università di Verona, Italy. Sommario

APPLICAZIONI SU PIU FILE

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

I thread nel sistema operativo LINUX: Linuxthreads

puntatori Lab. Calc. AA 2007/08 1

Sistemi Operativi Anno Accademico 2011/2012. Segnali: Interrupt software per la gestione di eventi asincroni

Politecnico di Torino

Corso di Laboratorio di Sistemi Operativi

I/O su Socket TCP: read()

FUNZIONI. La libreria standard del C fornisce una ricca collezione di funzioni, come le funzioni:

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Verifica che una grammatica sia Context Free nel GrammaReader

Bontà dei dati in ingresso

I puntatori e l allocazione dinamica di memoria

RICORSIONE - schema ricorsivo (o induttivo) si esegue l'azione S, su un insieme di dati D, mediante eventuale esecuzione di

Guida all utilizzo del compilatore lcc-win32 per creare una applicazione console

Gestione dei processi

Sicurezza dei Sistemi Informatici Esercitazioni OpenSSL

Transcript:

Alcuni strumenti per lo sviluppo di software su architetture MIMD

Calcolatori MIMD Architetture SM (Shared Memory) OpenMP Architetture DM (Distributed Memory) MPI 2

MPI : Message Passing Interface MPI 3

Paradigma del message passing Processore 0 Processore 1 Processore N memory memory memory CPU CPU CPU Network Sistema a memoria distribuita Ogni processore ha una propria memoria locale alla quale accede direttamente. Ogni processore può conoscere i dati in memoria di un altro processore o far conoscere i propri, attraverso il trasferimento di dati. 4

Definizione: message passing ogni processore può conoscere i dati nella memoria di un altro processore o far conoscere i propri, attraverso il trasferimento di dati. Message Passing : modello per la progettazione di software in ambiente di Calcolo Parallelo. 5

Lo standard La necessità di rendere portabile il modello Message Passing ha condotto alla definizione e all implementazione di un ambiente standard. Message Passing Interface MPI 6

Per cominciare int main() { sum=0; for i= 0 to 14 do sum=sum+a[i]; endfor return 0; } In ambiente MPI un programma è visto come un insieme di componenti (o processi) concorrenti main() { Componente 1 sum=0; for i=0 to 4 do sum=sum+a[i]; endfor return 0; } main() { Componente 2 sum=0; for i=5 to 9 do sum=sum+a[i]; endfor return 0; } main() { Componente 3 sum=0; for i=10 to 14do sum=sum+a[i]; endfor return 0; } 7

In MPI i processori sono raggruppati in.: Gruppo 8

Gruppi e Componenti MPI : 0 0 0 1 2 1 1 2 Alunni Processori Attività Componente 9

Gruppi e Componenti MPI : 1 0 2 0 3 1 Alunni 0 1 2 Gruppi 10

Alcuni concetti di base: GRUPPO Componente 1 Componente 2 Componente n P 0 P 1 P 0 P 0 P 1 P 2 Ogni componente concorrente del programma viene affidata ad un gruppo di processori. In ciascun gruppo ad ogni processore è associato un identificativo. L identificativo è un intero, compreso tra 0 ed il numero totale di processori appartenenti ad un gruppo decrementato di una unità. Processori appartenenti a uno o più gruppi possono avere identificativi diversi, ciascuno relativo ad uno specifico gruppo 11

In MPI i processori sono raggruppati in.: Gruppo Contesto 12

Il CONTESTO MPI : 0 0 0 1 1 2 1 2 Aula A Aula B Aula C CONTESTI GRUPPI 13

Alcuni concetti di base: CONTESTO Componente 1 Componente 2 Componente n P 0 P 1 P 0 P 0 P 1 P 2 Contesto 1 Contesto 2 Contesto n A ciascun gruppo di processori viene attribuito un identificativo detto contesto. Ilcontesto definisce l ambito in cui avvengono le comunicazioni tra processori di uno stesso gruppo. Se la spedizione di un messaggio avviene in un contesto, la ricezione deve avvenire nello stesso contesto. 14

In MPI i processori sono raggruppati in.: Gruppo Contesto Communicator 15

Il Communicator MPI : 0 1 2 1 0 1 3 0 2 1 2 Aula A Aula B Aula C + + + Linea 1 Linea 2 Linea 3 = = = COMMUNICATOR_A1 CONTESTI COMMUNICATOR_B2 COMMUNICATOR_C3 16

Alcuni concetti di base: COMMUNICATOR Componente 1 Componente 2 Componente n P 0 P 1 P 0 P 0 P 1 P 2 Contesto 1 Contesto 2 Contesto n Communicator_1 Communicator_2 Communicator_n Ad un gruppo di processori appartenenti ad uno stesso contesto viene assegnato un ulteriore identificativo: il communicator. Ilcommunicator racchiude tutte le caratteristiche dell ambiente di comunicazione: topologia, quali contesti coinvolge, ecc 17

Alcuni concetti di base: COMMUNICATOR Componente 1 Componente 2 Componente n P 0 P 1 P 0 P 0 P 1 P 2 Communicator_1 Communicator_2 Communicator_m Esistono due tipi principali di communicator. L intra-communicator in cui le comunicazioni avvengono all interno di un gruppo di processori. 18

Alcuni concetti di base: COMMUNICATOR Componente 1 Componente 2 Componente n P 0 P 1 P 0 P 0 P 1 P 2 Communicator_1 Communicator_2 Esistono due tipi principali di communicator. L intra-communicator in cui le comunicazioni avvengono all interno di un gruppo di processori. L inter-communicator in cui le comunicazioni avvengono tra gruppi di processori. 19

Alcuni concetti di base: COMMUNICATOR Componente 1 Componente 2 Componente n P 0 P 1 P 0 P 0 P 1 P 2 Contesto 1 Contesto 2 Contesto m Communicator_1 Communicator_2 Communicator_m MPI_COMM_WORLD Tutti i processori fanno parte per default di un unico communicator detto MPI_COMM_WORLD. 20

Le funzioni di MPI MPI è una libreria che comprende: Funzioni per definire l ambiente Funzioni percomunicazioni uno a uno Funzioni percomunicazioni collettive Funzioni peroperazioni collettive 21

MPI : Le funzioni dell ambiente. 22

Un semplice programma : #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int menum, nproc; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&menum); MPI_Comm_size(MPI_COMM_WORLD,&nproc); } printf( Sono %d di %d\n,menum,nproc); MPI_Finalize(); return 0; Tutti i processori di MPI_COMM_WORLD stampano a video il proprio identificativo menum ed il numero di processori nproc. 23

Nel programma : #include mpi.h mpi.h : Header File Il file contiene alcune direttive necessarie al processore per l utilizzo dell MPI 24

Nel programma : #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int menum, nproc; MPI_Init(&argc,&argv); } MPI_Comm_rank(MPI_COMM_WORLD,&menum); MPI_Comm_size(MPI_COMM_WORLD,&nproc); printf( Sono %d di %d\n,menum,nproc); MPI_Finalize(); return 0; Tutti i processori di MPI_COMM_WORLD stampano a video il proprio identificativo menum ed il numero di processori nproc. 25

Nel programma : MPI_Init(&argc,&argv); Inizializza l ambiente di esecuzione MPI Inizializza il communicator MPI_COMMON_WORLD I due dati di input: argc ed argv sono gli argomenti del main 26

In generale : MPI_Init(int *argc, char ***argv); Input: argc, **argv; Questa routine inizializza l ambiente di esecuzione di MPI. Deve essere chiamata una sola volta, prima di ogni altra routine MPI. Definisce l insieme dei processori attivati (communicator). 27

Nel programma : #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int menum, nproc; MPI_Init(&argc,&argv); } MPI_Comm_rank(MPI_COMM_WORLD,&menum); MPI_Comm_size(MPI_COMM_WORLD,&nproc); printf( Sono %d di %d\n,menum,nproc); MPI_Finalize(); return 0; Tutti i processori di MPI_COMM_WORLD stamperanno sul video il proprio identificativo menum ed il numero di processori nproc. 28

Nel programma : MPI_Finalize(); Questa routine determina la fine del programma MPI. Dopo questa routine non è possibile richiamare nessun altra routine di MPI. 29

Nel programma : #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int menum, nproc; MPI_Init(&argc,&argv); } MPI_Comm_rank(MPI_COMM_WORLD,&menum); MPI_Comm_size(MPI_COMM_WORLD,&nproc); printf( Sono %d di %d\n,menum,nproc); MPI_Finalize(); return 0; Tutti i processori di MPI_COMM_WORLD stamperanno sul video il proprio identificativo menum ed il numero di processori nproc. 30

Nel programma : MPI_Comm_rank(MPI_COMM_WORLD,&menum); Questa routine permette al processore chiamante, appartenente al communicator MPI_COMM_WORLD, di memorizzare il proprio identificativo nella variabile menum. 31

In generale : MPI_Comm_rank(MPI_Comm comm, int *menum); Input: comm ; Output: menum. Fornisce ad ogni processore del communicator comm l identificativo menum. 32

Nel programma : #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int menum, nproc; MPI_Init(&argc,&argv); } MPI_Comm_rank(MPI_COMM_WORLD,&menum); MPI_Comm_size(MPI_COMM_WORLD,&nproc); printf( Sono %d di %d\n,menum,nproc); MPI_Finalize(); return 0; Tutti i processori di MPI_COMM_WORLD stamperanno sul video il proprio identificativo menum ed il numero di processori nproc. 33

Nel programma : MPI_Comm_size(MPI_COMM_WORLD,&nproc); Questa routine permette al processore chiamante di memorizzare nella variabile nproc il numero totale dei processori concorrenti appartenenti al communicator MPI_COMM_WORLD. 34

In generale : MPI_Comm_size(MPI_Comm comm, int *nproc); Input: comm ; Output: nproc. Ad ogni processore del communicator comm, restituisce in nproc, il numero totale di processori che costituiscono comm. Permette di conoscere quanti processori concorrenti possono essere utilizzati per una determinata operazione. 35

La comunicazione di un messaggio La comunicazione di un messaggio può coinvolgere due o più processori. Per comunicazioni che coinvolgono solo due processori Si considerano funzioni MPI per comunicazioni uno a uno Per comunicazioni che coinvolgono più processori Si considerano funzioni MPI per comunicazioni collettive 36

MPI : Comunicazione di un messaggio uno a uno 37

Il Communicator MPI : Dove sono i dati x? 0 PROBLEMA: P 2 vuole inviare i dati x a P 1 Quanti sono i dati x? 1 2 La comunicazione non riesce!! Di che tipo sono i dati x? OK!!?? I Pdati 1 ricevi x sono i dati sullo scaffale, xsono 5 e sono degli avvisi COMMUNICATOR_A1 Comunicazione Riuscita! 38

Caratteristiche di un messaggio Un dato che deve essere spedito o ricevuto attraverso un messaggio di MPI è descritto dalla seguente tripla (address, count, datatype) Indirizzo in memoria del dato Tipo del dato Dimensione del dato Un datatype di MPI è predefinito e corrisponde univocamente ad un tipo di dato del linguaggio di programmazione utilizzato. 39

Esempio 1: linguaggio C Ogni tipo di dato di MPI corrisponde univocamente ad un tipo di dato del linguaggio C. MPI datatype MPI_INT MPI_FLOAT MPI_DOUBLE MPI_CHAR C datatype int float double char 40

Esempio 2: linguaggio Fortran Ogni tipo di dato di MPI corrisponde univocamente ad un tipo di dato del linguaggio Fortran. MPI datatype MPI_INT MPI_FLOAT MPI_DOUBLE MPI_CHAR MPI_LOGICAL Fortran datatype integer real double precision character logical 41

Tipi di comunicazioni ( Esempio 1 ) : Trasmissione di un fax Il fax trasmittente termina l operazione quando il fax ricevente ha ricevuto completamente il messaggio. beep!!! L operazione di ricezione del messaggio è stata completata. 42

Tipi di comunicazioni ( Esempio 2 ) : Spedizione di una lettera tramite servizio postale Il mittente spedisce la lettera, ma non può sapere se è stata ricevuta.? Il mittente non sa se l operazione di ricezione del messaggio è stata completata. 43

Tipi di comunicazioni: La spedizione o la ricezione di un messaggio da parte di un processore può essere bloccante o non bloccante Se un processore esegue una comunicazione bloccante si arresta fino a conclusione dell operazione. Se un processore esegue una comunicazione non bloccante prosegue senza preoccuparsi della conclusione dell operazione. 44

Comunicazioni bloccanti in MPI Funzione bloccante per la spedizione di un messaggio: MPI_Send Funzione bloccante per la ricezione di un messaggio: MPI_Recv 45

Un semplice programma con 2 processori: #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int menum, nproc; int n, tag, num; MPI_Status info; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&menum); if(menum==0) { scanf( %d,&n); tag=10; MPI_Send(&n,1,MPI_INT,1,tag,MPI_COMM_WORLD); }else { tag=10; MPI_Recv(&n,1,MPI_INT,0,tag,MPI_COMM_WORLD,&info); } MPI_Get_count(&info,MPI_INT,&num); MPI_Finalize(); return 0; } 46

Nel programma : MPI_Send(&n,1,MPI_INT,1,tag,MPI_COMM_WORLD); Con questa routine il processore chiamante P 0 spedisce il parametro n, di tipo MPI_INT e di dimensione 1, al processore P 1 ; i due processori appartengono entrambi al communicator MPI_COMM_WORLD. Il parametro tag individua univocamente tale spedizione. n n n P 0 P 1 47

In generale (comunicazione uno ad uno bloccante) : MPI_Send(void *buffer, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm); Il processore che esegue questa routine spedisce i primi count elementi di buffer, di tipo datatype, al processore con identificativo dest. L identificativo tag individua univocamente il messaggio nel contesto comm. 48

In dettaglio MPI_Send(void *buffer, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm); *buffer indirizzo del dato da spedire count numero dei dati da spedire datatype tipo dei dati da spedire dest comm tag identificativo del processore destinatario identificativo del communicator identificativo del messaggio 49

Un semplice programma con 2 processori: #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int menum, nproc; int n, tag, num; MPI_Status info; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&menum); if(menum==0) { scanf( %d,&n); tag=10; MPI_Send(&n,1,MPI_INT,1,tag,MPI_COMM_WORLD); }else { tag=10; MPI_Recv(&n,1,MPI_INT,0,tag,MPI_COMM_WORLD,&info); } MPI_Get_count(&info,MPI_INT,&num); MPI_Finalize(); return 0; } 50

Nel programma : MPI_Recv(&n,1,MPI_INT,0,tag,MPI_COMM_WORLD,&info); Con questa routine il processore chiamante P 1 riceve il parametro n, di tipo MPI_INT e di dimensione 1, dal processore P 0 ; i due processori appartengono entrambi al communicator MPI_COMM_WORLD. Il parametro tag individua univocamente tale spedizione. Il parametro info, di tipo MPI_Status, contiene informazioni sulla ricezione del messaggio. n n P 1 P 0 n 51

In generale (comunicazione uno ad uno bloccante) : MPI_Recv(void *buffer, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status); Il processore che esegue questa routine riceve i primi count elementi in buffer, del tipo datatype, dal processore con identificativo source. L identificativo tag individua univocamente il messaggio in comm. status è un tipo predefinito di MPI che racchiude informazioni sulla ricezione del messaggio. 52

In dettaglio MPI_Recv(void *buffer, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status); *buffer indirizzo del dato in cui ricevere count numero dei dati da ricevere datatype tipo dei dati da ricevere source comm identificativo del processore da cui ricevere identificativo del communicator tag identificativo del messaggio 53

Un semplice programma con 2 processori: #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int menum, nproc; int n, tag, num; MPI_Status info; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&menum); if(menum==0) { scanf( %d,&n); tag=10; MPI_Send(&n,1,MPI_INT,1,tag,MPI_COMM_WORLD); }else { tag=10; MPI_Recv(&n,1,MPI_INT,0,tag,MPI_COMM_WORLD,&info); MPI_Get_count(&info,MPI_INT,&num); } MPI_Finalize(); return 0; } 54

Nel programma : MPI_Get_count(&info,MPI_INT,&num); num : numero di elementi ricevuti Questa routine permette al processore chiamante di conoscere il numero, num, di elementi ricevuti, di tipo MPI_INT, nella spedizione individuata da info. P 0 P num num 1 =1 =1 55

In Generale : MPI_GET_COUNT(MPI_Status *status MPI_Datatype datatype, int *count); MPI_Status in C è un tipo di dato strutturato, composto da tre campi: - identificativo del processore da cui ricevere - identificativo del messaggio - indicatore di errore Il processore che esegue questa routine, memorizza nella variabile count il numero di elementi, di tipo datatype, che riceve dal messaggio e dal processore indicati nella variabile status. 56

Comunicazioni non bloccanti in MPI: modalità Immediate Funzione non bloccante per la spedizione di un messaggio: MPI_Isend Funzione non bloccante per la ricezione di un messaggio: MPI_Irecv 57

Un semplice programma con 2 processori: #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int menum, nproc, n, tag; MPI_Request rqst; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&menum); if(menum==0) { scanf( %d,&n); tag=20; MPI_Isend(&n,1,MPI_INT,1,tag,MPI_COMM_WORLD,&rqst); }else { tag=20; MPI_Irecv(&n,1,MPI_INT,0,tag,MPI_COMM_WORLD,&rqst); } MPI_Finalize(); return 0; } 58

Nel programma : MPI_Isend(&n,1,MPI_INT,1,tag,MPI_COMM_WORLD,&rqst); Il processore chiamante P 0 spedisce il parametro n, di tipo MPI_INT e di dimensione 1, al processore P 1 ; i due processori appartengono entrambi al communicator MPI_COMM_WORLD. Il parametro tag idividua univocamente tale spedizione. Il parametro rqst contiene le informazioni dell intera spedizione. Il processore P 0, appena inviato il parametro n, è libero di procedere nelle successive istruzioni. n n P 0 P 1 n 59

In generale (comunicazione uno ad uno non bloccante) : MPI_Isend(void *buffer, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request); Il processore che esegue questa routine spedisce i primi count elementi di buffer, del tipo datatype, al processore con identificativo dest. L identificativo tag individua univocamente il messaggio in comm. L oggetto request crea un nesso tra la trasmissione e la ricezione del messaggio 60

Un semplice programma con 2 processori: #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int menum, nproc, n, tag; MPI_Request rqst; } MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&menum); if(menum==0) { scanf( %d,&n); tag=20; MPI_Isend(&n,1,MPI_INT,1,tag,MPI_COMM_WORLD,&rqst); }else { tag=20; MPI_Irecv(&n,1,MPI_INT,0,tag,MPI_COMM_WORLD,&rqst); } MPI_Finalize(); return 0; 61

Nel programma : MPI_Irecv(&n,1,MPI_INT,0,tag,MPI_COMM_WORLD,&rqst); Il processore chiamante P 1 riceve il parametro n, di tipo MPI_INT e di dimensione 1, dal processore P 0 ; i due processori appartengono entrambi al communicator MPI_COMM_WORLD. Il parametro tag individua univocamente tale ricezione. Il parametro rqst contiene le informazioni dell intera spedizione. Il processore P 1, appena ricevuto il parametro n, è libero di procedere nelle successive istruzioni. n n n P 1 P 0 62

Ricezione di un messaggio (comunicazione uno ad uno) MPI_Irecv(void *buffer, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request); Il processore che esegue questa routine riceve i primi count elementi in buffer, del tipo datatype, dal processore con identificativo source. L identificativo tag individua univocamente il messaggio in comm. L oggetto request crea un nesso tra la trasmissione e la ricezione del messaggio. 63

In particolare: request Le operazioni non bloccanti utilizzano l oggetto request di un tipo predefinito di MPI: MPI_Request. Tale oggetto collega l operazione che inizia la comunicazione in esame con l operazione che la termina. 64

Osservazione L oggetto request ha nelle comunicazioni, un ruolo simile a quello di status. status contiene informazioni sulla ricezione del messaggio. request contiene informazioni su tutta la fase di trasmissione o di ricezione del messaggio. 65

Osservazione: termine di un operazione non bloccante Un'operazione non bloccante è terminata quando: Nel caso della spedizione, quando il buffer è nuovamente riutilizzabile dal programma. Nel caso della ricezione quando il messaggio è stato interamente ricevuto. 66

Osservazione: termine di un operazione non bloccante 5 3 2 7 5 3 2 7 Vettore x da spedire Vettore x da ricevere Operazione di spedizione non bloccante terminata Operazione di ricezione non bloccante terminata 67

Domanda Utilizzando una comunicazione non bloccante come si fa a sapere se l operazione di spedizione o di ricezione è stata terminata? 68

Risposta MPI mette a disposizione delle funzioni per controllare tutta la fase di trasmissione di un messaggio mediante comunicazione non bloccante. 69

Controllo sullo stato di un operazione non bloccante #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int flag,nloc; nloc=1; if(menum==0) { scanf( %d,&n); tag=20; MPI_Isend(&n,1,MPI_INT,1,tag,MPI_COMM_WORLD,&rqst); } if(menum!=0) { tag=20; MPI_Irecv(&n,1,MPI_INT,0,tag,MPI_COMM_WORLD,&rqst); MPI_Test(&rqst,&flag,&info); if(flag==1){ nloc+=n;}else{ MPI_Wait(&rqst,&info); nloc+=n;} printf( nloc=%d \n,nloc); }} } 70

Nel programma : MPI_Test(&rqst,&flag,&info); Il processore chiamante P 1 verifica se la ricezione di n, individuata da rqst, è stata completata; in questo caso flag=1 e procede all incremento di nloc. Altrimenti flag=0. Caso flag=1 Flag? Flag=1 n n n P 1 71

Nel programma : Caso flag=0 Flag? Flag=0 n n n P 1 72

Controllo sullo stato di un operazione non bloccante MPI_Test(MPI_Request *request, int *flag, MPI_Status *status); Il processore che esegue questa routine testa lo stato della comunicazione non bloccante, identificata da request. La funzione MPI_Test ritorna l intero flag: flag = 1, l operazione identificata da request è terminata; flag = 0, l operazione identificata da request NON è terminata; 73

Controllo sullo stato di un operazione non bloccante #include <stdio.h> #include mpi.h int main(int argc, char *argv[]) { int flag,nloc; nloc=1; if(menum==0) { scanf( %d,&n); tag=20; MPI_Isend(&n,1,MPI_INT,1,tag,MPI_COMM_WORLD,&rqst); } if(menum!=0) { tag=20; MPI_Irecv(&n,1,MPI_INT,0,tag,MPI_COMM_WORLD,&rqst); MPI_Test(&rqst,&flag,&info); if(flag==1){ nloc+=n;}else{ MPI_Wait(&rqst,&info); nloc+=n;} printf( nloc=%d \n,nloc); } } 74

Nel programma : MPI_Wait(&rqst,&info); Il processore chiamante P 1 procede nelle istruzioni solo quando la ricezione di n è stata completata. P 1 Procedi Alt! n n n 75

In generale : MPI_Wait(MPI_Request *request, MPI_Status *status); Il processore che esegue questa routine controlla lo stato della comunicazione non bloccante, identificata da request, e si arresta solo quando l operazione in esame si è conclusa. In status si hanno informazioni sul completamento dell operazione di Wait. 76

Vantaggi delle operazioni non bloccanti Le comunicazioni di tipo non bloccante hanno DUE vantaggi: 1) Il processore non è obbligato ad aspettare in stato di attesa. if(menum==0) { scanf( %d,&n); tag=20; MPI_Isend(&n,1,MPI_INT,1,tag,MPI_COMM_WORLD,&rqst); } /* P 0 può procedere nelle operazioni senza dover attendere il risultato della spedizione di n al processore P 1 */ if(menum!=0) { } 77

Vantaggi delle operazioni non bloccanti 2) Più comunicazioni possono avere luogo contemporaneamente sovrapponendosi almeno in parte tra loro. if(menum==0) { /* P 0 spedisce due elementi a P 1 */ MPI_Isend(&a,1,MPI_INT,1,0,MPI_COMM_WPRLD,&rqst1); MPI_Isend(&b,1,MPI_INT,1,0,MPI_COMM_WORLD,&rqst2); } elseif(menum==1) { /* P 1 riceve due elementi da P 0 secondo l ordine di spedizione*/ MPI_Irecv(&a,1,MPI_INT,0,0,MPI_COMM_WORLD,&rqst1); MPI_Irecv(&b,1,MPI_INT,0,0,MPI_COMM_WORLD,&rqst2); } 78

Dove recuperare MPI www-unix.mcs.anl.gov/mpi/ 79

Dove recuperare MPI www-unix.mcs.anl.gov/mpi/ 80

Esplorazione directory MPI mpich bin doc etc examples include lib man www mpichman.ps mpichman.pdf mpicc mpif77 mpirun mpiman mpif77.conf cpi.c cpip.c pi3.f mpi.h mpif.h mpe.h libmpich.a libfmpich.a man1 man3 man4 index.html www1 www3 www4 Alcuni Una Manuali programmi guida facili Alcuni Le in esempi in librerie Le formato Gli file essenziali pagine header-file di di configurazione di sviluppo html ps software man per e di pdf di l utilizzo tutte di MPI di di software le MPI di routine MPI di e MPE MPI con MPI MPI