|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#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 15:49. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3278
|
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? |
|
|
|
|
|
|
#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: 17:16.




















