如何使用MPI_Allgather

如何使用MPI_Allgather,mpi,Mpi,我正在测试MPI_Allgather,我得到了奇怪的结果。。。 下面的代码给了我一个输出:“P0接收:0,42,-178025336,42,”。 唯一正确的结果是第1个,因为他们都派出了自己的队伍。输出应该是:“0,1,2,3”。我不明白这为什么不能像预期的那样起作用 int main(int argc, char* argv[]) { int rank = 0; int size = 0; MPI_Init(&argc,&argv); MPI_C

我正在测试MPI_Allgather,我得到了奇怪的结果。。。 下面的代码给了我一个输出:“P0接收:0,42,-178025336,42,”。 唯一正确的结果是第1个,因为他们都派出了自己的队伍。输出应该是:“0,1,2,3”。我不明白这为什么不能像预期的那样起作用

int main(int argc, char* argv[])
{
    int rank = 0;
    int size = 0;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    int* arr = new int[4];

    MPI_Allgather(&rank, 1, MPI_INT, arr, 4, MPI_INT, MPI_COMM_WORLD);

    if(rank == 0)
    {
    printf("P0 received: ");
    for(int i=0; i< 4; i++)
        printf("%i,", arr[i]);
    printf("\n");
    }
    delete arr;
    MPI_Finalize();
}
intmain(intargc,char*argv[])
{
int秩=0;
int size=0;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
int*arr=新的int[4];
MPI_Allgather(&rank,1,MPI_INT,arr,4,MPI_INT,MPI_COMM_WORLD);
如果(秩==0)
{
printf(“P0接收:”);
对于(int i=0;i<4;i++)
printf(“%i”,arr[i]);
printf(“\n”);
}
删除arr;
MPI_Finalize();
}

MPI\u Allgather中的接收计数参数是每个进程,而不是总数。您希望每个进程接收1 int,而不是4 int。所以您需要
MPI\u Allgather(&rank,1,MPI\u INT,arr,1,MPI\u INT,MPI\u COMM\u WORLD)。谢谢!回答得很好。如果你愿意,你可以回答这个问题,我会将它标记为已回答,这样它就会在搜索中显示为“已回答”,你就会获得声誉。