AA 2016/2017. MPI: concetti di base

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "AA 2016/2017. MPI: concetti di base"

Transcript

1 Corso di Laurea Magistrale in Informatica Dipartimento di Scienze Fisiche, Informatiche e Matematiche Titolare del corso: prof. Marko Bertogna (marko.bertogna@unimore.it) AA 2016/2017 MPI: concetti di base

2 Attività di laboratorio Lab Zironi, primo piano dipartimento di Matematica. imac Linux (Ubuntu 16.04) username: calcparx password: Collegarsi con ssh (usando username e passwd forniti) a aulad??.hpc.unimo.it (con??= ). Spostarsi nella dir /HOME/calcparX/CALCPARMAG1617. Creare qui una dir nome.cognome. Per scrivere un sorgente si può utilizzare vi da remoto (o altri editor disponibili, come gedit, nedit, emacs), oppure scrivere in locale e trasferire il file con scp. Per compilare un sorgente seriale: icc o eseguibile sorgente.c Per lanciarlo:./eseguibile Useremo il compilatore intel

3 Attività di laboratorio Per compilare un sorgente parallelo linkando automaticamente le librerie mpi: mpiicc o eseguibile sorgente.c Per lanciare un eseguibile parallelo su 4 processori: mpirun np 4 eseguibile

4 Installare libreria MPI sul vostro computer Quasi tutte le distribuzioni linux hanno una implementazione pacchettizata del paragima MPI. Su distribuzioni Debian-based installare la libreria è davvero facile: apt-get install mpich In seguito per questa implementazione (non Intel) basterà compilare con il comando: mpicc o eseguibile sorgente.c (!!! Non mpiicc!!!) E per lanciare un eseguibile parallelo su 4 processori (come in lab): mpirun np 4 eseguibile (alcune volte mpiexec ) Nonostante la diversità dei compilatori il codice che impareremo a sviluppare è completamente portabile. Potrete quindi sviluppare comodamente i vostri algoritmi a casa e testarli sulle macchine solo per ottenere performance migliori.

5 Lo standard MPI Dalla seconda metà degli anni 90 le macchine parallele hanno cominciato a diffondersi al di fuori dei loro ambienti tradizionali: in centri di ricerca e università più piccole, in aziende private, in enti pubblici. CAUSA EFFETTO I costi sono sensibilmente diminuiti. Inoltre l aumento della velocità di interconnessione delle reti LAN ha fatto sì che diventasse ragionevole anche pensare a PC connessi in rete locale come a macchine per il calcolo parallelo. Infine si sta cominciando a pensare di utilizzare macchine collegate in reti WAN come server di calcolo distribuito (grid). L hardware c è, o almeno siamo sulla buona strada.

6 Lo standard MPI La ricerca di algoritmi paralleli è attualmente un settore molto fertile. Il parallelismo di un codice può nascere: dalla fisica (processi indipendenti), dalla matematica (set indipendenti di operazioni matematiche), dalla fantasia del programmatore. Se hardware e algoritmi ci sono, perché i programmi paralleli sono poco diffusi? L ostacolo principale alla diffusione di codici paralleli è (stata) la loro difficoltà di sviluppo. Il collo di bottiglia è il software: è spesso faticoso e laborioso (quindi costoso) sviluppare un codice parallelo e se poi questo non è portabile potrebbe non valerne la pena. Lo standard MPI è nato da questa esigenza di portabilità e semplicità. Si tratta di librerie oggi molto diffuse che si presentano al programmatore di un linguaggio ad alto livello (FORTRAN, FORTRAN90, C, C++) con un set di chiamate standard, indipendenti dalla specifica implementazione e dall hardware su cui girano.

7 Lo standard MPI Il modello computazionale che realizzano è quello MESSAGE PASSING. Altre possibilità sono quelli DATA PARALLEL (HPF, OpenMP) e SHARED MEMORY (OpenMP, ShMem). Attenzione a non confondere il modello computazionale (o di programmazione) con con quello architetturale che descrive la macchina (SIMD, MIMD UMA, ecc ). Nel modello MESSAGE PASSING si suppone che ogni processo abbia una memoria locale (anche se fisicamente può non essere così) e che non possa accedere direttamente alla memoria degli altri processi. M P X M P N M P M P M P Questo è vero anche se fisicamente la macchina è SMP M P N M P M P M P

8 Lo standard MPI I vantaggi del modello MESSAGE PASSING sono: Universalità E naturale usarlo in ambienti eterogenei, in cui i PE sono diversi, Facilità di debugging Gli errori più comuni in un programma parallelo consistono nella sovrascrittura involontaria della memoria. Il modello MP costringe a esplicitare ogni processo di comunicazione da ambo le parti. Performance Agevola lo sfruttamento della struttura multi-livello della memoria evitando (o riducendo) problemi quali la coerenza di cache. L MPI Forum dal 1992 ha lavorato per standardizzare le librerie MPI. La pagina di riferimento è (vedere sito del corso) L MPI è uno standard. Noi useremo una specifica implementazione: le librerie MPICH.

9 MPI: i concetti di base Il codice sorgente che scriviamo è uno solo. L eseguibile è comune a tutti i processi e sarà caricato da uno speciale loader su ogni PE. Ogni processo conosce (tramite una chiamata di libreria) il numero del PE su cui sta girando. Il programmatore prevede esplicitamente (nel codice ad es. con IF ) il branching in modo che ogni PE esegua la propria parte di codice. Ogni volta che un processo deve scambiare dati con un altro occorre introdurre istruzioni di send e receive (o di broadcast, riduzione, ecc ) esplicite in entrambi. E possibile anche includere punti di sincronizzazione in modo che i processi si aspettino ad una data istruzione e ripartano insieme. Programmeremo quindi usando un modello SPMD (Single-Program Multiple Data) su una architettura MIMD

10 MPI: i concetti di base Prima di usare una chiamata (subroutine o funzione) ad una libreria MPI occorre inizializzare le librerie con MPI_Init Quando non servono più (o alla fine del programma) occorre dichiarare il termine del loro uso con MPI_Finalize Ecco un programma banale che non usa le MPI ma le inizializza e termina.. #include <stdio.h> #include "mpi.h" int main( int argc, char *argv[] ) { } MPI_Init( &argc, &argv ); printf( "Hello world \n" ); MPI_Finalize(); return 0;

11 MPI: i concetti di base #include <stdio.h> #include "mpi.h" int main( int argc, char *argv[] ) { } MPI_Init( &argc, &argv ); printf( "Hello world \n" ); MPI_Finalize(); return 0; occorre includere mpi.h le chiamate sono funzioni l error-code è il valore della funzione gli arg di MPI_Init sono gli indirizzi degli arg del main vari argomenti sono tipi specifici (MPI_Comm, MPI_Datatype, ) I nomi delle chiamate e gli argomenti sono gli stessi (a parte poche eccezioni).

