PDA

View Full Version : [MPI/C] Problema con Recv e Send


PieceSpencer
17-10-2019, 15:46
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.
#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;

}

In pratica alla prima Recv nell'else, mi va in deadlock e non capisco il perche'. Sono arrivato alla conclusione che sia qualcosa legato ad array_num e il suop numero di elementi (n_somme)
Ah dimenticavo....devo calcolare la somma dei primi n numeri reali .

Kaya
18-10-2019, 08:46
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.
[CODE
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
[/CODE]

.
Purtroppo non conosco MPI quindi non saprei aiutarti, ma non mi torna questo punto
n_somme= n/nproc;
definisci n_somme come int ma la divisione potrebbe ritornarti anche un float.. è solo perchè ti serve la parte intera?

melko
20-10-2019, 17:46
non sono esperto di MPI ma:
MPI_Send(&array_num,n_somme,MPI_FLOAT,0,tag,MPI_COMM_WORLD);


qui fai una send da rank 0 verso rank 0, mentre immagino quello che vorresti fare sia una send da rank 0 a tutti gli altri (che nel gergo di MPI sarebbe una Scatter).
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