/* ************************************************ Somma di n numeri calcolati su macchine tipo MIMD Progetto Realizzato da Giovanni Di Cecca ACM Student Member Association for Computing Machinery Web Site: http://www.dicecca. net E-Mail: info@dicecca.net ************************************************ Richiede Librerie MPI Per compialzione in Windows XP, scaricare la libreria: http://lnx.dicecca.net/portale/cartelle-web/doc_download/79-mpi-library-for-windows.html Manuale MPI http://lnx.dicecca.net/portale/cartelle-web/doc_download/80-mpi-library-for-windows-manual.html Manuale Operativo del Progetto http://lnx.dicecca.net/portale/cartelle-web/doc_download/99-somma-di-n-numeri-su-architettura-mimd.html ************************************************ */ // Parte preprocessore #include #include #include #include "mpi.h" // Inizio del programma int main (int argc, char **argv) { // Dichiarazioni variabili int menum,nproc,tag; // Variabili per MPI int n,nloc,i,sum,resto,nlocgen; int ind,p,r,inviaA,ricevida,tmp; int *pot,*vett,*vett_loc,passi=0; int sumloc=0; /* ******************************************** ** Fase di inizializzazione dell'ambiente di calcolo ******************************************** */ // Variabili per verificare il livello delle prestazioni double T_inizio,T_fine,T_max; // Contiene le informazioni sulla ricezione del messaggio MPI_Status info; // Inizializzazione dell'ambiente di calcolo MPI MPI_Init(&argc,&argv); // Identificativo del processore (contenuto in menum) MPI_Comm_rank(MPI_COMM_WORLD, &menum); // Verifica del numero di processori della rete di calcolo MPI_Comm_size(MPI_COMM_WORLD, &nproc); /* ******************************************** ** Fase di inserimento dei dati ******************************************** */ // Seleziona il processore P0 if (menum==0) { system("clear"); // pulisci schermo printf("Inserire quanti numeri vuoi sommare: "); scanf("%d",&n); // Allocazione dinamica di un vettore di n elementi interi nel processore P0 vett=(int*)calloc(n,sizeof(int)); } // Invio del valore di n a tutti i processori appartenenti a MPI_COMM_WORLD MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD); // calcolo del numero di addendi da assegnare a ciascun processore nlocgen=n/nproc; //Calcolo del resto. Stabiliamo se ci sono altri addendi da ripartire tra i processori*/ resto=n%nproc; // Se ci sono addendi in piu, il processore di identificativo menum incrementa il numero di addendi ricevuti if(menum>1; // determina il numero dei passi per sapere quante spedizioni di somme parziali bisogna fare passi++; } // allocazione dinamica del vettore pot che calcola la potenza di 2^n pot=(int*)calloc(passi+1,sizeof(int)); for(i=0;i<=passi;i++) { // creazione del vettore pot di elementi passi+1, contenente le potenze di 2 pot[i]=p<