首页 > 解决方案 > MPI_Gather 发送和接收数组错误

问题描述

    #include<mpi.h>
    #include<stdio.h>
    int main(int argc,char * argv[])
    {
      int rank,size,m;
      int arr[1000];
      int b[100];
      MPI_Init(&argc,&argv);
      MPI_Comm_rank(MPI_COMM_WORLD,&rank);
      MPI_Comm_size(MPI_COMM_WORLD,&size);

      if(rank == 0)
      {
        scanf("%d",&m);
        for(int i=0;i<size*m;i++)
        {
          scanf("%d",&arr[i]);
        }

      }
      MPI_Barrier(MPI_COMM_WORLD);
      MPI_Scatter(arr,m,MPI_INT,b,m,MPI_INT,0,MPI_COMM_WORLD);

      printf("in process %d \n",rank);
      for(int i=0;i<m;i++)
      {
        printf("%d ",b[i]);
      }
      printf("\n");

      MPI_Finalize();
      return 0;
    }

输入

mpiexec -n 4 ./three

实际输出

in process 2 
in process 1 
in process 3 
2
1 2 3 4 5 6 7 8 
in process 0 
1 2

预期产出

2
1 2 3 4 5 6 7 8 
in process 0
1 2
in process 1
3 4 
in process 2
5 6 
in process 3
7 8 

标签: cmpi

解决方案


您尚未广播 m 的值,因此只有 0 级具有正确的值 - 看起来它在其他等级上默认为 m=0,因此它们缺乏输出。

不需要屏障 - MPI 集合会自动执行所有必要的同步。

如果您将屏障调用替换为:

MPI_Bcast(&m, 1, MPI_INT, 0, MPI_COMM_WORLD);

然后您的代码按预期工作(但输出不像上面 Gilles 所指出的那样干净)。


推荐阅读