12 MPI: i concetti di base Il modulo (.mod) o l header (.h) MPI contengono la dichiarazione e definizione di varie costanti indispensabili per l uso delle MPI. La lista completa è parte dello standard Ad esempio le costanti che indicano gli error-code sono: MPI_SUCCESS MPI_ERR_BUFFER MPI_ERR_COUNT MPI_ERR_TYPE MPI_ERR_TAG MPI_ERR_COMM MPI_ERR_RANK MPI_ERR_REQUEST MPI_ERR_ROOT MPI_ERR_GROUP MPI_ERR_OP MPI_ERR_TOPOLOGY MPI_ERR_DIMS MPI_ERR_ARG MPI_ERR_UNKNOWN MPI_ERR_TRUNCATE MPI_ERR_OTHER MPI_ERR_INTERN MPI_PENDING MPI_ERR_IN_STATUS MPI_ERR_LASTCODE Se in valore della funzione è MPI_SUCESS si è verificato un errore nella routine di libreria (e il programma di default abortisce).

13 MPI: i concetti di base Per scambiare dati occorre quindi la partecipazioni di entrambi i processi. Programma PE 1 Programma PE 2 send(data) receive(data) La possibilità di scambiare dati senza la partecipazione esplicita di entrambi (PUT e GET) è parte delle specifiche MPI-2 che noi non trattiamo. In generale però occorreranno più informazioni alle chiamate put e get, almeno: il PE di destinazione per il send e quello di origine per il get; una etichetta (tag) per identificare il messaggio; una descrizione dei dati in transito.

14 MPI: i concetti di base Ma prima di cominciare a scambiarsi i dati i programmi devono conoscere l environment Programma PE 1 Programma PE send(data) receive(data) 1. Quanti processi ci sono? 2. Chi sono io? 1. MPI_Comm_size 2. MPI_Comm_rank 1. int MPI_Comm_size ( MPI_Comm comm, int *numpe ) 2. int MPI_Comm_rank ( MPI_Comm comm, int *mynumpe )

15 MPI: i concetti di base Possiamo dare un senso all uso delle MPI nei nostri due programmi helloworld. #include <stdio.h> #include "mpi.h" int main( int argc, char *argv[] ) { int rank, size; } MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); printf( "Hello world from process %d of %d\n", rank, size ); MPI_Finalize(); return 0; Se come argomento che indica il communicator (qui il primo argomento) indichiamo MPI_COMM_WORLD vogliamo fare un operazione che tiene conto di TUTTI i processi. Vedremo altri casi.

16 MPI: i concetti di base Adesso che sappiamo inizializzare/terminare le MPI e identificare i processi, facciamoli dialogare. Abbiamo detto che in teoria serve almeno: il PE di destinazione per il send e quello di origine per il get; una etichetta (tag) per identificare il messaggio; una descrizione dei dati in transito. MPI_Send( buffaddr, count, datatype, destinationpe, tag, comm) MPI_Recv( buffaddr, maxcount, datatype, sourcepe, tag, comm, status) Queste due istruzioni sono BLOCKING. Ovvero l esecuzione continua solo quando l operazione indicata (di send o receive, non entrambe) è andata a buon fine.

17 MPI: i concetti di base MPI_Send( buffaddr, count, datatype, destinationpe, tag, comm) MPI_Recv( buffaddr, maxcount, datatype, sourcepe, tag, comm, status) argomenti: buffaddr puntatore all indirizzo iniziale del buffer da spedire/ricevere. Di solito sarà il nome della variabile o array da mandare o ricevere. (Attenzione: in FORTRAN gli argomenti sono passati sempre per indirizzo, non per contenuto). count numero di elementi di tipo datatype che costituiscono il buffer. Se vogliamo ad esempio mandare una singola variabile, sarà =1; se vogliamo mandare un array sarà = dimensione array. datatype indica il tipo di dato che stiamo trasmettendo/ricevendo. Può essere un tipo predefinito (MPI_INT, MPI_DOUBLE_PRECISION), una struttura di tipi o un tipo definito da noi. destinationpe indica il numero del processo a cui il buffer viene inviato. tag permette di mettere un etichetta all invio in modo da identificarlo quando lo si riceve. comm indica il communicator (context+group) nel cui ambito viene effettuata l operazione.

18 MPI: i concetti di base MPI_Send( buffaddr, count, datatype, destinationpe, tag, comm) MPI_Recv( buffaddr, maxcount, datatype, sourcepe, tag, comm, status) argomenti: buffaddr puntatore all indirizzo iniziale del buffer da spedire/ricevere. Di solito sarà il nome della variabile o array da mandare o ricevere. maxcount numero di elementi di tipo datatype che costituiscono il buffer di ricezione, ovvero massimo numero di elementi che posso ricevere. datatype indica il tipo di dato che stiamo trasmettendo/ricevendo. sourcepe indica il numero del processo da cui ricevere il contenuto del buffer. tag permette di mettere un etichetta alla ricezione in modo da accoppiarlo con l invio corrispondente. comm indica il communicator (context+group) nel cui ambito viene effettuata l operazione. status contiene info sull effettiva lunghezza del messaggio ricevuto, sull identità effettiva del mittente e sul tag effettivo (utili in receive generici). In FORTRAN è un array di MPI_STATUS_SIZE interi.

19 MPI: i concetti di base Con le sei routine introdotte è già possibile scrivere qualunque programma parallelo. Sono però indispensabili altri tipi di chiamate per incrementare efficienza, leggibilità, flessibilità di un codice parallelo. Consideriamo adesso alcuni semplici esempi! Sorgenti: hello_world_mpi.c, Hello_world_mpi2.c, ping_pong_mpi.c

20 Mpi_hello_world.c #include <mpi.h> #include <stdio.h> #include <stdlib.h>int main (int argc, char* argv[]){ int rank, size; //Inizializzo la libreria MPI MPI_Init(&argc, &argv); //Richiedo il numero totale di processor elements MPI_Comm_size(MPI_COMM_WORLD, &size); //Richiedo il mio ID tra questi &rank); MPI_Comm_rank(MPI_COMM_WORLD, printf("ciao! Sono il processo %d di %d\n", rank, size); //Chiudo la libreria MPI_Finalize(); return 0; }

21 Mpi_hello_world2.c #include <mpi.h> #include <stdio.h> #include <stdlib.h> int main (int argc, char* argv[]){ int rank, size, A; MPI_Status stat; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0){ printf("sono il processo %d, inserisci un numero: ",rank); scanf("%d",&a); MPI_Send(&A, 1, MPI_INT, 1, 15, MPI_COMM_WORLD); } if (rank==1){ MPI_Recv(&A, 1, MPI_INT, 0, 15, MPI_COMM_WORLD, &stat); printf("sono il processo %d, ho ricevuto il valore %d\n", rank, A); } MPI_Finalize(); return 0; }

22 Esercizio: Mpi_ring.c Primo esercizio con più di due processi! Creare un programma eseguibile con un numero arbitrario di processi (n>1) in cui un valore intero è inizializzato dal processo zero e viene passato sequenzialmente ad ogni processo con ID crescente. L esecuzione termina quando il processo 0 riceve il valore dall ultimo processo.

