L
lancer6238
Hi all,
I'm trying to send and receive a structure array "TABLE". I tried
using MPI_Type_struct but I got "Segmentation fault" when the
processor (P1) is supposed to receive the structure.
Assuming there are only 2 processors, my program is as follows:
#include <stdio.h>
#include <mpi.h>
typedef struct
{
int previ;
int prevj;
int prevrank;
double value;
}TABLE;
void Build_derived_type(TABLE *cell, MPI_Datatype *stable)
{
int block_lengths[4];
MPI_Aint displacements[4];
MPI_Aint addresses[5];
MPI_Datatype typelist[4];
typelist[0] = MPI_INT;
typelist[1] = MPI_INT;
typelist[2] = MPI_INT;
typelist[3] = MPI_DOUBLE;
block_lengths[0] = block_lengths[1] = block_lengths[2] =
block_lengths[3] = 1;
MPI_Address(cell, &addresses[0]);
MPI_Address(&(cell->previ), &addresses[1]);
MPI_Address(&(cell->prevj), &addresses[2]);
MPI_Address(&(cell->prevrank), &addresses[3]);
MPI_Address(&(cell->value), &addresses[4]);
displacements[0] = addresses[1] - addresses[0];
displacements[1] = addresses[2] - addresses[0];
displacements[2] = addresses[3] - addresses[0];
displacements[3] = addresses[4] - addresses[0];
MPI_Type_struct(4, block_lengths, displacements, typelist, stable);
MPI_Type_commit(stable);
}
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
int rank, size;
TABLE cell, cell1;
int i;
double j;
MPI_Datatype stable;
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank == 0)
{
cell.previ = 1;
cell.prevj = 2;
cell.prevrank = 3;
cell.value = 4.5;
Build_derived_type(&cell, &stable);
MPI_Send(&cell, 1, stable, 1, 1, MPI_COMM_WORLD);
}
else
{
MPI_Recv(&cell1, 1, stable, 0, 1, MPI_COMM_WORLD, &status);
printf("%d %d %d %lf\n", cell1.previ, cell1.prevj,
cell1.prevrank, cell1.value);
}
MPI_Finalize();
return 0;
}
What is wrong with my program?
Thank you.
Regards,
Rayne
I'm trying to send and receive a structure array "TABLE". I tried
using MPI_Type_struct but I got "Segmentation fault" when the
processor (P1) is supposed to receive the structure.
Assuming there are only 2 processors, my program is as follows:
#include <stdio.h>
#include <mpi.h>
typedef struct
{
int previ;
int prevj;
int prevrank;
double value;
}TABLE;
void Build_derived_type(TABLE *cell, MPI_Datatype *stable)
{
int block_lengths[4];
MPI_Aint displacements[4];
MPI_Aint addresses[5];
MPI_Datatype typelist[4];
typelist[0] = MPI_INT;
typelist[1] = MPI_INT;
typelist[2] = MPI_INT;
typelist[3] = MPI_DOUBLE;
block_lengths[0] = block_lengths[1] = block_lengths[2] =
block_lengths[3] = 1;
MPI_Address(cell, &addresses[0]);
MPI_Address(&(cell->previ), &addresses[1]);
MPI_Address(&(cell->prevj), &addresses[2]);
MPI_Address(&(cell->prevrank), &addresses[3]);
MPI_Address(&(cell->value), &addresses[4]);
displacements[0] = addresses[1] - addresses[0];
displacements[1] = addresses[2] - addresses[0];
displacements[2] = addresses[3] - addresses[0];
displacements[3] = addresses[4] - addresses[0];
MPI_Type_struct(4, block_lengths, displacements, typelist, stable);
MPI_Type_commit(stable);
}
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
int rank, size;
TABLE cell, cell1;
int i;
double j;
MPI_Datatype stable;
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank == 0)
{
cell.previ = 1;
cell.prevj = 2;
cell.prevrank = 3;
cell.value = 4.5;
Build_derived_type(&cell, &stable);
MPI_Send(&cell, 1, stable, 1, 1, MPI_COMM_WORLD);
}
else
{
MPI_Recv(&cell1, 1, stable, 0, 1, MPI_COMM_WORLD, &status);
printf("%d %d %d %lf\n", cell1.previ, cell1.prevj,
cell1.prevrank, cell1.value);
}
MPI_Finalize();
return 0;
}
What is wrong with my program?
Thank you.
Regards,
Rayne