I am using derived datatypes to broadcast array of structures as below. But what is happens is that I send only the half of what I would like. rank1 should have values (0-9) until i=9 like rank0. But it has (0-5) until i =4. Any idea?
Code:
#include <stdio.h>
#include <mpi.h>
#include <time.h>
#include <stdlib.h>
struct chromosome{
double fitness;
double glob_fit;
};
struct chromosome old_chrome[100];
int main(int argc, char *argv[])
{int i,id,p,j,z;
double arrayx[100];
MPI_Datatype datatype;
MPI_Datatype type1[2] = {MPI_DOUBLE,MPI_DOUBLE};
int blocklen1[2]= {1,1};
MPI_Aint disp1[2];
MPI_Aint base;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &id);
MPI_Comm_size(MPI_COMM_WORLD, &p);
MPI_Address(old_chrome,disp1);
MPI_Address(old_chrome,disp1+1);
base = disp1[0];
for(i=0;i<2;i++){disp1[i] -= base;}
MPI_Type_struct(2,blocklen1,disp1,type1,&datatype);
MPI_Type_commit(&datatype);
if(id==0){
for(i=0;i<10;i++)
{old_chrome[i].fitness=i;}
}
for(i=0;i<10;i++)
{ printf("rank=%d i=%d value= %lf\n",id,i,old_chrome[i].fitness);}
printf("\n");
MPI_Bcast(&old_chrome,10,datatype,0,MPI_COMM_WORLD);
for(i=0;i<10;i++)
{
printf("xixi rank %d i= %d value %lf\n",id,i,old_chrome[i].fitness);}
MPI_Finalize();
return 0;
}
rank=0 i=0 value= 0.000000
rank=0 i=1 value= 1.000000
rank=0 i=2 value= 2.000000
rank=0 i=3 value= 3.000000
rank=0 i=4 value= 4.000000
rank=0 i=5 value= 5.000000
rank=0 i=6 value= 6.000000
rank=0 i=7 value= 7.000000
rank=0 i=8 value= 8.000000
rank=0 i=9 value= 9.000000
rank=1 i=0 value= 0.000000
rank=1 i=1 value= 0.000000
rank=1 i=2 value= 0.000000
xixi rank 0 i= 0 value 0.000000
rank=1 i=3 value= 0.000000
xixi rank 0 i= 1 value 1.000000
rank=1 i=4 value= 0.000000
rank=1 i=5 value= 0.000000
rank=1 i=6 value= 0.000000
rank=1 i=7 value= 0.000000
xixi rank 0 i= 2 value 2.000000
rank=1 i=8 value= 0.000000
rank=1 i=9 value= 0.000000
xixi rank 0 i= 3 value 3.000000
xixi rank 0 i= 4 value 4.000000
xixi rank 0 i= 5 value 5.000000
xixi rank 0 i= 6 value 6.000000
xixi rank 0 i= 7 value 7.000000
xixi rank 0 i= 8 value 8.000000
xixi rank 0 i= 9 value 9.000000
xixi rank 1 i= 0 value 0.000000
xixi rank 1 i= 1 value 1.000000
xixi rank 1 i= 2 value 2.000000
xixi rank 1 i= 3 value 3.000000
xixi rank 1 i= 4 value 4.000000
xixi rank 1 i= 5 value 0.000000
xixi rank 1 i= 6 value 0.000000
xixi rank 1 i= 7 value 0.000000
xixi rank 1 i= 8 value 0.000000
xixi rank 1 i= 9 value 0.000000