23 MPI_Status La funzione MPI_Recv prende come parametro anche l indirizzo di una struttura MPI_Status (che può essere ignorata con MPI_STATUS_IGNORE). Se passiamo un MPI_Status alla funzione esso verrà popolato con informazioni aggiuntive riguardo la ricezione del messaggio: 1.L ID del mittente 2.Il tag del messaggio 3.La lunghezza del messaggio Funzione per recuperare lunghezza e tipo di dati del messaggio: MPI_Get_count(MPI_Status* status, MPI_Datatype datatype, int* count)

24 Esercizio: Mpi_check_status.c Creare un programma eseguibile con due processi. Il processo 0 invia un array con un numero random di elementi Il processo 1 riceve il messaggio e scopre la lunghezza del messaggio mediante la funzione MPI_Get_count. MPI_Get_count(MPI_Status* status, MPI_Datatype datatype, int* count)

25 Esercizio completo: Mpi_monte_carlo_pi.c Il metodo monte-carlo per il calcolo approssimato di pi greco: If a circle of radius R is inscribed inside a square with side length 2R, then the area of the circle will be pi*r^2 and the area of the square will be (2R)^2. So the ratio of the area of the circle to the area of the square will be pi/4. This means that, if you pick N points at random inside the square, approximately N*pi/4 of those points should fall inside the circle. This program picks points at random inside the square. It then checks to see if the point is inside the circle (it knows it's inside the circle if x^2 + y^2 < R^2, where x and y are the coordinates of the point and R is the radius of the circle). The program keeps track of how many points it's picked so far (N) and how many of those points fell inside the circle (M). Pi is then approximated as follows: pi = 4*M/N

26 Esercizio completo: Mpi_monte_carlo_pi.c Scrivere un programma sequenziale per il calcolo approssimato del pi greco mediante il metodo monte carlo. Parallelizzarlo mediante MPI

27 Chiamate di broadcast e riduzione Spesso occorre che il messaggio sia mandato contemporaneamente a/da più PE. In questo caso si usa un tipo di chiamata MPI nota come comunicazione collettiva. Come primi esempi vediamo MPI_Bcast e MPI_Reduce. (parag Gropp) MPI_BCAST(BUFFER, COUNT, DATATYPE, ROOT, COMM) BUFFER, COUNT, DATATYPE descrizione del messaggio (come per SEND). ROOT numero del PE che manda il messaggio a tutti i processi del gruppo, incluso se stesso. COMM indica il communicator (context+group) nel cui ambito viene effettuata l operazione. Alla fine il contenuto del BUFFER di ROOT è copiato in quello di tutti gli altri. Deve essere chiamato da tutti i PE del gruppo con gli stessi argomenti. E una comunicazione uno a molti. PE ROOT PE 0 PE 1 context PE other PE 2. PE ROOT ovviamente se un PE non fa la call non partecipa al bcast

28 Chiamate di broadcast e riduzione MPI_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM) SENDBUF, RECVBUF, COUNT, DATATYPE descrizione del messaggio e dei buffer di partenza e arrivo. OP descrizione dell operazione da eseguire con tutti i SENDBUF come operatori e il cui risultato va in RECVBUF di ROOT. E un parametro definito nel modulo MPI (prossima pagina) o una operazione definita dall utente (vedremo in seguito) ROOT numero del PE che raccoglie il risultato dell operazione. COMM indica il communicator nel cui ambito viene effettuata l operazione. Alla fine il contenuto del RECVBUF di ROOT ha il risultato di OP. Deve essere chiamato da tutti i PE del gruppo con gli stessi argomenti. E una comunicazione molti a uno che esegue anche un operazione. PE 0 PE other PE 1 PE 2 context. PE ROOT PE ROOT anche SENDBUF di ROOT partecipa all operazione

29 Chiamate di broadcast e riduzione Le operazioni collettive MPI_MAX return the maximum MPI_MIN return the minumum MPI_SUM return the sum MPI_PROD return the product MPI_LAND return the logical and MPI_BAND return the bitwise and MPI_LOR return the logical or MPI_BOR return the bitwise of MPI_LXOR return the logical exclusive or MPI_BXOR return the bitwise exclusive or MPI_MINLOC return the minimum and the location (actually, the value of the second element of the structure where the minimum of the first is found) MPI_MAXLOC return the maximum and the location eseguite dalle seguenti chiamate MPI_REDUCE MPI_ALLREDUCE MPI_REDUCE_SCATTER MPI_SCAN N.B. non tutte le operazioni sono possibili con tutti i datatype. Ad esempio non si può eseguire un MPI_MAX o MPI_MIN con dati MPI_COMPLEX.

30 Chiamate di broadcast e riduzione Guardiamo anche le altre tre chiamate di riduzione. MPI_ALLREDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM) Alla fine TUTI i PE hanno nel RECVBUF il risultato di OP. Gli argomenti sono gli stessi di MPI_REDUCE ma manca ROOT. Deve essere chiamato da tutti i PE del gruppo con gli stessi argomenti. E una comunicazione molti a molti che esegue anche un operazione. MPI_SCAN(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM) Funziona come MPI_ALLREDUCE ma concorrono a formare il risultato del PE r solo i SENDBUF dei PE da 1 a r. Alla fine TUTI i PE hanno nel RECVBUF il risultato di OP ma su operandi diversi. Deve essere chiamato da tutti i PE del gruppo con gli stessi argomenti. E una comunicazione molti a molti che esegue anche un operazione.

31 Chiamate di broadcast e riduzione MPI_REDUCE_SCATTER(SENDBUF, RECVBUF, RECVCOUNTS, DATATYPE, OP, COMM) RECVCOUNTS è un array di tanti elementi quanti sono i PE coinvolti. Ogni elemento è un intero che indica la lunghezza dei RECVBUF di ciascun PE. Prima fa l operazione di Reduce OP sugli i RECVCOUNTS[i] elementi del vettore SENDBUF distribuito sui vari PE. Poi il vettore dei risultati è diviso in tanti segmenti quanti sono i PE e distribuito secondo RECVCOUNTS[i] nei vari RECVBUF. Deve essere chiamato da tutti i PE del gruppo con gli stessi argomenti. E una comunicazione molti a molti che esegue anche un operazione. E equivalente ad un MPI_REDUCE seguito da un MPI_SCATTERV. E però di solito più efficiente.

32 Esempio MPI_Reduce_Scatter #include <stdio.h> #include <stdlib.h> #include "mpi.h" int recvcounts[size]; for (int i=0; i<size; i++) recvcounts[i] = 1; int main(int argc, char *argv[]) { int rank, size, i, n; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); int sendbuf[size]; int recvbuf; for (int i=0; i<size; i++) sendbuf[i] = 1 + rank + size*i; printf("proc %d: ", rank); for (int i=0; i<size; i++) printf("%d ", sendbuf[i]); printf("\n"); } MPI_Reduce_scatter(sendbuf, &recvbuf, recvcounts, MPI_INT, MPI_MAX, MPI_COMM_WORLD); printf("proc %d: %d\n", rank, recvbuf); MPI_Finalize(); return 0; Output: Proc 0: Proc 1: Proc 2: Proc 3: Proc 0: 4 Proc 1: 8 Proc 2: 12 Proc 3: 16

