Ошибка сегментации MPI_Scatter с помощью malloc - PullRequest
0 голосов
/ 17 октября 2018

Можете ли вы объяснить, почему этот код работает отлично:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

typedef struct Point
{
    double x;
    double y;
} point;

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

  MPI_Datatype mpi_point;
  MPI_Type_contiguous(2, MPI_DOUBLE, &mpi_point);
  MPI_Type_commit(&mpi_point);


  point local[2];

  if(rank==0)
  {
    point *buf;
    buf = malloc(10*sizeof(point));
    for(int i = 0; i<10; i++)
    {
        buf[i].x= (double)i;
        buf[i].y= (double)i+i;
    }
    MPI_Scatter(buf, 2, mpi_point, &local, 2, mpi_point, 0, MPI_COMM_WORLD);
    free(buf);
  }
  else
  {
    point *buf = NULL;
    MPI_Scatter(buf, 2, mpi_point, &local, 2, mpi_point, 0, MPI_COMM_WORLD);
  }

  printf("Hello, process %d has points: 1-> %f %f 2-> %f %f\n", rank, local[0].x, local[0].y, local[1].x, local[1].y);
  MPI_Finalize();
  return 0;
}

, а этот ниже не работает?Большая часть вывода ошибок заканчивается на segmentation fault.

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

typedef struct Point
{
    double x;
    double y;
} point;

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

  MPI_Datatype mpi_point;
  MPI_Type_contiguous(2, MPI_DOUBLE, &mpi_point);
  MPI_Type_commit(&mpi_point);


  point *local;

  if(rank==0)
  {
    point *buf;
    buf = malloc(10*sizeof(point));
    for(int i = 0; i<10; i++)
    {
        buf[i].x= (double)i;
        buf[i].y= (double)i+i;
    }
    MPI_Scatter(buf, 2, mpi_point, &local, 2, mpi_point, 0, MPI_COMM_WORLD);
    free(buf);
  }
  else
  {
    point *buf = NULL;
    local = malloc(2*sizeof(point));
    MPI_Scatter(buf, 2, mpi_point, &local, 2, mpi_point, 0, MPI_COMM_WORLD);
  }

  printf("Hello, process %d has points: 1-> %f %f 2-> %f %f\n", rank, local[0].x, local[0].y, local[1].x, local[1].y);
  MPI_Finalize();
  return 0;
}

Единственное отличие состоит в том, что local в одном случае определяется как вектор "напрямую", а в другом - это указатель, а затем ясделать malloc.Разве это не должно быть то же самое?Оба они размещены в стеке с одинаковым измерением, так как же возможно, что тот с malloc не работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...