I have this code :
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
MPI_Status status;
MPI_Group orig_group, group;
MPI_Comm new_comm,comm_master;
int main(argc,argv)
int argc;
char *argv[];
{
int
colore,chiave,myrank,num_procc,ult_grup,mysize,color,key,new_rank,new_rank2,new_size,*ranks;
int x[3];
int bay,distpun,alber;
int i=0,gruppo,j;
x[0]=0;
x[1]=0;
x[2]=0;
colore=4;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD, &mysize);
num_procc=mysize/colore;
MPI_Comm_group(MPI_COMM_WORLD, &orig_group);
ranks=(int *)malloc((int)colore*sizeof(int));
for(i=0;i<colore;i++)
ranks[i]=i*num_procc;
MPI_Group_incl(orig_group,colore,ranks,&group);
MPI_Group_rank(group,&new_rank2);
MPI_Comm_create(MPI_COMM_WORLD,group,&comm_master);
if(new_rank2==0)
{
for(i=0;i<3;i++)
x[i]=9999;
}
if(new_rank2!=-32766)
{
MPI_Bcast(&x,3,MPI_INT,0,comm_master);
for(i=0;i<3;i++)
{
printf(" x[%d]= %d ",i,x[i]);
printf("**********rank= %d newrank2= %d *********** \n",myrank,new_rank2);
}
}
MPI_Barrier(MPI_COMM_WORLD);
for(i=0;i<colore;i++)
{
if( (( myrank >= (i*num_procc)) || (myrank >(i*num_procc)) ) &&
(myrank<((i+1)*num_procc)) )
{
color=i+1;
key=myrank-(i*num_procc);
}
if((myrank)>=(colore-1)*num_procc)
{
color=colore;
key=myrank-((colore-1)*num_procc);
}
}
MPI_Comm_split(MPI_COMM_WORLD,color,key,&new_comm);
MPI_Comm_rank(new_comm,&new_rank);
MPI_Comm_size(new_comm,&new_size);
if(new_rank==0)
{
for(i=0;i<3;i++)
x[i]=color+100;
}
MPI_Bcast(&x,3,MPI_INT,0,new_comm);
for(i=0;i<3;i++)
printf(" x[%d]= %d ",i,x[i]);
printf("rank= %d newrank= %d new_size=%d color=%d
\n",myrank,new_rank,new_size,color);
MPI_Finalize();
return 0;
}
When num_procc assuming value=3 then I have error( with mpirun -np 12
name_file.c, or if colore=3 and I execute mpirun -np 9 file_name.c)
|