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 .
#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 .