2017-10-07 7 views
0

J'essaye d'envoyer un tableau aux différents processeurs dans l'architecture d'hypercube. Le problème est qu'il n'envoie pas à tous les processeurs ou qu'il envoie au mauvais processeur. Lorsque j'essaie d'envoyer un seul entier, cela fonctionne correctement.Impossible d'envoyer la matrice au processeur de destination correct dans MPI

Voici le code:

void hypercube(int d,int my_id,int X[]){ 
    mask = (int)pow((double)2,d)-1; 
for(i = d-1;i>=0;i--){ 
     //printf("before xor mask is %d and power is %d\n",mask,(int)pow((double)2,i)); 
     mask = xor(mask,(int)pow((double)2,i)); 
     //printf("After xor rank is %d and mask is %d\n",rank,mask); 
     if(and(my_id, mask) == 0){ 
       if(and(my_id,(int) pow((double)2,i)) == 0){ 
         dest = xor(my_id,(int) pow((double)2,i)); 
         printf("rank %d destination %d\n",rank,dest); 
         MPI_Send(&X,8,MPI_INT,dest,tag,MPI_COMM_WORLD);; 
         //MPI_Send(&X,1,MPI_INT,dest,tag,MPI_COMM_WORLD); 
         //printf("After sending from rank %d and destination is %d\n",my_id,dest); 
       } 
       else{ 
         //printf("going to receive in a sec...\n"); 
         source = xor(my_id,(int)pow((double)2,i)); 
         MPI_Recv(&X,8,MPI_INT,source,tag,MPI_COMM_WORLD,&status); 
         //MPI_Recv(&X,1,MPI_INT,source,tag,MPI_COMM_WORLD,&status); 
         //printf("in rank %d with data %d\n",rank,X); 

       } 
     } 
    } 
} 

int main(int argc, char **argv){ 


    MPI_Init(&argc,&argv); 
    MPI_Comm_size(MPI_COMM_WORLD,&world_size);; 
    MPI_Comm_rank(MPI_COMM_WORLD,&rank); 


    if(rank == master){ 
    //a[ARR_SIZE] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 
    // q = 4; 
    } 

    hypercube(3,rank,a); 


    return 0; 
} 

Y at-il quelque chose que je ne prends pas soin de ??

Répondre

1

Votre tableau est déclaré comme int X[], de sorte que le tampon vous devez passer à MPI_Send() ou MPI_Recv() est X au lieu de &X.

Note passant &X[0] est également correct, même si je préfère suggérer X parce que c'est plus simple.

+0

J'ai essayé de l'envoyer avec X aussi. J'ai le même problème. J'ai un travail pour contourner ce problème mais ce n'est pas comment un code devrait être. Au lieu de créer une fonction séparée «hypercube», je mets tout à l'intérieur de la main. Je ne sais pas pourquoi cela fonctionne maintenant. –

+1

s'il vous plaît modifier votre question avec un [exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve) et je vais jeter un oeil. –