Можете ли вы объяснить, почему этот код работает отлично:
#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
не работает?