33 Timing dei programmi MPI Si parallelizza un programma per aumentarne le prestazioni è essenziale misurarne la velocità lo standard MPI prevede una semplice chiamata per cronometrare l esecuzione di un prg MPI_Wtime ( ) D= MPI_Wtime( ) ritorna un valore DOUBLE PRECISION Ritorna il tempo (in secondi) passato da un istante arbitrario: occorrerà sottrarre due istanti per avere l intervallo. Lo standard MPI garantisce che l istante di riferimento non cambi durante il programma. Per conoscere la risoluzione del clock si usa la funzione DOUBLE PRECISION MPI_Wtick( ) D= MPI_WTick( )

34 Dove sta girando il mio programma? La chiamata CALL MPI_Comm_rank ( comm, mynumpe ) fornisce un numero identificativo del processo, ma è arbitrariamente assegnato dalle librerie MPI. Per sapere su quale processore un programma sta girando esiste MPI_Get_processor_name(char *name, int *resultlen) La chiamata ritorna il nome del processore (in unix corrisponde all output di hostame) nella stringa di caratteri name la cui lunghezza deve essere almeno MPI_MAX_PROCESSOR_NAME Restituisce anche la lunghezza (in caratteri) del nome del processore nella variabile intera resultlen Attenzione alle macchine SMP: il sistema operativo può spostare un programma tra i vari processori; non è detto che la chiamata restituisca il nome del processore particolare, alcune implementazioni restituiscono solo il nome del nodo SMP.

35 Algoritmi Self-Scheduling (Master-Slave) Un problema importante da affrontare è il bilanciamento del lavoro tra i processori. Si può suddividere il carico a priori (come per il ) ma in questo modo non teniamo conto di eventuali differenze di prestazioni tra i processori o diversità di tempo richiesto dai processi: se un processore finisce il proprio compito subito, rimarrà inutilizzato. Semplice soluzione: Dividiamo concettualmente il lavoro in più compiti semplici (meglio se numerosi). Diamo ad un processo (master) il compito di coordinare il lavoro (ma può anche lavorare). Il master assegna un compito a ciascun processo (slave). Non appena un processo termina il proprio compito e comunica il risultato, gli viene assegnato il successivo compito della lista, chiunque esso sia. In questo modo tutti i processori sono occupati fino alla fine, ovvero fino a quando non terminano i compiti. Questo è il self-scheduling. E particolarmente conveniente quando i processi slave non devono comunicare tra loro. Vediamo un esempio concreto: Moltiplicazione matrice-vettore. (ci permetterà di usare le comunicazioni punto-a-punto MPI_SEND e MPI_RECV)

36 Algoritmi Self-Scheduling: prodotto matrice-vettore #define MIN(X, Y) (((X) < (Y))? (X) : (Y)) Parte iniziale int main(int argc, char *argv[]) { const int MAX_ROWS = 1000, MAX_COLS = 1000; int myid, master, numprocs, rows, cols; int i, j, numsent, sender, anstype, row; double *Aloc, *Bloc, *Cloc, *Btemp; double ans; MPI_Status status; double *a =(double *) malloc(max_rows*max_cols*sizeof(double)); double *b=(double *) malloc(max_cols*sizeof(double)); double *c=(double *) malloc(max_rows*sizeof(double)); double *buffer=(double *) malloc(max_cols*sizeof(double)); Problema: calcolare c = A b dove A e b sono rispettivamente una matrice quadrata e un vettore, entrambi residenti nella memoria di un processo (master). descriviamo il programma (par. 3.6 Gropp) MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &myid); master = 0; rows = 100; cols = 100;

