2017-10-07 12 views
0

ハイパーキューブアーキテクチャの異なるプロセッサにアレイを送信しようとしています。問題は、すべてのプロセッサに送信しないか、間違ったプロセッサに送信することです。 1つの整数を送信しようとすると正しく動作します。ここでアレイを送信してMPIの宛先プロセッサを修正できない

は、コードは次のとおりです。

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; 
} 

は私が世話をしておりませんものはあります?

答えて

1

あなたの配列はint X[]として宣言されているので、あなたが持っているバッファはMPI_Send()に渡すかMPI_Recv()Xの代わり&Xです。

&X[0]を渡すことも正しいですが、私はむしろより簡単であるため、Xを提案したいと思います。

+0

Xでも送信してみました。私は同じ問題を抱えています。 私はこの問題のために回避策を得ましたが、コードがどのようにすべきかはわかりません。別の関数 'ハイパーキューブ'を作成する代わりに、すべてをメインの中に入れます。私はなぜそれが今働くのか分からない。 –

+1

[最小、完全、および検証可能な例](https://stackoverflow.com/help/mcve)で質問を編集してください。 –

関連する問題