I am trying to pass on data to MPI_Gather
. I allocate memory as follows:
float *phie, *phitemp;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
phitemp=(float *) malloc(20*sizeof(float));
if (rank==1) phie=(float *) malloc(itermax*20*size*sizeof(float));
and then get all processes to send data to rank 1 using MPI_Gather()
as below:
for (iter=0;iter<itermax;iter++) {
MPI_Gather((float *) phitemp, 20, MPI_FLOAT, (float *) (phie+iter*20*size*sizeof(float)), 20, MPI_FLOAT, 1, MPI_COMM_WORLD);
iter=0;
}
I get error messages suggesting I am not allocating memory appropriately.
Pointer arithmetic is done on the size of word the pointer is pointing to. Since
phie
is afloat *
, thesizeof(float)
inphie+iter*20*size*sizeof(float)
is redundant and you are going outside of the valid memory.Remove the
sizeof(float
), or better change it to a clearer array indexing:&(phie[iter * 20 * size])
You should also remove all the pointer casts, they are all redundant and can hide issues. You should only cast when you know that you need it.
Regarding your additional question: The
recvbuf
parameter ofMPI_Gather
is only significant at the root process. Therefore only theiter
of the root process matters. Nevertheless since all your processes go through the same loop of runningMPI_Gather
, and they cannot overtake each other, they will always have the sameiter
during matching gathers.