UNIVERSITA DEGLI STUDI DI NAPOLI FEDERICO II

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "UNIVERSITA DEGLI STUDI DI NAPOLI FEDERICO II"

Transcript

1 UNIVERSITA DEGLI STUDI DI NAPOLI FEDERICO II PROGETTO DI CALCOLO PARALLELO PRODOTTO MATRICE VETTORE STUDENTE Gabriele Piantadosi (885/000282)

2 1. OBIETTIVI E AMBIENTE DI CALCOLO Si vuole distribuire un algoritmo di calcolo del prodotto di una matrice di dimensioni per un vettore di elementi sfruttando un architettura parallela a 64 CPU (16 x Intel Xeon E5410 quad-core@2.33ghz 64 bit) offerta dall Università degli Studi di Napoli Federico II attraverso l infrastruttura S.Co.P.E. [ Il software è stato scritto il linguaggio C mediante l uso delle libreria Message Passing Interface (MPI). 2. DEFINIZIONE DEL PROBLEMA Di seguito viene descritto formalmente il problema. Si ha una matrice e la si vuole moltiplicare per il vettore per poi ottenere il vettore prodotto Per lo scopo sono stati utilizzati tre approcci diversi alla parallelizzazione dell algoritmo che differiscono tra di loro per quanto riguarda la procedura distribuzione della matrice e del vettore ai vari processori coinvolti nel calcolo: Strategia 1: Distribuzione per righe Strategia 2: Distribuzione per colonne Strategia 3: Distribuzione per blocchi E per ogni strategia si è mostrato l algoritmo distribuito utilizzato e, tramite parametri standard, si è analizzato in termini di tempi di esecuzione e di efficienza. 3. STRATEGIA I: DISTRIBUZIONE PER RIGHE Questa strategia prevede che la matrice venga distribuita ai processori in blocchi di righe. Ossia, consierando la matrice iniziale M: E supposto il numero dei processori utilizzati tale che sia un multiplo finito di, ogni processore avrà una porzione precisa di righe di M. Ad esempio, supposto quindi la matrice M sarà: 2

3 e considerato (quindi due processori che lavorano in parallelo) il processore avrà la seguente porzione di matrice: Mentre il processore avrà la restante porzione di matrice: Per quanto riguarda la distribuzione del vettore, invece, questo viene inviato in broadcast (ossia senza segmentarlo) a tutti i processori. In generale ogniuno dei processori, quindi il processore, avrà a disposizione: una matrice con elementi (con ) un vettore di elementi L algoritmo locale dovrà, quindi, effettuare il prodotto seguendo l algoritmo matematico già descritto nel paragrafo 2 ed ottenendo un numero di valori pari al numero di righe che compongono la propria matrice, ossia. A questo punto sarà necessario unire i array contenenti le somme locali in un unico array. I processori, infatti, devono provvedere ad inviare il loro contribbuto al processore root che si occuperà di unire e visualizzare il risultato. 3.1 DESCRIZIONE DELL ALGORITMO Di seguito è riportato il codice dell algoritmo per il calcolo parallelo #include "mpi.h" #include <stdio.h> double LeggiTempo(char *nomefile); void ScriviTempi(int numprocs, double time, double speedup, double eff); void ScriviTempo(double time); int main( int argc, char *argv[] ){ // variabili per il calcolo del tempo e delle prestazioni double t0, t1, time, time_1, speedup, eff; // variabili dell'algoritmo int myid, numprocs, rows, n, nelem, i, j; int root =0; // id (rank) del processore P0 MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); //GESTIONE DATI DI INPUT n = 64; //valore di default; if(argc==2) n = atoi(argv[1]); //colonne matrice passato da utente else if(argc>2) { //errore printf("errore parametri (n.%d)\n", argc); printf("> MATVET1 [n]\n"); printf("\n"); printf("[n] cardinalitࠤella matrice (default=64)\n"); 3

4 MPI_Finalize(); return 1; rows = n/numprocs; //numero di righe per ogni processore printf("numero di processori: %d\n", numprocs); printf("dimensioni matrice: %dx%d\n", n, n); printf("dimensioni array: %d\n", n); int M[n][n], a[n], sum[n]; int C[rows][n]; int b[rows]; //inizializzazione di b (vettore delle somme locali) for(i=0; i<rows; i++){ b[i] = 0; //generazione dell'array di n elementi a[i] = i+1; //printf("a[%d]= %d\n", i,i+1); //inizializzazione della matrice di input. for(j=0; j<n; j++){ M[i][j]=j+1; //printf("m[%d][%d]= %d\n", i,j,j+1); //BROADCAST DEL VETTORE MPI_Bcast(a,n,MPI_INT,root,MPI_COMM_WORLD); //DISTRIBUZIONE MATRICE PER RIGHE MPI_Scatter(M,rows*n,MPI_INT,C,rows*n,MPI_INT,root,MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); if(myid==0) t0 = MPI_Wtime(); //inizio conteggio tempo //CALCOLO DEL PRODOTTO (PARALLELO) [+DBG] int tmp=0; char*msg = "<PROC %d> b[%d] = b[%d] + C[%d][%d]*a[%d] = %d + (%d*%d) = %d\n"; for(i=0; i<rows; i++){ for(j=0; j<n; j++){ tmp = b[i]; b[i] = b[i] + C[i][j]*a[j]; //DBG //printf(msg, myid,i,i,i,j,j,tmp,c[i][j],a[j],b[i]); //RACCOLTA DEI RISULTATI PARZIALI MPI_Gather(&b,rows,MPI_INT,sum,rows,MPI_INT,root,MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); t1 = MPI_Wtime(); //stop al tempo //calcolo e stampa del tempo trascorso time = 1.e6 * (t1-t0); printf("tempo: %f\n", time); //se è monoprocessore allora scrive il tempo su un file if(numprocs==1) ScriviTempo(time); //legge il valore del tempo per un processore time_1 = LeggiTempo("tempi_1.txt"); //calcolo speedup ed efficienza speedup = time/time_1; eff = speedup/numprocs; 4

5 //scrive numero di processore, tempo, speedup ed efficienza in un file ScriviTempi(numprocs, time, speedup, eff); //scampa il risultato printf("risultato: [ %d, %d,... %d, %d ]\n", sum[0], sum[1], sum[n-2], sum[n-1]); //verifica del valore risultato. Se è corretto checksum è pari a 0. int sumtemp1, sumtemp2, checksum; sumtemp1 =(2*n+1)*(n+1)*(n); sumtemp2 = sumtemp1/6; checksum = 0; checksum = checksum + (sum[i]-sumtemp2); printf("checksum=%d\n", checksum); MPI_Finalize(); return 0; L algoritmo è stato concepito per funzionare in maniera completamente dinamica. L unico parametro di configurazione è la dimensione della matrice di input e tutti i valori verranno calcolati in base al PBS caricato in fase di esecuzione, leggendo il numero dei processori allocati per il task. Se si vogliono eseguire test su una matrice di dimensioni diverse allora sarà sufficiente passare alla chiamata del programma un nuovo valore di dimensione (default 64) e il software provvederà a modificare la variabile interna n. Una volta assegnato il valore di, viene assegnato alla variabile rows il valore: che rappresenta il numero di righe della matrice che possiederà ogni processore (con unico vincolo che il numero di righe della matrice di input sia multiplo del numero di processori nproc). Avremo quindi: M (matrice di input) di dimensioni {inizializzato con per ogni sua riga a (vettore di input) di dimensioni {inizializzato con sum (vettore del risultato) di dimensioni Ogni processore avrà a disposizione le seguenti variabili con valenza locale: C (porzione della matrice di input) di dimensioni a (porzione del vettore di input) di dimensioni b (vettore delli risultati locali) di dimensioni La comunicazione avviene sfruttando le seguenti primitive MPI MPI_Bcast() per la distribuzione in broadcast della variabile a (vettore di input) a tutti i processori MPI_Scatter() per la distribuzione e scomposizione della matrice M ad ogni processore. MPI_Gather() per raccogliere i dati prodotti da tutti i processori al processore root sum. 5 nella variabile La sincronizzazione avviene tramite la funzione: MPI_Barrier() mette in attesa tutti i processi di un canale di comunicazione fin quando tutti non raggiongono la stessa funzione; si usa solitamente dopo una richiesta di distribuzione di dati per fare in modo che tutti i processi si sincronizzino dopo aver ricevuto i dati da un processo padre.

6 3.2 ANALISI DEL SOFTWARE In questo paragrafo sono riportati i grafici e tabelle relativi al calcolo del tempo T(p), dello speedup S(p) e dell efficienza E(p). Figura 1: Analisi del tempo di esecuzione Nella Figura 1 riportiamo sull asse delle ordinate il tempo di esecuzione in microsecondi, mentre sulle ascisse sono presenti i valori del numero processori utilizzati. Dal grafico si evince che il parallelismo riduce i tempi di calcolo fino ad un limite di 8 processori. Unica osservazione davvero importante è che le curve sono pressoché regolari fino ad un numero pari a 16 processori e dopo iniziano a subire delle pertubazioni probabilmente dovute all infrastuttura ed al carico temporale. S.Co.P.E. mette, infatti, a disposizione 16 processori quadcore (su 8 nodi con mainboard dual processor); si creano, quindi, almeno due differenti livelli di parallelismo uno maggiormente influenzato rispetto all altro dalla concorrenza di altri utenti, dalle esigenze del sistema operativo e dallo stato puntuale della rete. Nelle tabelle seguente sono riportati i valori calcolati dello speed-up con affiancato il valore dello speed-up ideale e della relativa efficienza. 6

7 #CPU T(p) S(p) E(p) , ,788 1, ,51% 4 292,807 3, ,49% 8 203,016 4, ,37% ,431 4, ,12% ,556 4, ,22% ,308 4, ,15% Tabella1: Parametri di valutativi per M=320x320 #CPU T(p) S(p) E(p) , ,568 1, ,76% 4 673,361 3, ,27% 8 384,853 6, ,60% ,741 6, ,12% ,203 6, ,28% ,138 6, ,72% Tabella2: Parametri di valutativi per M=512x512 #CPU T(p) S(p) E(p) , ,719 1, ,80% 4 999,533 3, ,77% 8 641,126 5, ,10% ,949 7, ,55% ,796 7, ,99% ,613 6, ,92% Tabella3: Parametri di valutativi per M=640x640 #CPU T(p) S(p) E(p) , ,041 1, ,66% ,884 3, ,62% 8 784,378 6, ,66% ,695 7, ,33% ,675 8, ,03% ,707 8, ,09% Tabella4: Parametri di valutativi per M=832x832 Si evince facilmente che la configurazione che sfrutta meglio il parallelismo è quella a due processori, dove il valore dello speedup è il più vicino a quello ideale e l efficienza è la maggiore (escludendo il caso monoprocessore). I risultati di speedup ed efficienza sono in linea con la legge di Amdhal. Infatti, se manteniamo fissa la dimensione del problema e aumentiamo il numero dei processori, allora otteniamo valore di speedup sempre più lontani da quello ideale, quindi le prestazioni tendono a degradare. Se, invece, manteniamo fisso il numero dei processori e aumentiamo man mano la dimensione del problema abbiamo che sia l efficienza che lo speedup tendono a crescere e quindi si hanno prestazioni decisamente migliori. 3.3 ESEMPI D USO In questo paragrafo verrà mostrato un esempio dell output che viene generato una volta terminata l esecuzione del programma. L immagine che segue mostra l esecuzione del programma con una matrice 64x64. 7

8 L output del programma mostra informazioni sul numero dei processori istanziati (in questo caso 4), la dimensione della matrice (in questo caso 64 come da parametro di default), il tempo (che non è affidabile dato che è stato eseguito in ambiente simulato) ed un valore di CheckSum. E prevista una gestione dei parametri errati come si mostra di seguito: 8

9 4. STRATEGIA II: DISTRIBUZIONE PER COLONNE Questa strategia prevede che la matrice venga distribuita ai processori in blocchi di colonne e che il vettore venga anch esso suddiviso in parti uguali al numero di processori. Ossia, consierando la matrice iniziale M: E supposto il numero dei processori utilizzati tale che sia un multiplo finito di, ogni processore avrà una porzione precisa di colonne di M. Ad esempio, supposto quindi la matrice M e il vettore a saranno: e considerato (quindi due processori che lavorano in parallelo) il processore avrà la seguente porzione di matrice e di vettore: Mentre il processore avrà la restante porzione di matrice: In generale ogniuno dei processori, quindi il processore, avrà a disposizione: una matrice con elementi (con ) un vettore di elementi L algoritmo locale dovrà, quindi, effettuare il prodotto seguendo l algoritmo matematico già descritto nel paragrafo 2 ed ottenendo un numero di valori pari al numero di righe che compongono la propria matrice, ossia ; questa volta il risultato è ancora un risultato parziale che va sommato al valore posseduto dagli altri processori nella stessa posizione dell array. I processori, infatti, devono provvedere ad inviare il loro contribbuto al processore root che si occuperà di sommare, unire e visualizzare il risultato. 4.1 DESCRIZIONE DELL ALGORITMO Di seguito è riportato il codice dell algoritmo per il calcolo parallelo 9

10 #include "mpi.h" #include <stdio.h> double LeggiTempo(char *nomefile); void ScriviTempi(int numprocs, double time, double speedup, double eff); void ScriviTempo(double time); int main( int argc, char *argv[] ){ // variabili per il calcolo del tempo e delle prestazioni double t0, t1, time, time_1, speedup, eff; // variabili dell'algoritmo int myid, numprocs, n, cols, nelem, i, j; int root =0; // id (rank) del processore P0 MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); //GESTIONE DATI DI INPUT n = 64; //valore di default; if(argc==2) n = atoi(argv[1]); //righe matrice passato da utente else if(argc>2) { //errore printf("errore parametri (n.%d)\n", argc); printf("> MATVET2 [n]\n"); printf("\n"); printf("cardinalità della matrice (default=64)\n"); MPI_Finalize(); return 1; cols = n/numprocs; //numero di colonne per ogni processore printf("numero di processori: %d\n", numprocs); printf("dimensioni matrice: %dx%d\n", n, n); printf("dimensioni array: %d\n", n); int M[n][n], a[n], sum[n]; int C[n][cols]; int b[n]; int c[cols]; //inizializzazione di b (vettore delle somme locali) b[i] = 0; //generazione dell'array di n elementi a[i] = i+1; //printf("a[%d]= %d\n", i,i+1); //inizializzazione della matrice di input. for(j=0; j<n; j++){ M[i][j]=j+1; //printf("m[%d][%d]= %d\n", i,j,j+1); //DISTRIBUZIONE DEL VETTORE MPI_Scatter(a,cols,MPI_INT,c,cols,MPI_INT,root,MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); //DISTRIBUZIONE MATRICE PER COLONNE (passando per la trasposta) int MT[n][n], D[cols][n]; //trasposta di M for(j=0; j<n; j++){ MT[i][j] = M[j][i]; 10

11 MPI_Scatter(MT,n*cols,MPI_INT,D,n*cols,MPI_INT,root,MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); //trasposta di D salvata in C for(j=0; j<cols; j++){ C[i][j] = D[j][i]; if(myid==0) t0 = MPI_Wtime(); //CALCOLO DEL PRODOTTO (PARALLELO) [+DBG] int tmp=0; char*msg = "<PROC %d> b[%d] = b[%d] + C[%d][%d]*c[%d] = %d + (%d*%d) = %d\n"; for(j=0; j<cols; j++){ tmp = b[i]; b[i] = b[i] + C[i][j]*c[j]; //DBG //printf(msg, myid,i,i,i,j,j,tmp,c[i][j],c[j],b[i]); //RACCOLTA DEI RISULTATI PARZIALI MPI_Reduce(&b[i],&sum[i],1,MPI_INT,MPI_SUM,root,MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); t1 = MPI_Wtime(); //stop al tempo //calcolo e stampa del tempo trascorso time = 1.e6 * (t1-t0); printf("tempo: %f\n", time); //se è monoprocessore allora scrive il tempo su un file if(numprocs==1) ScriviTempo(time); //legge il valore del tempo per un processore time_1 = LeggiTempo("tempi_1.txt"); //calcolo speedup ed efficienza speedup = time_1/time; eff = speedup/numprocs; //scrive numero di processore, tempo, speedup ed efficienza in un file ScriviTempi(numprocs, time, speedup, eff); //scampa il risultato printf("risultato: [ %d, %d,... %d, %d ]\n", sum[0], sum[1], sum[n-2], sum[n-1]); //verifica del valore risultato. Se è corretto checksum è pari a 0. int sumtemp1, sumtemp2, checksum; sumtemp1 =(2*n+1)*(n+1)*(n); sumtemp2 = sumtemp1/6; checksum = 0; checksum = checksum + (sum[i]-sumtemp2); printf("checksum=%d\n", checksum); MPI_Finalize(); return 0; L algoritmo è stato concepito per funzionare in maniera completamente dinamica. L unico parametro di configurazione è la dimensione della matrice di input e tutti i valori verranno calcolati in base al PBS caricato in fase di esecuzione, leggendo il numero dei processori allocati per il task. Se si vogliono eseguire test su una matrice 11

12 di dimensioni diverse allora sarà sufficiente passare alla chiamata del programma un nuovo valore di dimensione (default 64) e il software provvederà a modificare la variabile interna n. Una volta assegnato il valore di, viene assegnato alla variabile cols il valore: che rappresenta il numero di colonne della matrice che possiederà ogni processore (con unico vincolo che il numero di colonne della matrice di input sia multiplo del numero di processori nproc). Avremo quindi: M (matrice di input) di dimensioni {inizializzato con per ogni sua riga a (vettore di input) di dimensioni {inizializzato con sum (vettore del risultato) di dimensioni Ogni processore avrà a disposizione le seguenti variabili con valenza locale: C (porzione della matrice di input) di dimensioni c (porzione del vettore di input) di dimensioni b (vettore delli risultati locali) di dimensioni La comunicazione avviene sfruttando le seguenti primitive MPI: MPI_Scatter() per la distribuzione e scomposizione della matrice M ad ogni processore (si sfrutta la funzionalità di questa funzione di distribuire gli array bidimensionali effettuando una trasposizione della matrice M in MT e poi ricalcolando la trasposata della copia locale) MPI_Scatter() per la distribuzione e scomposizione del vettore di ingresso a a tutti i processori. MPI_Reduce() per raccogliere i dati prodotti da tutti i processori al processore root nella variabile sum come ci suggerisce il nome, la funzione effettua una riduzione di più elementi (residenti nella memoria dei vari processori) in una variabile del processore root sfruttando una funzione di riduzione, che nel nostro caso è MPI_SUM che, ovviamente, effettua la somma dei termini. La sincronizzazione avviene tramite la funzione: MPI_Barrier() mette in attesa tutti i processi di un canale di comunicazione fin quando tutti non raggiongono la stessa funzione; si usa solitamente dopo una richiesta di distribuzione di dati per fare in modo che tutti i processi si sincronizzino dopo aver ricevuto i dati da un processo padre. 4.2 ANALISI DEL SOFTWARE In questo paragrafo sono riportati i grafici e tabelle relativi al calcolo del tempo T(p), dello speedup S(p) e dell efficienza E(p). 12

13 Figura 2: Analisi del tempo di esecuzione Nella Figura 2 riportiamo sull asse delle ordinate il tempo di esecuzione in microsecondi, mentre sulle ascisse sono presenti i valori del numero processori utilizzati. Si evince subito che questa strategia non migliora mai i tempi di esecuzione a causa della prevalenza dei tempi di comunicazione e dei tempi di attesa. Riportimo comunque, per completezza, i grafici dei valori calcolati dello speed-up con affiancato il valore dello speed-up ideale e della relativa efficienza. #CPU T(p) S(p) E(p) 1 901, ,362 0, ,82% ,316 0, ,49% ,436 0, ,99% ,292 0, ,34% ,027 0, ,58% ,956 0, ,28% Tabella1: Parametri di valutativi per M=320x320 #CPU T(p) S(p) E(p) , ,508 0, ,30% ,389 0, ,33% ,838 0, ,19% ,742 0, ,98% ,458 0, ,37% ,390 0, ,65% Tabella3: Parametri di valutativi per M=640x640 #CPU T(p) S(p) E(p) , ,944 0, ,60% ,751 0, ,34% ,786 0, ,86% ,251 0, ,47% ,744 0, ,20% ,267 0, ,46% Tabella2: Parametri di valutativi per M=512x512 #CPU T(p) S(p) E(p) , ,340 0, ,18% ,765 0, ,40% ,775 0, ,70% ,485 0, ,10% ,389 0, ,52% ,265 0, ,72% Tabella4: Parametri di valutativi per M=832x832 13

14 Dalle tabelle si ricava che la configurazione che sfrutta meglio il parallelismo è quella a due processori, dove il valore dello speedup è il più vicino a quello ideale. Tuttavia in generale questa strategia non è molto performante in quanto lo speedup diminuisce sempre di più. I valori ottenuti sono in linea con la legge di Amdhal, infatti si ha un degrado delle prestazioni mantenendo fissa la dimensione e aumentando il numero dei processori. Mentre aumentando la dimensione mantenendo fisse le CPU abbiamo un incremento dello speedup. 4.3 ESEMPI D USO In questo paragrafo verrà mostrato un esempio dell output che viene generato una volta terminata l esecuzione del programma. L immagine che segue mostra l esecuzione del programma con una matrice 64x64. L output del programma mostra informazioni sul numero dei processori istanziati (in questo caso 4), la dimensione della matrice (in questo caso 64 come da parametro di default), il tempo (che non è affidabile dato che è stato eseguito in ambiente simulato) ed un valore di CheckSum. E prevista una gestione dei parametri errati come si mostra di seguito: 14

15 5. STRATEGIA III: DISTRIBUZIONE PER BLOCCHI Questa strategia prevede che la matrice venga distribuita ai processori per blocchi (sottomatrici). Ossia, consierando la matrice iniziale M: Ad esempio, supposto quindi la matrice M e il vettore a saranno: E supposto il numero dei processori utilizzati tale che sia un multiplo finito di ed un quadrato perfetto, ogni processore avrà una porzione precisa di M di dimensioni ed una parte del vettore di ingresso contenente elementi. Ad esempio, supposto quindi la matrice M e il vettore a saranno: e considerato (quindi quattro processori che lavorano in parallelo) il processore avrà la seguente porzione di matrice e di vettore: Mentre il processore avrà la restante porzione di matrice e di vettore: Di conseguenza il resto dei processori, ossia e avranno i seguenti elementi: In generale ogniuno dei processori, quindi il processore, avrà a disposizione: una matrice con elementi (con ) un vettore di elementi L algoritmo locale dovrà, quindi, effettuare il prodotto seguendo l algoritmo matematico già descritto nel paragrafo 2 ed ottenendo un numero di valori pari al numero di righe che compongono la propria matrice, ossia ; questa volta il risultato è ancora un risultato parziale che va sommato al valore posseduto dagli altri processori nella stessa posizione dell array. I processori, infatti, devono provvedere ad inviare il loro contribbuto al processore root che si occuperà di sommare, unire e visualizzare il risultato. 15

16 5.1 DESCRIZIONE DELL ALGORITMO Di seguito è riportato il codice dell algoritmo per il calcolo parallelo #include "mpi.h" #include <stdio.h> #include <math.h> double LeggiTempo(char *nomefile); void ScriviTempi(int numprocs, double time, double speedup, double eff); void ScriviTempo(double time); int main( int argc, char *argv[] ) { // variabili per il calcolo del tempo e delle prestazioni double t0, t1, time, time_1, speedup, eff; // variabili dell'algoritmo int myid, numprocs; int n, rowscols,i,j,k; int period[2], ndim[2], free_coords[2]; int root =0; // id (rank) del processore P0 //ambienti di comunicazione MPI_Comm MPI_COMM_GRID, MPI_COMM_ROWS, MPI_COMM_COLS; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); //GESTIONE DATI DI INPUT n = 64; //valore di default; if(argc==2) n = atoi(argv[1]); //righe matrice passato da utente else if(argc>2) { //errore printf("errore parametri (n.%d)\n", argc); printf("> MATVET3 [n]\n"); printf("\n"); printf("cardinalità della matrice (default=64)\n"); MPI_Finalize(); return 1; rowscols = n/sqrt((double)numprocs); //dimensione del blocco printf("dimensioni matrice: %dx%d\n", n, n); printf("dimensioni array: %d\n", n); printf("numero di processori: %d (griglia: %dx%d di blocchi %dx%d)\n", numprocs,n/rowscols,n/rowscols,rowscols,rowscols); int M[n][n], M1[rowscols][n], M1_T[n][rowscols], M2_T[rowscols][rowscols], M2[rowscols][rowscols]; int a[n], b[rowscols], c[rowscols],d[rowscols], sum[n]; //inizializzazione di b (vettore delle somme locali) b[i] = 0; //generazione dell'array di n elementi a[i] = i+1; //printf("a[%d]= %d\n", i,i+1); //inizializzazione della matrice di input. for(j=0; j<n; j++){ M[i][j]=j+1; //printf("m[%d][%d]= %d\n", i,j,j+1); 16

17 //CREAZIONE DELLA GRIGLIA 2D //dimensioni ndim[0] = n/rowscols; ndim[1] = n/rowscols; //parametri di peridicitࠤella griglia (non è periodica) period[0] = 0; period[1] = 0; MPI_Cart_create(MPI_COMM_WORLD,2,ndim,period,0,&MPI_COMM_GRID); //creazione della griglia 2D //definizione della dimensione lungo la quale verrࠤreata la sottogriglia free_coords[0] = 0; free_coords[1] = 1; MPI_Cart_sub(MPI_COMM_GRID,free_coords,&MPI_COMM_ROWS); //creazione della sottogriglia delle righe //definizione della dimensione lungo la quale verrࠤreata la sottogriglia free_coords[0] = 1; free_coords[1] = 0; MPI_Cart_sub(MPI_COMM_GRID,free_coords,&MPI_COMM_COLS); //creazione della sottogriglia delle colonne //DISTRIBUZIONE DEL VETTORE //1) broadcast di al gruppo della prima colonna MPI_Bcast(a,n,MPI_INT,0,MPI_COMM_COLS); MPI_Barrier(MPI_COMM_COLS); //2) distribuzione dell'array ai gruppi di riga MPI_Scatter(a,rowscols,MPI_INT,c,rowscols,MPI_INT,root,MPI_COMM_ROWS); MPI_Barrier(MPI_COMM_ROWS); //DISTRIBUZIONE MATRICE PER COLONNE (passando per la trasposta) //1) per righe alla prima colonna della griglia 2D MPI_Scatter(M,n*rowscols,MPI_INT,M1,n*rowscols,MPI_INT,root,MPI_COMM_COLS); MPI_Barrier(MPI_COMM_COLS); //- trasposta della matrice M1 ricevuta dagli elementi della prima colonna for(j=0; j<rowscols; j++){ M1_T[i][j] = M1[j][i]; //2) per colonne ai processori delle sottogriglie di righe MPI_Scatter(M1_T,rowscols*rowscols,MPI_INT,M2,rowscols*rowscols,MPI_INT,root,MPI_COMM_ROWS); MPI_Barrier(MPI_COMM_ROWS); //- trasposta della matrice appena ricevuta for(i=0; i<rowscols; i++){ for(j=0; j<rowscols; j++){ M2_T[i][j] = M2[j][i]; if(myid==0) t0 = MPI_Wtime(); //start al tempo //CALCOLO DEL PRODOTTO (PARALLELO) [+DBG] int tmp=0; char*msg = "<PROC %d> b[%d] = b[%d] + M2_T[%d][%d]*c[%d] = %d + (%d*%d) = %d\n"; for(i=0; i<rowscols; i++){ for(j=0; j<rowscols; j++){ tmp = b[i]; b[i] = b[i] + M2_T[i][j]*c[j]; //DBG //printf(msg, myid,i,i,i,j,j,tmp,m2_t[i][j],c[j],b[i]); //somma dei risultati parziali per righe for(i=0; i<rowscols; i++) MPI_Reduce(&b[i],&d[i],1,MPI_INT,MPI_SUM,root,MPI_COMM_ROWS); //raccolta dei risultati a P0 a formare il vettore risultato 17

18 MPI_Gather(d,rowscols,MPI_INT,sum,rowscols,MPI_INT,root,MPI_COMM_COLS); t1 = MPI_Wtime(); //stop al tempo //calcolo e stampa del tempo trascorso time = 1.e6 * (t1-t0); printf("tempo: %f\n", time); //se è monoprocessore allora scrive il tempo su un file if(numprocs==1) ScriviTempo(time); //legge il valore del tempo per un processore time_1 = LeggiTempo("tempi_1.txt"); //calcolo speedup ed efficienza speedup = time/time_1; eff = speedup/numprocs; //scrive numero di processore, tempo, speedup ed efficienza in un file ScriviTempi(numprocs, time, speedup, eff); //scampa il risultato printf("risultato: [ %d, %d,... %d, %d ]\n", sum[0], sum[1], sum[n-2], sum[n-1]); //verifica del valore risultato. Se è corretto checksum è pari a 0. int sumtemp1, sumtemp2, checksum; sumtemp1 =(2*n+1)*(n+1)*(n); sumtemp2 = sumtemp1/6; checksum = 0; checksum = checksum + (sum[i]-sumtemp2); printf("checksum=%d\n", checksum); MPI_Finalize(); return 0; L algoritmo è stato concepito per funzionare in maniera completamente dinamica. L unico parametro di configurazione è la dimensione della matrice di input e tutti i valori verranno calcolati in base al PBS caricato in fase di esecuzione, leggendo il numero dei processori allocati per il task. Se si vogliono eseguire test su una matrice di dimensioni diverse allora sarà sufficiente passare alla chiamata del programma un nuovo valore di dimensione (default 64) e il software provvederà a modificare la variabile interna n. Una volta assegnato il valore di, viene assegnato alla variabile rowcols il valore: che rappresenta il numero di righe e colonne della matrice che possiederà ogni processore (con unico vincolo che il numero di colonne della matrice di input sia un multiplo del numero di processori nproc ed in più, che p sia un quadrato proprio). Avremo quindi: M (matrice di input) di dimensioni {inizializzato con per ogni sua riga a (vettore di input) di dimensioni {inizializzato con sum (vettore del risultato) di dimensioni Ogni processore avrà a disposizione le seguenti variabili con valenza locale: 18

19 C (porzione della matrice di input) di dimensioni c (porzione del vettore di input) di dimensioni b (vettore delli risultati locali) di dimensioni La comunicazione avviene sfruttando le seguenti primitive MPI MPI_Scatter() per la distribuzione (in due fasi: prima sulla prima colonna e poi a tutte le righe) e scomposizione della matrice M ad ogni processore (si sfrutta la funzionalità di questa funzione di distribuire gli array bidimensionali effettuando una trasposizione della matrice M in MT e poi ricalcolando la trasposata della copia locale) MPI_Bcast() per inviare la porzione di matrice già suddivisa nella prima riga a tutte le restanti righe della matrice di processori. MPI_Scatter()per la distribuzione (in due fasi: prima sulla prima colonna e poi a tutte le righe) e scomposizione del vettore di ingresso a a tutti i processori. MPI_Bcast() per inviare la porzione di array già suddivisa nella prima riga a tutte le restanti righe della matrice di processori. MPI_Reduce() per raccogliere i dati prodotti da tutti i processori al processore root nella variabile d (di ogni riga); come ci suggerisce il nome, la funzione effettua una riduzione di più elementi (residenti nella memoria dei vari processori) in una variabile del processore root sfruttando una funzione di riduzione, che nel nostro caso è MPI_SUM che, ovviamente, effettua la somma dei termini. MPI_Gather() per raccogliere i dati prodotti da tutti i processori al processore root sum. La sincronizzazione avviene tramite la funzione MPI: nella variabile MPI_Barrier() mette in attesa tutti i processi di un canale di comunicazione fin quando tutti non raggiongono la stessa funzione; si usa solitamente dopo una richiesta di distribuzione di dati per fare in modo che tutti i processi si sincronizzino dopo aver ricevuto i dati da un processo padre. Per questo esercizio è necessario creare nuovi contesti di comunicazione per poter sfruttare un architettura a griglia; per fare questo si sono usate le seguenti primitive MPI: MPI_Cart_create() crea una griglia di comunicazione cartesiana (nel nostro caso di 2 dimensioni) MPI_Cart_sub()crea una sottogriglia di comunicazione in una struttura cartesiana già definita (ad esempio come nel nostro caso di sole righe o sole colonne) MPI_Comm_rank() restituisce il rank in una griglia di comunicazione (già usato per lo spazio di comuncazione di default MPI_COMM_WORLD ed ora usato per ridefinire il sottospazio ed i suoi indici) 5.2 ANALISI DEL SOFTWARE In questo paragrafo sono riportati i grafici e tabelle relativi al calcolo del tempo T(p), dello speedup S(p) e dell efficienza E(p). 19

20 Figura 3: Analisi del tempo di esecuzione Nella Figura 3 riportiamo sull asse delle ordinate il tempo di esecuzione in microsecondi, mentre sulle ascisse sono presenti i valori del numero processori utilizzati. Si evince subito che questa strategia non migliora mai i tempi di esecuzione a causa della prevalenza dei tempi di comunicazione e dei tempi di attesa. Riportimo comunque, per completezza, i grafici dei valori calcolati dello speed-up con affiancato il valore dello speed-up ideale e della relativa efficienza. #CPU T(p) S(p) E(p) 1 981, ,656 0, ,06% ,993 0, ,41% ,293 0, ,07% Tabella1: Parametri di valutativi per M=320x320 #CPU T(p) S(p) E(p) , ,774 0, ,28% ,509 0, ,26% ,255 0, ,10% Tabella2: Parametri di valutativi per M=512x512 #CPU T(p) S(p) E(p) , ,494 1, ,93% ,892 0, ,70% ,194 0, ,16% Tabella3: Parametri di valutativi per M=640x640 #CPU T(p) S(p) E(p) , ,813 1, ,05% ,993 0, ,22% ,854 0, ,21% Tabella4: Parametri di valutativi per M=832x832 Dalla tabella si ricava che la configurazione che sfrutta meglio il parallelismo è quella a quattro processori, dove il valore dello speedup è il più vicino a quello ideale. Tuttavia in generale questa strategia non è molto performante in quanto lo speedup diminuisce sempre di più. I valori ottenuti sono in linea con la legge di Amdhal, infatti si ha un degrado delle prestazioni mantenendo fissa la dimensione e aumentando il numero dei processori. Mentre aumentando la dimensione mantenendo fisse le CPU abbiamo un incremento dello speedup. 20

21 5.3 ESEMPI D USO In questo paragrafo verrà mostrato un esempio dell output che viene generato una volta terminata l esecuzione del programma. L immagine che segue mostra l esecuzione del programma con una matrice 64x64. L output del programma mostra informazioni sul numero dei processori istanziati (in questo caso 4), la dimensione della matrice (in questo caso 64 come da parametro di default), il tempo (che non è affidabile dato che è stato eseguito in ambiente simulato) ed un valore di CheckSum. E prevista una gestione dei parametri errati come si mostra di seguito: 21

22 6. APPENDICE 6.1 CHECKSUM Il CheckSum è calcolato basandosi sulla condizione che i parametri di ingresso sono precaricati con i valori della posizione orizzontale della cella stessa della matrice, quindi: quindi quindi Il prodotto matrice per vettore si riduce quindi ad un array di elementi tutti uguali pari alla somma dei quadrati perfetti che può anche essere calcolata usando il principio di induzione; è noto che la somma dei primi quadrati perfetti è: Il CheckSum viene quindi calcolato confrontando il valore restituito dall algoritmo parallelo ed il valore atteso calcolato con la formula su citata. Se questo valore è 0 allora vuol dire che i processori hanno calcolato il valore corretto. 6.2 FUNZIONI AUSILIARIE Per quanto riguarda i sotto programmi sono state definite soltanto tre funzioni che vengono richiamate con lo scopo di scrivere e leggere i tempi rilevato durante l esecuzione. Di seguito vengono riportate le interfacce e l implementazione. double LeggiTempo(char* nomefile); void ScriviTempi(int nproc,double time,double speedup,doubleeff); void ScriviTempo(double time); double LeggiTempo(char *nomefile){ FILE *ingresso; double tempo; ingresso = fopen(nomefile, "r"); fscanf(ingresso,"%lg",&tempo); fclose(ingresso); return tempo; void ScriviTempo(double time){ FILE *pf1; char *nomefile1 = "tempi_1.txt"; pf1 = fopen(nomefile1, "a"); if(pf1){ fprintf(pf1, "%f\n", time); fclose(pf1); else printf("errore"); void ScriviTempi(int numprocs, double time, double speedup, double eff){ FILE *pf; char *nomefile = "tempi.txt"; pf = fopen(nomefile, "a"); 22

23 if(pf){ fprintf(pf, "%d %f %f %f\n", numprocs, time, speedup, eff); fclose(pf); else printf("errore"); La funzione LeggiTempo() ha il compito di aprire il file dove è stato memorizzato il tempo relativo all esecuzione su una sola CPU, per poi memorizzarlo nella variabile time_1. ScriviTempi() scrive all interno di un file di testo i tempi rilevati man mano che aumenta il numero di processori, associando ad essi i relativi valori di speedup (calcolato mediante l uso del valore precedentemente memorizzato in time_1) ed efficienza. 23

UNIVERSITA DEGLI STUDI DI NAPOLI FEDERICO II

UNIVERSITA DEGLI STUDI DI NAPOLI FEDERICO II UNIVERSITA DEGLI STUDI DI NAPOLI FEDERICO II PROGETTO DI CALCOLO PARALLELO SOMMA DEGLI ELEMENTI DI UN VETTORE STUDENTE Gabriele Piantadosi (885/000282) 1. OBIETTIVI E AMBIENTE DI CALCOLO Si vuole distribuire

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

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

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

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

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

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

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

Sistemi Operativi (M. Cesati)

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

Dettagli

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. Unità Didattica 4 Linguaggio C Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. 1 Vettori Struttura astratta: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice;

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 Elaborato di Calcolo Parallelo Somma di un array di N numeri in MPI Anno Accademico 2011/2012 Professoressa Alessandra D Alessio Studenti

Dettagli

Lezione 8: Stringhe ed array multidimensionali

Lezione 8: Stringhe ed array multidimensionali Lezione 8: Stringhe ed array multidimensionali Vittorio Scarano Corso di Laurea in Informatica Università degli Studi di Salerno Struttura della lezione AVVISO: la lezione di laboratorio di 28/5 non si

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

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

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

Esercizio 1: parole nel testo

Esercizio 1: parole nel testo Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 6 Esercitazione: 11 novembre 2005 Esercizi di riepilogo in preparazione alla prima prova intermedia Problema (tratto da

Dettagli

Fondamenti di Informatica 2

Fondamenti di Informatica 2 Fondamenti di Informatica 2 della prova scritta del 27 Giugno 2006 Esercizio 1 (4 punti) Date le seguenti variabili int A[] = 2,3,7,-2,5,8,-4; int N = 7; int i; Scrivere la porzione di codice che sostituisca

Dettagli

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata Puntatori int i = 10; int * pi = &i; pi i = 10 116 int * pi = pi contiene un informazione che mi permette di accedere ( puntare ) ad una variabile intera Un puntatore contiene un numero che indica la locazione

Dettagli

ARRAY DI PUNTATORI. ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori

ARRAY DI PUNTATORI. ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori Ad esempio: char * stringhe[4]; definisce un vettore di 4 puntatori a carattere

Dettagli

Array. Aggragati di variabili omogenee...

Array. Aggragati di variabili omogenee... Array Aggragati di variabili omogenee... Cosa è un array È un insieme di variabili omogenee identificato da un indice, ad esempio Se devo leggere 1 numeri dallo standard input e memorizzarli all'interno

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

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc() Allocazione Statica Finora abbiamo visto che le variabili sono sempre definite staticamente. Questo è un limite perché la loro esistenza deve essere prevista e dichiarata a priori. In particolare per variabili

Dettagli

Esercizi Array. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Esercizi Array. Parte 7. 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

Fondamenti di Informatica 2

Fondamenti di Informatica 2 Fondamenti di Informatica 2 della prova scritta del 25 Luglio 2006 Esercizio 1 (4 punti) Date le seguenti variabili int A[] = 2,3,7,-2,5,-8,-4; int N = 7; int i; Scrivere la porzione di codice che sostituisca

Dettagli

Prodotto Matrice - Vettore in MPI

Prodotto Matrice - Vettore in MPI Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica Elaborato di Calcolo Parallelo Prodotto Matrice - Vettore in MPI Anno Accademico 2011/2012 Professoressa Alessandra D Alessio Studenti Definizione

Dettagli

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori Ad esempio: char * stringhe[4]; definisce un vettore di 4 puntatori a carattere

Dettagli

Lo scopo. Il primo esperimento. Soluzione informale. Le variabili

Lo scopo. Il primo esperimento. Soluzione informale. Le variabili Lo scopo 2 Il primo esperimento Si vuole scrivere un programma in linguaggio C che chieda all utente di introdurre da tastiera due numeri interi e visualizzi il valore della loro somma sul video Ver. 2.4

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

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

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo) Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo) Selezione di prove di esame al calcolatore Esercizio 1 (esame del 13/01/2006) La classe Matrice definisce oggetti che rappresentano matrici

Dettagli

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012 Funzioni e passaggio parametri Alessandra Giordani agiordani@disi.unitn.it Mercoledì 16 maggio 2012 http://disi.unitn.it/~agiordani/ Cosa vedremo oggi Le funzioni Il passaggio dei parametri Le dichiarazioni

Dettagli

Linguaggio C: Array Valeria Cardellini

Linguaggio C: Array Valeria Cardellini Linguaggio C: Array Valeria Cardellini Corso di Calcolatori Elettronici A.A. 2018/19 Università degli Studi di Roma Tor Vergata Dipartimento di Ingegneria Civile e Ingegneria Informatica Array in C q Dichiarazione

Dettagli

Le basi del linguaggio Java

Le basi del linguaggio Java Le basi del linguaggio Java Compilazione e interpretazione Quando si compila il codice sorgente scritto in Java, il compilatore genera il codice compilato, chiamato bytecode. È un codice generato per una

Dettagli

Strutture dati e loro organizzazione. Gabriella Trucco

Strutture dati e loro organizzazione. Gabriella Trucco Strutture dati e loro organizzazione Gabriella Trucco Introduzione I linguaggi di programmazione di alto livello consentono di far riferimento a posizioni nella memoria principale tramite nomi descrittivi

Dettagli

Soluzioni seconda prova intermedia del 30 gennaio 2006 temi 1 e 2. Siano date le seguenti definizioni di costanti e tipi in linguaggio C:

Soluzioni seconda prova intermedia del 30 gennaio 2006 temi 1 e 2. Siano date le seguenti definizioni di costanti e tipi in linguaggio C: Fondamenti Informatica B Soluzioni seconda prova intermedia del 30 gennaio 2006 temi 1 e 2 Esercizio 1 tema 1 Siano date le seguenti definizioni di costanti e tipi in linguaggio C: #define MAX_LENGTH 40

Dettagli

Passare argomenti al programma

Passare argomenti al programma Passare argomenti al programma Quando si invoca un programma è possibile passare degli argomenti ad esso durante la chiamata. Gli argomenti ricevuti saranno stringhe (array di char) quindi l insieme di

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

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

Fondamenti di Informatica T-1 modulo 2

Fondamenti di Informatica T-1 modulo 2 Fondamenti di Informatica T-1 modulo 2 Contenuti Matrici 2 Esercizio 1 Valutazione delle temperature medie Una stazione meteorologica registra la temperatura esterna ogni ora, ogni giorno per un mese intero,

Dettagli

Corso di Informatica 1 Esercitazione n. 2

Corso di Informatica 1 Esercitazione n. 2 Corso di Informatica 1 Esercitazione n. 2 Marco Liverani Esercizio n. 1 Letto in input un array A di n elementi, usando solo questo array, inverte l ordine degli elementi; ossia se A = (10,27,13,4), allora

Dettagli

Introduzione al C. Lez. 2 Funzioni e Puntatori

Introduzione al C. Lez. 2 Funzioni e Puntatori Introduzione al C Lez 2 Funzioni e Puntatori Esercizio 1: test primalità Scrivere un programma che prenda in input un intero n, e stampa SI se n è primo, NO altrimenti (NB: un intero n è primo se e solo

Dettagli

Compito A. Compito A Sintesi (main(

Compito A. Compito A Sintesi (main( a) chieda all utente il numero di giorni G del mese preso in esame e che controlli che G abbia valore tra 28 e 31 compresi b) chieda all utente di inserire G temperature in ordine dal primo all ultimo

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

IEIM Esercitazione X Ripasso: array, puntatori, ricorsione. Alessandro A. Nacci -

IEIM Esercitazione X Ripasso: array, puntatori, ricorsione. Alessandro A. Nacci - IEIM 2015-2016 Esercitazione X Ripasso: array, puntatori, ricorsione Alessandro A. Nacci alessandro.nacci@polimi.it - www.alessandronacci.it 1 Ripasso su array e puntatori 1 Ripasso su array e puntatori

Dettagli

definisce un vettore di 4 puntatori a carattere (allocata memoria per 4 puntatori)!

definisce un vettore di 4 puntatori a carattere (allocata memoria per 4 puntatori)! " Non ci sono vincoli sul tipo degli elementi di un vettore " Possiamo dunque avere anche vettori di puntatori Ad esempio: char * stringhe[4]; definisce un vettore di 4 puntatori a carattere (allocata

Dettagli

Laboratorio di Elementi di Architetture e Sistemi Operativi Esercizi del 18 Aprile 2012

Laboratorio di Elementi di Architetture e Sistemi Operativi Esercizi del 18 Aprile 2012 Laboratorio di Elementi di Architetture e Sistemi Operativi Esercizi del 18 Aprile 2012 Esercizio 1. Modificare l Esercizio 3 della lezione scorsa (occorrenze di ogni lettera dell alfabeto) in modo che

Dettagli

Introduzione al C. Lez. 2. Funzioni e Puntatori

Introduzione al C. Lez. 2. Funzioni e Puntatori Introduzione al C Lez 2 Funzioni e Puntatori Esercizio 1: test primalità Scrivere un programma che prenda in input un intero n, e stampa SI se n è primo, NO altrimenti (NB: un intero n è primo se è solo

Dettagli

Pigreco in OpenMP. Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica. Elaborato di Calcolo Parallelo. Anno Accademico 2011/2012

Pigreco in OpenMP. Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica. Elaborato di Calcolo Parallelo. Anno Accademico 2011/2012 Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica Elaborato di Calcolo Parallelo Pigreco in OpenMP Anno Accademico 2011/2012 Professoressa Alessandra D Alessio Studenti Giuffrida Serena M63/000239

Dettagli

Esercizi Array Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Esercizi Array 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

Strutture dati. Operatori di incremento e decremento. Strutture di dati. Strutture di dati. ++ e -- Esempi. Vettori e matrici.

Strutture dati. Operatori di incremento e decremento. Strutture di dati. Strutture di dati. ++ e -- Esempi. Vettori e matrici. Operatori di incremento e decremento ++ e -- Esempi y=x++ il contenuto della variabile x viene inizialmente usata per l assegnazione y, e solo dopo incrementata y=--x il contenuto della variabile x viene

Dettagli

Corso di Informatica 1 (IN110) Tutorato n. 3

Corso di Informatica 1 (IN110) Tutorato n. 3 Corso di Informatica 1 (IN110) Tutorato n. 3 Marco Liverani Esercizio n. 1 Letti in input tre array di interi con lo stesso numero n di elementi, costruisce un quarto array di numeri floating point con

Dettagli

Capitolo 10 - Strutture

Capitolo 10 - Strutture 1 Capitolo 10 - Strutture Strutture In molte situazioni, una variabile non è sufficiente per descrivere un oggetto. Ad esempio, una posizione sul piano cartesiano è identificata da due coordinate, e la

Dettagli

Esercitazione 6. Array

Esercitazione 6. Array Esercitazione 6 Array Arrays Array (o tabella o vettore): è una variabile strutturata in cui è possibile memorizzare un numero fissato di valori tutti dello stesso tipo. Esempio int a[6]; /* dichiarazione

Dettagli

Introduzione al C. Unità 7 Array. S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi

Introduzione al C. Unità 7 Array. S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 7 Array S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi Sommario Unità

Dettagli

Gli array Libro cap. 6 Moreno Marzol a Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Gli array Libro cap. 6 Moreno Marzol a Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna Gli array Libro cap. 6 Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ Array 2 Ringraziamenti prof. Stefano Mizzaro, Università

Dettagli

Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni. Lab 05 Array. Lab06 1

Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni. Lab 05 Array. Lab06 1 Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni Lab 05 Array Lab06 1 Esercizio 1 n Creare un programma che legga da input un numero non noto a priori di interi (al

Dettagli

ARRAY E TYPEDEF. A volte è utile definire un nuovo tipo di dato come array. Si usa la solita sintassi del linguaggio C

ARRAY E TYPEDEF. A volte è utile definire un nuovo tipo di dato come array. Si usa la solita sintassi del linguaggio C A volte è utile definire un nuovo tipo di dato come array. Si usa la solita sintassi del linguaggio C Es typedef ; typedef char stringa[10]; dichiara che il tipo stringa è un array

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

Programmazione Appello d esame del 18 giugno 2010 Compito B

Programmazione Appello d esame del 18 giugno 2010 Compito B Programmazione Appello d esame del 18 giugno 2010 Compito B PARTE 0 (propedeutica) Esercizio 0.1 Descrivere il costrutto DOWHILE (sintassi e funzionamento) e darne il diagramma di flusso. Il costrutto

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

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

Matrici. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Matrici. Parte 7. 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

Esercizi con Array. Unità 7. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Esercizi con Array. Unità 7. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi Corso di Ingegneria Clinica BCLR Domenico Daniele Bloisi Docente Ing. Domenico Daniele Bloisi, PhD Ricercatore Dipartimento di Ingegneria Informatica, Automatica e Gestionale Antonio Ruberti Via Ariosto

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

Fondamenti di Informatica 12. Linguaggio C -4

Fondamenti di Informatica 12. Linguaggio C -4 Strutture Dati in C Le strutture dati sono entità che permettono di memorizzare dati in modo organizzato e funzionale a particolari esigenze Fondamenti di Informatica 12. Linguaggio C -4 Strutture Dati

Dettagli

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa. 3 ITI - a.s. 2007-2008 Compiti di Informatica ESTATE 2008 ARRAY E STRINGHE Scrivere una funzione che carica da tastiera un array di n elementi e lo stampa invertendo il primo elemento con l'ultimo, il

Dettagli

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} } ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il

Dettagli

Esercizio 1 - cicli. Esercizio 1 cicli - Soluzione

Esercizio 1 - cicli. Esercizio 1 cicli - Soluzione Sequenze di cifre Esercizio 1 - cicli Realizzare un programma che prende in input una sequenza di cifre (tra 1 e 9) e calcola la somma massima fra le sotto- sequenze di cifre non decrescente Il programma

Dettagli

La copia di un file. contare di quanti caratteri sia composto il file (e quindi determinare la dimensione del file di origine)

La copia di un file. contare di quanti caratteri sia composto il file (e quindi determinare la dimensione del file di origine) La copia di un file Nell'esercizio di oggi cerchiamo di implementare un programma che permetta di effettuare la copia di un file di testo. L'operazione di copia, oltre a permettere di creare un nuovo file

Dettagli

Esercitazione 7. Soluzione:

Esercitazione 7. Soluzione: Esercitazione 7 Esercizio 1: Scrivere una funzione ricorsiva che calcoli il MCD di due numeri interi positivi. Ricordare che la funzione MCD(N,M) termina quando N == M e si ritorna N. int MCD(int N, int

Dettagli

1 (6) 2 (7) 3 (7) 4 (7) 5 (6)

1 (6) 2 (7) 3 (7) 4 (7) 5 (6) CORSO DI LAUREA IN INGEGNERIA ELETTRICA, CHIMICA e MATERIALI Informatica B anno accademico 010-011 Prof. Danilo ARDAGNA Seconda Prova in Itinere 7.06.011 Durata 1h 30 Valutazioni 1 (6) (7) 3 (7) 4 (7)

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

Politecnico di Milano Facoltà di Ingegneria Civile, Ambientale e Territoriale. Informatica B [079904]

Politecnico di Milano Facoltà di Ingegneria Civile, Ambientale e Territoriale. Informatica B [079904] Politecnico di Milano Facoltà di Ingegneria Civile, Ambientale e Territoriale Informatica B [079904] Prof. P. Plebani Allievi Ingegneria Civile e Ambientale II prova in itinere (04 Febbraio 2009) Cognome

Dettagli

Matrici.h Definizione dei tipi #define MAXROWS 10 #define MAXCOLS 10 #define ELEMENT int #define ELEMENTFORMAT "%d" Tipo degli elementi della matrice

Matrici.h Definizione dei tipi #define MAXROWS 10 #define MAXCOLS 10 #define ELEMENT int #define ELEMENTFORMAT %d Tipo degli elementi della matrice Matrici Un po di esercizi sulle matrici Semplici Lettura e scrittura Calcolo della trasposta Media difficoltà Calcolo del determinante Difficili Soluzione di sistemi lineari È veramente difficile? 1 Matrici.h

Dettagli

IL PRIMO PROGRAMMA IN C

IL PRIMO PROGRAMMA IN C IL PRIMO PROGRAMMA IN C LO SCOPO Si vuole scrivere un programma in linguaggio C che chieda all utente di introdurre da tastiera due numeri interi e visualizzi il valore della loro somma sul video SOLUZIONE

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

Corso di Informatica 1 (IN110) Tutorato n. 4

Corso di Informatica 1 (IN110) Tutorato n. 4 Corso di Informatica 1 (IN110) Tutorato n. 4 Marco Liverani Esercizio n. 1 Letto in input un array di n numeri interi ed un intero k > 1, eliminare dall array tutti i multipli di k, spostando a sinistra

Dettagli

ACSO Programmazione di Sistema e Concorrente

ACSO Programmazione di Sistema e Concorrente ACSO Programmazione di Sistema e Concorrente P2 Modello Thread 2/12/2015 programma e parallelismo il tipo di parallelismo dipende dal grado di cooperazione (scambio di informazione) necessario tra attività

Dettagli

Laboratorio 1. 15/16 marzo 2018

Laboratorio 1. 15/16 marzo 2018 Laboratorio 1. 15/16 marzo 2018 Attivitá Professionalizzante A.A. 2017/18 Premessa Quando avete finito gli esercizi, inviatemeli in un unico file compresso chiamato lab1 CognomeNome (zip, rar,...), all

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

Array e puntatori in C

Array e puntatori in C Array e puntatori in C Diapositive adattate dalle omonime create dalla Dottoressa di Ricerca Giovanna Melideo per il corso di Laboratorio di Algoritmi e Strutture Dati 10/05/2005 LP2-04/05 - Appunti di

Dettagli

Matrici. Matrici.h Definizione dei tipi. Un po di esercizi sulle matrici Semplici. Media difficoltà. Difficili

Matrici. Matrici.h Definizione dei tipi. Un po di esercizi sulle matrici Semplici. Media difficoltà. Difficili Matrici Un po di esercizi sulle matrici Semplici Lettura e scrittura Calcolo della trasposta Media difficoltà Calcolo del determinante Difficili Soluzione di sistemi lineari È veramente difficile? 1 Matrici.h

Dettagli

Gli Array. Dichiarazione di un array

Gli Array. Dichiarazione di un array Gli Array Un array rappresenta una variabile indicizzata (ovvero contenente un indice) che viene utilizzata per contenere più elementi dello stesso tipo. Ogni array ha un nome al quale viene associato

Dettagli

I tipi strutturati e i record in C++

I tipi strutturati e i record in C++ I tipi strutturati e i record in C++ Docente: Ing. Edoardo Fusella Dipartimento di Ingegneria Elettrica e Tecnologie dell Informazione Via Claudio 21, 4 piano laboratorio SECLAB Università degli Studi

Dettagli

Programmazione I - Laboratorio

Programmazione I - Laboratorio Programmazione I - Laboratorio Esercitazione 3 - Array Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti di.unipi.it 2. Dipartimento

Dettagli

Esercitazioni di Fondamenti di Informatica - Lez. 5 30/10/2018

Esercitazioni di Fondamenti di Informatica - Lez. 5 30/10/2018 Esercitazioni di Fondamenti di Informatica - Lez. 30/10/018 Esercizi sulle funzioni in C I codici e le soluzioni degli esercizi sono nella cartella parte1 1. Scrivere i prototipi delle seguenti funzioni.

Dettagli

Problema. Vettori e matrici. Vettori. Vettori

Problema. Vettori e matrici. Vettori. Vettori e matrici Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione in C Problema Si vuole un programma che chieda 10 numeri dalla tastiera e li visualizzi dall ultimo al primo Soluzione attuale (con le

Dettagli

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice Funzioni FUNZIONI Spesso può essere utile avere la possibilità di costruire nuove istruzioni che risolvono parti specifiche di un problema Una funzione permette di attribuire un nome ad un insieme di istruzioni

Dettagli

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) { JAVA C import javautil*; public static class test { private int variable; public void main (String[] args) { variable = 0; Systemoutprintln( Variable is: + variable); #include int variable; int

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

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura: Le classi in java Un semplice programma java, formato da una sola classe, assume la seguente struttura: class Domanda static void main(string args[]) System.out.println( Quanti anni hai? ); La classe dichiarata

Dettagli

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

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano Scope delle variabili e passaggio parametri Danilo Ardagna Politecnico di Milano 1-4-2014 Introduzione! Con le funzioni è stato introdotto un meccanismo per definire dei piccoli programmi all interno di

Dettagli

Gestione dei File C. Generalità

Gestione dei File C. Generalità Gestione dei File C 1 Generalità Il linguaggio C non contiene alcuna istruzione di Input/Output. Tali operazioni vengono svolte mediante chiamate a funzioni definite nella libreria standard contenute nel

Dettagli

Programmazione I (Classe 1)

Programmazione I (Classe 1) Programmazione I (Classe 1) Terzo Appello (prima prova) 9 Settembre 2016 Docenti: De Prisco - Deufemia - Zizza Cognome: Nome: Matricola: Ritirato 1 Esercizi (leggere attentamente il testo prima di scrivere

Dettagli

Passaggio dei parametri

Passaggio dei parametri Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei parametri così passati non si riflettono sull environment

Dettagli

Matrici Un po di esercizi sulle matrici Semplici Lettura e scrittura Calcolo della trasposta Media difficoltà Calcolo l del determinante t È Difficili

Matrici Un po di esercizi sulle matrici Semplici Lettura e scrittura Calcolo della trasposta Media difficoltà Calcolo l del determinante t È Difficili Matrici Un po di esercizi sulle matrici Semplici Lettura e scrittura Calcolo della trasposta Media difficoltà Calcolo l del determinante t È Difficili Soluzione di sistemi lineari È veramente difficile?

Dettagli

... b 2 X 2. . b N X N. a 11 a 12.. a 1N a 21 a 22.. a 2N A =. a N1... a NN

... b 2 X 2. . b N X N. a 11 a 12.. a 1N a 21 a 22.. a 2N A =. a N1... a NN Matrici Un po di esercizi sulle matrici Semplici Lettura e scrittura Calcolo della trasposta Media difficoltà Calcolo l del determinante t È veramente Difficili difficile? Soluzione di sistemi lineari

Dettagli

Dati due punti sul piano calcolare la loro distanza

Dati due punti sul piano calcolare la loro distanza Introduzione al C Primo esempio in C Dati due punti sul piano calcolare la loro distanza Soluzione: la distanza fra due punti si calcola secondo il teorema di Pitagora, con la formula: y Distanza = (lato12

Dettagli

Esercizi. La funzione swapint() primo tentativo

Esercizi. La funzione swapint() primo tentativo Politecnico di Milano Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio di array. #include

Dettagli