|
|
|
|
Strumenti |
17-10-2019, 14:46 | #1 |
Junior Member
Iscritto dal: Jun 2017
Messaggi: 14
|
[MPI/C] Problema con Recv e Send
Buonasera a tutti ragazzi, volevo chiedervi una cosa su questo programma che dovrei fare per l'universtita', ma purtroppo va in deadlock alla prima Recv.
Codice:
#include <stdio.h> #include <stdlib.h> #include <mpi.h> int main (int argc, char *argv[]){ float *array_num,*array_sott; int i,j,start,n_fuori,z; char *ptr; int n=argc; //numero di reali immessi in input float resto,sum,sum_parz=0; int n_somme,numero_piu,num,menum,nproc,tag; MPI_Status info; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&menum); MPI_Comm_size(MPI_COMM_WORLD,&nproc); n_somme=n/nproc; //mi calcola il numero di somme da svolgere resto=n%nproc; MPI_Bcast(&n_somme,1,MPI_INT,0,MPI_COMM_WORLD); if(resto > 0){ //significa che le somme sono di numero dispari (considerando ovviamente i processori di numero pari) numero_piu= (n-1)-(nproc * n_somme); //numero di somme in piu' MPI_Bcast(&numero_piu,1,MPI_INT,0,MPI_COMM_WORLD); } if(menum==0) { tag=10; sum=(atof(argv[1])); for(i=2;i<=n_somme;i++){ sum=sum+(atof(argv[i])); } array_num=malloc(n_somme+sizeof(float)); for(j=0;j<n_somme;j++){ array_num[j]=atof(argv[i]); i++; } for(z=0;z<n_somme;z++){ printf("\na[%d] vale %f\n",z,array_num[z]); fflush(stdout); } /*ptr=argv[i]; printf("%s",ptr); printf("\n%p",ptr); printf("\n%p\n",argv[i]); printf("%c\n",(const char)(*ptr+sizeof(char)));*/ sum_parz=0; //printf("\n%d\n",n_somme); printf("\n il tag e' %d\n",tag); MPI_Send(&array_num,n_somme,MPI_FLOAT,0,tag,MPI_COMM_WORLD); //MPI_Send(&sum_parz,1,MPI_FLOAT,0,tag,MPI_COMM_WORLD); /*tag=tag+1; MPI_Recv(&sum_parz,1,MPI_FLOAT,1,tag,MPI_COMM_WORLD,&info); */ //sum=sum+sum_parz; //printf("\n 1 la somma e' %f\n",sum); } else { tag=10; printf("\n il tag e' %d\n",tag); //printf("\n la somma e' %f\n",sum_parz); //printf("\n%d\n",n_somme); MPI_Recv(&array_num,n_somme,MPI_FLOAT,0,tag,MPI_COMM_WORLD,&info); printf("\n%d\n",n_somme); //MPI_Recv(&sum_parz,1,MPI_FLOAT,0,tag,MPI_COMM_WORLD,&info); //printf("\n la somma e' %f\n",sum_parz); sum_parz=0; //printf("\n la somma e' %f\n",sum_parz); sum_parz=array_num[0]; //printf("\n la somma e' %f\n",sum_parz); for(j=1;j<=n_somme;j++) { sum_parz=sum_parz+array_num[j]; printf("\n%f\n",sum_parz); } printf("\n 2 la somma e' %f\n",sum_parz); /*tag=tag+1; MPI_Send(&sum_parz,1,MPI_FLOAT,1,tag,MPI_COMM_WORLD); */ } MPI_Finalize(); return 0; } Ah dimenticavo....devo calcolare la somma dei primi n numeri reali . Ultima modifica di PieceSpencer : 17-10-2019 alle 14:49. |
18-10-2019, 07:46 | #2 | |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 2993
|
Quote:
n_somme= n/nproc; definisci n_somme come int ma la divisione potrebbe ritornarti anche un float.. è solo perchè ti serve la parte intera? |
|
20-10-2019, 16:46 | #3 | |
Member
Iscritto dal: Feb 2011
Messaggi: 46
|
non sono esperto di MPI ma:
Quote:
Oltretutto occhio che ci potrebbero essere altre sviste, ad una rapida occhiata: - sia nella send che nella recv passi l'indirizzo di array_num, che a sua volta è già un puntatore - nella parte di ricezione array_num non è inizializzato - argc conta sempre anche il comando usato per lanciare il programma (argv[0]), quindi il numero totale di reali immessi è argc-1 |
|
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:30.