MPI_Gather ошибка отправки и получения массива - PullRequest
0 голосов
/ 19 января 2019
    #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 

1 Ответ

0 голосов
/ 20 января 2019

Вы не передали значение m, поэтому только ранг 0 имеет правильное значение - похоже, по умолчанию он равен m = 0 для других рангов, отсюда и их выход.

Барьер неТребуется - коллективы MPI выполняют всю необходимую синхронизацию автоматически.

Если вы замените свой барьерный вызов на:

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

, тогда ваш код работает должным образом (при условии, что выходные данные не так чисты, какВы можете ожидать, как указано выше Жилем).

...