2017-10-07 42 views
0

我正尝试将数组发送到超立方体系结构中的不同处理器。问题是它要么不发送给所有的处理器,要么发送给错误的处理器。当我尝试发送一个整数时,它可以正常工作。无法将数组发送到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),我会看看。 –