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 a float *
, the sizeof(float)
in phie+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 of MPI_Gather
is only significant at the root process. Therefore only the iter
of the root process matters. Nevertheless since all your processes go through the same loop of running MPI_Gather
, and they cannot overtake each other, they will always have the same iter
during matching gathers.