37 Algoritmi Self-Scheduling: prodotto matrice-vettore Parte master if ( myid == master ){ //master initializes and then dispatches, initialize a and b (arbitrary) for(j=0; j<cols; j++){ b[j] = 1; for(i=0; i<row; i++) a[i*cols + j]; } //send b to each slave process numsent = 0; MPI_Bcast(b, cols, MPI_DOUBLE_PRECISION, master, MPI_COMM_WORLD); //send a row to each slave process; tag with row number for(i = 0; i < MIN(numprocs-1,rows); i++){ for (j = 0; j<cols; j++){ buffer[j] = a[i*cols +j]; } MPI_Send(buffer, cols, MPI_DOUBLE_PRECISION, i+1, i, MPI_COMM_WORLD); numsent = numsent+1; } for(i = 0; i<rows; i++){ MPI_Recv(&ans, 1, MPI_DOUBLE_PRECISION, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); sender = status.mpi_source; anstype = status.mpi_tag; //row is tag value c[anstype] = ans; if (numsent < rows){ //send another row for(j = 0; j<cols; j++) buffer[j] = a[numsent*cols +j]; MPI_Send(buffer, cols, MPI_DOUBLE_PRECISION, sender, numsent, } } MPI_COMM_WORLD); numsent = numsent+1; else{ //Tell sender that there is no more work } MPI_Send(MPI_BOTTOM, 0, MPI_DOUBLE_PRECISION, sender, rows, MPI_COMM_WORLD);

38 } else { // slaves receive b, compute dot products until done message recvd MPI_Bcast(b, cols, MPI_DOUBLE_PRECISION, master, MPI_COMM_WORLD); if (myid <= rows){ //skip if more processes than work while(1){ MPI_Recv(buffer, cols, MPI_DOUBLE_PRECISION, master, MPI_ANY_TAG, MPI_COMM_WORLD, &status); if (status.mpi_tag == rows){ MPI_Finalize(); } } return 0; } ans = 0.0; row = status.mpi_tag; for(i = 0; i<cols; i++) ans = ans+buffer[i]*b[i]; MPI_Send(&ans, 1, MPI_DOUBLE_PRECISION, master, } MPI_Finalize(); return 0; } Algoritmi Self-Scheduling: prodotto matrice-vettore row, MPI_COMM_WORLD); Parte slave Ricorda: Per ricevere un messaggio con qualsiasi tag abbiamo usato la costante MPI_ANY_TAG. Allo stesso modo per ricevere da qualunque processo abbiamo usato MPI_ANY_SOURCE.

Alcuni strumenti per lo sviluppo di software su architetture MIMD

Alcuni strumenti per lo sviluppo di software su architetture MIMD Alcuni strumenti per lo sviluppo di software su architetture MIMD Calcolatori MIMD Architetture SM (Shared Memory) OpenMP Architetture DM (Distributed Memory) MPI 2 1 Message Passing Interface MPI www.mcs.anl.gov./research/projects/mpi/

Dettagli

Introduzione a MPI Algoritmi e Calcolo Parallelo. Daniele Loiacono

Introduzione a MPI Algoritmi e Calcolo Parallelo. Daniele Loiacono Introduzione a MPI Algoritmi e Calcolo Parallelo Riferimenti! Tutorial on MPI Lawrence Livermore National Laboratory https://computing.llnl.gov/tutorials/mpi/ Cos è MPI? q MPI (Message Passing Interface)

Dettagli

MPI: comunicazioni collettive

MPI: comunicazioni collettive - g.marras@cineca.it Gruppo Supercalcolo - Dipartimento Sistemi e Tecnologie 29 settembre 5 ottobre 2008 Collective Communications -Communications involving a group of process -Called by all processes

Dettagli

Alcuni strumenti per lo sviluppo di software su architetture MIMD

Alcuni strumenti per lo sviluppo di software su architetture MIMD 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

Dettagli

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

MPI Quick Refresh. Super Computing Applications and Innovation Department. Courses Edition 2017 MPI Quick Refresh Super Computing Applications and Innovation Department Courses Edition 2017 1 Cos è MPI MPI acronimo di Message Passing Interface http://www.mpi-forum.org MPI è una specifica, non un

Dettagli

Programma della 1 sessione di laboratorio

Programma della 1 sessione di laboratorio Programma della 1 sessione di laboratorio Familiarizzare con l ambiente MPI Hello World in MPI (Esercizio 1) Esercizi da svolgere Send/Receive di un intero e di un array di float (Esercizio 2) Calcolo

Dettagli

Alcuni strumenti per lo sviluppo di software su architetture MIMD

Alcuni strumenti per lo sviluppo di software su architetture MIMD 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

Dettagli

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

Calcolo parallelo. Una sola CPU (o un solo core), per quanto potenti, non sono sufficienti o richiederebbero tempi lunghissimi. Calcolo parallelo Ci sono problemi di fisica, come le previsioni meteorologiche o alcune applicazioni grafiche, che richiedono un enorme potenza di calcolo. Una sola CPU (o un solo core), per quanto potenti,

Dettagli

MPI è una libreria che comprende:

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

Dettagli

Laboratorio di Calcolo Parallelo

Laboratorio di Calcolo Parallelo Laboratorio di Calcolo Parallelo Lezione : Aspetti avanzati ed esempi in MPI Francesco Versaci & Alberto Bertoldo Università di Padova 6 maggio 009 Francesco Versaci (Università di Padova) Laboratorio

Dettagli

Programmazione di base

Programmazione di base 1 0.1 INTRODUZIONE Al giorno d oggi il calcolo parallelo consiste nell esecuzione contemporanea del codice su più processori al fine di aumentare le prestazioni del sistema. In questo modo si superano

Dettagli

Alcuni strumenti per lo sviluppo di software su architetture MIMD

Alcuni strumenti per lo sviluppo di software su architetture MIMD 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

Dettagli

Calcolo Parallelo con MPI (2 parte)

Calcolo Parallelo con MPI (2 parte) 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

Dettagli

C: panoramica. Violetta Lonati

C: panoramica. Violetta Lonati C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati

Dettagli

Primi Programmi con MPI 1

Primi Programmi con MPI 1 Il cluster che usiamo: spaci Esercitazione: Primi Programmi con MPI http://www.na.icar.cnr.it/grid/#spacina Spacina è un cluster HP XC 6000 / Linux a 64 nodi biprocessore. La configurazione hardware dei

Dettagli

Presentazione del corso

Presentazione del corso Cosa è il calcolo parallelo Serie di Fibonacci Serie geometrica Presentazione del corso Calcolo parallelo: MPI Introduzione alla comunicazione point-to-point Le sei funzioni di base Laboratorio 1 Introduzione

Dettagli

Prodotto Matrice - Vettore in MPI - III Strategia

Prodotto Matrice - Vettore in MPI - III Strategia Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica Esercitazione di Calcolo Parallelo Prodotto Matrice - Vettore in MPI - III Strategia Anno Accademico 2010/2011 Prof.ssa Alessandra D'alessio

Dettagli

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

Calcolo parallelo. Una sola CPU (o un solo core), per quanto potenti, non sono sufficienti o richiederebbero tempi lunghissimi Calcolo parallelo Ci sono problemi di fisica, come le previsioni meteorologiche o alcune applicazioni grafiche, che richiedono un enorme potenza di calcolo Una sola CPU (o un solo core), per quanto potenti,

Dettagli

Prodotto Matrice - Vettore in MPI II Strategia

Prodotto Matrice - Vettore in MPI II Strategia Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica Esercitazione di Calcolo Parallelo Prodotto Matrice - Vettore in MPI II Strategia Anno Accademico 2010/2011 Prof.ssa Alessandra D'alessio

Dettagli

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

Parallel Computing. Architetture Hardware e Software per l elaborazione parallela. 2 Giugno Lorenzo Muttoni Anno Accademico Parallel Computing Architetture Hardware e Software per l elaborazione parallela 2 Giugno 2004 Lorenzo Muttoni Anno Accademico 2003-2004 Indice Introduzione Parametri: Speedup ed Efficienza Modelli Hardware

Dettagli

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

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 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 $ gcc fno builtin o second main.c $./second 1 compilatore dipendente Bcast Vediamo la soluzione

Dettagli

Compiti di un ambiente sw per il C.D. NetSolve: un ambiente per il calcolo distribuito. gestire gli accessi alle risorse. gestire l eterogeneita

Compiti di un ambiente sw per il C.D. NetSolve: un ambiente per il calcolo distribuito. gestire gli accessi alle risorse. gestire l eterogeneita Compiti di un ambiente sw per il C.D. NetSolve: un ambiente per il calcolo distribuito gestire gli accessi alle risorse gestire l eterogeneita gestire la dinamicita http://icl.cs.utk.edu/netsolve A. Murli

Dettagli

Concetti base di MPI. Introduzione alle tecniche di calcolo parallelo

Concetti base di MPI. Introduzione alle tecniche di calcolo parallelo Concetti base di MPI Introduzione alle tecniche di calcolo parallelo MPI (Message Passing Interface) Origini MPI: 1992, "Workshop on Standards for Message Passing in a Distributed Memory Environment MPI-1.0:

Dettagli

Boost.MPI Library Algoritmi e Calcolo Parallelo. Daniele Loiacono

Boost.MPI Library Algoritmi e Calcolo Parallelo. Daniele Loiacono Boost.MPI Library Algoritmi e Calcolo Parallelo Riferimenti! Boost homepage http://www.boost.org/! Tutorial on Boost.MPI http://www.boost.org/doc/libs/1_52_0/doc/html/mpi/ tutorial.html! Tutorial on Boost.Serialization

Dettagli

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

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 MPI e' acronimo di Message Passing Interface Rigorosamente MPI non è una libreria ma uno standard per gli sviluppatori e gli utenti, che dovrebbe essere seguito da una libreria per lo scambio di messaggi

Dettagli

Modello di sviluppo della popolazione: Matrice di Leslie

Modello di sviluppo della popolazione: Matrice di Leslie Modello di sviluppo della popolazione: Matrice di Leslie April 24, 2007 1 Scopo del progetto Lo scopo è quello di creare un programma parallelo in grado di fare una stima di quale sarà la popolazione in

Dettagli

Somma di un array di N numeri in MPI

Somma di un array di N numeri in MPI Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica Esercitazione di Calcolo Parallelo Somma di un array di N numeri in MPI Anno Accademico 2010/2011 Prof.ssa Alessandra D'alessio Candidati

Dettagli

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Dettagli

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

MPI in dettaglio. Chi ha definito MPI. Salvatore Orlando. CALCOLO PARALLELO - S. Orlando. CALCOLO PARALLELO - S. Orlando MPI in dettaglio Salvatore Orlando 1 Chi ha definito MPI 2 Il modello Message-Passing Model Ad un processo è tradizionalmente associato con program counter & address space. Processi possono però avere

Dettagli

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

Non blocking. Contro. La programmazione di uno scambio messaggi con funzioni di comunicazione non blocking e' (leggermente) piu' complicata Non blocking Una comunicazione non blocking e' tipicamente costituita da tre fasi successive: L inizio della operazione di send/receive del messaggio Lo svolgimento di un attivita' che non implichi l accesso

Dettagli

Modelli di programmazione parallela

Modelli di programmazione parallela Modelli di programmazione parallela Oggi sono comunemente utilizzati diversi modelli di programmazione parallela: Shared Memory Multi Thread Message Passing Data Parallel Tali modelli non sono specifici

Dettagli

Introduzione al linguaggio C Puntatori

Introduzione al linguaggio C Puntatori Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2017

Dettagli

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

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2017-18 Pietro Frasca Lezione 9 Giovedì 2-11-2017 Comunicazione con pipe Oltre che con la memoria condivisa

Dettagli

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

A.d'Alessio. Calcolo Parallelo. Esempi di topologie Message Passing Interface MPI Le topologie 1 Esempi di topologie Anello Griglia Toro L utilizzo di una topologia per la progettazione di un algoritmo in ambiente MIMD è spesso legata alla geometria intrinseca

Dettagli

Università degli Studi di Ferrara

Università degli Studi di Ferrara Università degli Studi di Ferrara Corso di Laurea in Matematica - A.A. 2018 2019 Programmazione Lezione 8 Esercizi in C Docente: Michele Ferrari - michele.ferrari@unife.it Informazioni Docente di supporto

Dettagli

Presentazione del corso

Presentazione del corso Presentazione del corso Cosa è il calcolo parallelo Calcolo parallelo: MPI (base e avanzato) Calcolo parallelo: OpenMP 2 Claudia Truini - Luca Ferraro - Vittorio Ruggiero 1 Problema 1: Serie di Fibonacci

Dettagli

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

Università degli Studi di Napoli Parthenope. Corso di Calcolo Parallelo e Distribuito. Virginia Bellino Matr. 108/1570 Università degli Studi di Napoli Parthenope Corso di Calcolo Parallelo e Distribuito Virginia Bellino Matr. 108/1570 Virginia Bellino Progetto 1 Corso di Calcolo Parallelo e Distribuito 2 Indice Individuazione

Dettagli

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

int MPI_Recv (void *buf, int count, MPI_Datatype type, int source, int tag, MPI_Comm comm, MPI_Status *status); Send e Receive La forma generale dei parametri di una send/receive bloccante int MPI_Send (void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm); int MPI_Recv (void *buf, int count,

Dettagli

Università degli Studi di Ferrara

Università degli Studi di Ferrara Università degli Studi di Ferrara Corso di Laurea in Matematica - A.A. 2018-2019 Programmazione Lezione 10 Esercizi in C Docente: Michele Ferrari - michele.ferrari@unife.it Nelle lezioni precedenti Abbiamo

Dettagli

Primi passi col linguaggio C

Primi passi col linguaggio C Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Come introdurre un linguaggio di programmazione? Obiettivi: Introduciamo una macchina astratta

Dettagli

Introduzione al linguaggio C Puntatori

Introduzione al linguaggio C Puntatori Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2016

Dettagli

Università degli Studi di Ferrara

Università degli Studi di Ferrara Università degli Studi di Ferrara Corso di Laurea in Matematica - A.A. 2018-2019 Programmazione Lezione 12 Esercizi in C Docente: Michele Ferrari - michele.ferrari@unife.it Nelle lezioni precedenti Abbiamo

Dettagli

CALCOLO PARALLELO ARCHITETTURE PARALLELLE

CALCOLO PARALLELO ARCHITETTURE PARALLELLE CALCOLO PARALLELO ARCHITETTURE PARALLELLE La necessità di computers ad alte prestazioni Molte delle applicazioni oggi così come le previsioni del tempo, simulazioni numeriche in fluidodinamica ed aereodinamica,

Dettagli

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma. Unità Didattica 1 Linguaggio C Fondamenti. Struttura di un programma. 1 La storia del Linguaggio C UNIX (1969) - DEC PDP-7 Assembly Language BCPL - un OS facilmente accessibile che fornisce potenti strumenti

Dettagli

Fondamenti di Informatica. Ingegneria elettronica

Fondamenti di Informatica. Ingegneria elettronica Fondamenti di Informatica Ingegneria elettronica Prima esercitazione Cecilia Catalano Sistema Operativo Il S.O. è costituito da un insieme di programmi che permettono di utilizzare e gestire tutte le risorse

Dettagli

Preprocessore, linker e libreria standard

Preprocessore, linker e libreria standard Preprocessore, linker e libreria standard Università degli Studi di Brescia Prof. Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 IL PREPROCESSORE Programma sorgente

Dettagli

Gli array. slides credit M. Poneti

Gli array. slides credit M. Poneti Gli array slides credit M. Poneti Vettori nome del vettore (tutti gli elementi hanno lo stesso nome, c) Vettore (Array) Gruppo di posizioni (o locazioni di memoria) consecutive Hanno lo stesso nome e lo

Dettagli

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

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia Le Funzioni in C Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia Fondamenti di Informatica Anno Accademico 2010/2011 docente: prof. Michele Salvemini 1/24 Sommario Le funzioni Il

Dettagli

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

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system - Complementi - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system - Università degli Studi di Brescia Prof. Massimiliano Giacomin

Dettagli

Perché il linguaggio C?

Perché il linguaggio C? Il linguaggio C 7 Perché il linguaggio C? Larga diffusione nel software applicativo Standard di fatto per lo sviluppo di software di sistema Visione a basso livello della memoria Capacità di manipolare

Dettagli

Introduzione al C. Lez. 1 Elementi. Rossano Venturini

Introduzione al C. Lez. 1 Elementi. Rossano Venturini Introduzione al C Lez. 1 Elementi Rossano Venturini rossano@di.unipi.it Pagine del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start http://algoritmica.spox.spoj.pl/alglab2013 Lezioni

Dettagli

Esercizi MPI. Algoritmi e Calcolo Parallelo. Daniele Loiacono

Esercizi MPI. Algoritmi e Calcolo Parallelo. Daniele Loiacono Esercizi MPI Algoritmi e Calcolo Parallelo Esercizio 1 2 Implementare in MPI una soluzione parallela del seguente algoritmo per approssimare PI cin >> npoints; count = 0; for(j=0, j

Dettagli

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

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system - Complementi - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system - Università degli Studi di Brescia Prof. Massimiliano Giacomin

Dettagli

Funzioni, Stack e Visibilità delle Variabili in C

Funzioni, Stack e Visibilità delle Variabili in C Funzioni, Stack e Visibilità delle Variabili in C Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2018/2019 Argomenti del Corso Ogni lezione consta di una spiegazione assistita da slide,

Dettagli

Puntatori e array. Violetta Lonati

Puntatori e array. Violetta Lonati Puntatori e array Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati Puntatori e array

Dettagli

Introduzione al C. Lez. 1 Elementi

Introduzione al C. Lez. 1 Elementi Introduzione al C Lez. 1 Elementi Introduzione al C Strumento che adotteremo in queste esercitazioni per implementare e testare gli algoritmi visti a lezione Configurazione minimale suggerita: Editing

Dettagli

Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A

Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A Ingegneria e Scienze Informatiche - Cesena A.A. 2014-2015 pietro.dilena@unibo.it MergeSort MergeSort MergeSort: esempio MergeSort: pseudocodice Algoritmo di ordinamento ricorsivo basato sulla tecnica Divide

Dettagli

int main(){ int numero; /* numero di cui voglio calcolare il fattoriale */ int fatt; /* memorizzo il fattoriale di numero */ int somma=0;

int main(){ int numero; /* numero di cui voglio calcolare il fattoriale */ int fatt; /* memorizzo il fattoriale di numero */ int somma=0; Problema: CALCOLARE LA SOMMA DEI FATTORIALI DEI PRIMI 100 NUMERI NATURALI 0!+1!+2! + 99! #include int fattoriale(int); Calcolo fattoriale int main(){ int numero; /* numero di cui voglio calcolare

Dettagli

Linguaggi di programmazione

Linguaggi di programmazione Lezione 1 e 2 Fabio Scotti Laboratorio di programmazione per la sicurezza 1 Lezione 1 e 2 Fabio Scotti Laboratorio di programmazione per la sicurezza Introduzione al linguaggio C e significato della compilazione

Dettagli

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22 Lezione 21 e 22 - Allocazione dinamica delle matrici - Generazione di numeri pseudocasuali - Funzioni per misurare il tempo - Parametri del main - Classificazione delle variabili Valentina Ciriani (2005-2008)

Dettagli

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm

Dettagli

Sviluppo di software parallelo con il sistema MPI

Sviluppo di software parallelo con il sistema MPI Sviluppo di software parallelo con il sistema MPI Sommario Cluster Beowulf Message Passing Installazione di MPI Routine di base di MPI Calcolo della somma di n numeri Gruppi di processi e topologie virtuali

Dettagli

Strategie di programmazione

Strategie di programmazione Funzioni Funzioni in C Il concetto di funzione Parametri formali e attuali Il valore di ritorno Definizione e chiamata di funzioni Passaggio dei parametri Corpo della funzione 2 Funzioni in C Strategie

Dettagli

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

Esercizi Calcolo Parallelo Algoritmi, Strutture Dati e Calcolo Parallelo. Daniele Loiacono Esercizi Calcolo Parallelo Algoritmi, Strutture Dati e Calcolo Parallelo MPI Esercizio 1 3 Implementare in MPI una soluzione parallela del seguente algoritmo per approssimare PI scanf( %d,npoints); count

Dettagli

Primo programma in C

Primo programma in C Primo programma in C Struttura minima di un file C Applicazioni C in modo console Struttura del programma Commenti Direttive #include Definizione di variabili Corpo del main 2 Struttura minima di un file

Dettagli

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati) Sistemi Operativi (M. Cesati) Compito scritto del 19 febbraio 2013 Nome: Matricola: Corso di laurea: Cognome: Crediti da conseguire: 5 6 9 Scrivere i dati richiesti in stampatello. Al termine consegnare

Dettagli

Capitolo 6 - Array. Copyright by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

Capitolo 6 - Array. Copyright by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved. 1 Capitolo 6 - Array Array Array Gruppo di locazioni di memoria consecutive Stesso nome e tipo Per riferirsi a un elemento, specificare Nome dell array Posizione Formato: arrayname[ position number ] Primo

Dettagli

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

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2017-18 Pietro Frasca Lezione 10 Martedì 7-11-2017 Thread a livello kernel Modello da uno a uno La

Dettagli

Introduzione alla programmazione in linguaggio C

Introduzione alla programmazione in linguaggio C Introduzione alla programmazione in linguaggio C Il primo programma in C commento Header della libreria Funzione principale Ogni istruzione in C va terminata con un ; Corso di Informatica AA. 2007-2008

Dettagli

Introduzione al C. Lez. 1 Elementi. Rossano Venturini

Introduzione al C. Lez. 1 Elementi. Rossano Venturini Introduzione al C Lez. 1 Elementi Rossano Venturini rossano.venturini@isti.cnr.it URL del corso http://www.cli.di.unipi.it/doku/doku.php/informatica/all-b/start Lezioni - Lunedì 16-18 Aula M - Martedì

Dettagli

INTRODUZIONE ALLA PROGRAMMAZIONE

INTRODUZIONE ALLA PROGRAMMAZIONE INTRODUZIONE ALLA PROGRAMMAZIONE Prof. Enrico Terrone A. S: 2008/09 Definizioni Programmare significa risolvere problemi col computer, cioè far risolvere problemi al computer attraverso un insieme di informazioni

Dettagli

Laboratorio 1. 20/21 febbraio 2019

Laboratorio 1. 20/21 febbraio 2019 Laboratorio 1. 20/21 febbraio 2019 Attivitá Professionalizzante A.A. 2018/19 Premessa Si lavora a coppie, sui PC del laboratorio. Al termine degli esercizi, ogni copia scrive un breve report e me lo invia

Dettagli

MPI: comunicazioni point-to-point

MPI: comunicazioni point-to-point - c.calonaci@cineca.it Gruppo Supercalcolo - Dipartimento Sistemi e Tecnologie 29 settembre 5 ottobre 2008 Argomenti Programmazione a scambio di messaggi Introduzione a MPI Modi di comunicazione Comunicazione

Dettagli

Il linguaggio C. Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Il linguaggio C. Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1 Il linguaggio C I linguaggi di programmazione ad alto livello sono linguaggi formali ( sintassi e semantica formalmente definite) però sono compatti e comprensibili. Le tipologie di linguaggi sono: procedurali

Dettagli

PROGRAMMA = ALGORITMO

PROGRAMMA = ALGORITMO Corso di Laurea Scienze Prof. San. Tec., Area Tecnico-Assistenziale SISTEMI DI ELABORAZIONE DELLE INFORMAZIONI Anno Accademico 2005-2006 Prof. Fausto Passariello Corso Integrato Metodologia della Ricerca

Dettagli

Allocazione dinamica della memoria

Allocazione dinamica della memoria Allocazione dinamica della memoria Allocazione statica: limiti Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente la loro esistenza deve essere prevista e dichiarata a priori

Dettagli

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

Le topologie. Message Passing Interface MPI Parte 2. Topologie MPI. Esempi di topologie. Definizione: topologia. Laura Antonelli Topologie MPI Message Passing Interface MPI Parte 2 Le topologie. Laura Antonelli 1 2 Esempi di topologie Definizione: topologia Una topologia è la geometria virtuale in cui si immaginano disposti i processi

Dettagli

La Programmazione. Cos è la programmazione? Concetti preliminari

La Programmazione. Cos è la programmazione? Concetti preliminari La Programmazione Cos è la programmazione? Concetti preliminari 1 Sommario La programmazione, questa sconosciuta Programmiamo Macchine Astratte Linguaggi di basso e alto livello e loro implementazione

Dettagli

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi SISTEMI OPERATIVI Processi in Linux 2 Creazione di processi concorrenti» La creazione di un processo figlio consente di far eseguire alcune funzionalità del programma in modo concorrente» Opzione 1 il

Dettagli

2 Operatori matematici e costrutto if

2 Operatori matematici e costrutto if Questa dispensa propone esercizi sulla scrittura di algoritmi, in linguaggio C, utili alla comprensione delle operazioni tra numeri e del costrutto condizionale if. Si introducono anche le due funzioni

Dettagli

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 4 24/10/2013

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 4 24/10/2013 Laboratorio di Programmazione 1 1 Docente: dr. Damiano Macedonio Lezione 4 24/10/2013 Original work Copyright Sara Migliorini, University of Verona Modifications Copyright Damiano Macedonio, University

Dettagli

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3) Funzioni Il concetto di funzione Parametri formali e attuali Il valore di ritorno Definizione e chiamata di funzioni Passaggio dei parametri Corpo della funzione 2 Strategie di programmazione Riuso di

Dettagli

Gestione dinamica della memoria

Gestione dinamica della memoria Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 Gestione dinamica della memoria Pietro Di Lena - pietro.dilena@unibo.it A pessimistic programmer sees the array as half empty.

Dettagli

Sistemi Operativi 1. Lezione III: Concetti fondamentali. Mattia Monga. 7 marzo 2008

Sistemi Operativi 1. Lezione III: Concetti fondamentali. Mattia Monga. 7 marzo 2008 1 Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia mattia.monga@unimi.it 7 marzo 2008 1 c 2008 M. Monga. Creative Commons Attribuzione-Condividi allo stesso modo 2.5 Italia

Dettagli

Sistemi Operativi 1. Mattia Monga. 7 marzo Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia

Sistemi Operativi 1. Mattia Monga. 7 marzo Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia 1 Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia mattia.monga@unimi.it 7 marzo 2008 1 c 2008 M. Monga. Creative Commons Attribuzione-Condividi allo stesso modo 2.5 Italia

Dettagli

Elementi di Base. Introduzione a Python.

Elementi di Base. Introduzione a Python. Elementi di Base Introduzione a Python http://www.dia.uniroma3.it/~roselli/ roselli@dia.uniroma3.it Credits Materiale a cura del Prof. Franco Milicchio Panoramica Elementi di base della sintassi (struttura,

Dettagli

Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017 Palermo 31 Luglio - 4 Agosto 2017

Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017 Palermo 31 Luglio - 4 Agosto 2017 Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017 Palermo 31 Luglio - 4 Agosto 2017 www.u4learn.it Alessandro Bruno Introduzione al calcolo parallelo Approcci per il calcolo parallelo Programmazione

Dettagli

ENEA GRID. CRESCO: Corso di introduzione. Autore: Alessandro Secco alessandro.secco@nice-italy.com

ENEA GRID. CRESCO: Corso di introduzione. Autore: Alessandro Secco alessandro.secco@nice-italy.com ENEA GRID CRESCO: Corso di introduzione Autore: Alessandro Secco alessandro.secco@nice-italy.com 1 Lezione 1 Introduzione Architettura Connessione Lancio di job Riferimenti 2 Introduzione 3 Introduzione

Dettagli

La funzione main() (

La funzione main() ( Funzioni La funzione main() Interfaccia con il sistema operativo Argomenti sulla linea di comando Parametri argc e argv Valore di ritorno del programma La funzione exit Esercizio Calcolatrice 2 La funzione

Dettagli

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++ Programmazione Procedurale in Linguaggio C++ Sottoprogrammi Parte 8 Dettagli e Approfondimenti versione 2.3 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima

Dettagli

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE Input/output da file Il linguaggio C non contiene istruzioni di I/O, in quanto tali operazioni vengono eseguite tramite funzioni di libreria standard. Questo approccio rende estremamente flessibile e potente

Dettagli

Università degli Studi di Ferrara

Università degli Studi di Ferrara Università degli Studi di Ferrara Corso di Laurea in Matematica - A.A. 2017-2018 Programmazione Lezione 6 Primi esercizi in C Docente: Michele Ferrari - michele.ferrari@unife.it Informazioni Docente di

Dettagli

Funzioni, Stack e Visibilità delle Variabili in C

Funzioni, Stack e Visibilità delle Variabili in C Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7

Dettagli

Dichiarazioni e tipi predefiniti nel linguaggio C

Dichiarazioni e tipi predefiniti nel linguaggio C Politecnico di Milano Dichiarazioni e tipi predefiniti nel linguaggio C Variabili, costanti, tipi semplici, conversioni di tipo. Premessa Programmi provati sul compilatore Borland C++ 1.0 Altri compilatori:

Dettagli

PREFAZIONE... IX Lo scopo di questo libro... ix La metodologia di insegnamento... ix Panoramica sul libro... xiii

PREFAZIONE... IX Lo scopo di questo libro... ix La metodologia di insegnamento... ix Panoramica sul libro... xiii Sommario PREFAZIONE... IX Lo scopo di questo libro... ix La metodologia di insegnamento... ix Panoramica sul libro... xiii CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 1.1 Introduzione...

Dettagli

ENEA GRID. Seminario avanzato per l'utente di cresco. Autore: Alessandro Secco

ENEA GRID. Seminario avanzato per l'utente di cresco. Autore: Alessandro Secco ENEA GRID Seminario avanzato per l'utente di cresco Autore: Alessandro Secco alessandro.secco@nice-italy.com 1 Seminario avanzato per l'utente di Cresco Riepilogo utilizzo di base di LSF LSF: job paralleli

Dettagli

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore I puntatori Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore...... L operatore & fornisce l indirizzo di un oggetto: p = &c; assegna a p l indirizzo di c, i.e., p

Dettagli