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;
}
は私が世話をしておりませんものはあります?
Xでも送信してみました。私は同じ問題を抱えています。 私はこの問題のために回避策を得ましたが、コードがどのようにすべきかはわかりません。別の関数 'ハイパーキューブ'を作成する代わりに、すべてをメインの中に入れます。私はなぜそれが今働くのか分からない。 –
[最小、完全、および検証可能な例](https://stackoverflow.com/help/mcve)で質問を編集してください。 –