1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
/**********************************************************************
Make_Comm_Worlds.c:
Make_Comm_Worlds.c is a subroutine to make new COMM worlds.
Log of Make_Comm_Worlds.c:
16/Dec/2006 Released by T.Ozaki
***********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef nompi
#include "mimic_mpi.h"
#else
#include "mpi.h"
#endif
void Make_Comm_Worlds(
MPI_Comm MPI_Curret_Comm_WD,
int myid0,
int numprocs0,
int Num_Comm_World,
int *myworld1,
MPI_Comm *MPI_CommWD, /* size: Num_Comm_World */
int *NPROCS1_ID, /* size: numprocs0 */
int *Comm_World1, /* size: numprocs0 */
int *NPROCS1_WD, /* size: Num_Comm_World */
int *Comm_World_StartID /* size: Num_Comm_World */
)
{
int i,j;
int ID0;
int numprocs1,myid1;
int num;
double avnum;
int *new_ranks;
MPI_Group new_group,old_group;
/******************************************
Set up informations to construct the
(numprocs0/Num_Comm_World)-th worlds
******************************************/
if (Num_Comm_World<=numprocs0){
avnum = (double)numprocs0/(double)Num_Comm_World;
for (i=0; i<Num_Comm_World; i++){
if ( (int)((double)(i)*avnum+1.0e-12)<=myid0
&& myid0<(int)((double)(i+1)*avnum+1.0e-12)){
numprocs1 = (int)((double)(i+1)*avnum+1.0e-12) - (int)((double)(i)*avnum+1.0e-12);
*myworld1 = i;
}
}
for (i=0; i<Num_Comm_World; i++){
num = 0;
for (ID0=0; ID0<numprocs0; ID0++){
if ( (int)((double)(i)*avnum+1.0e-12)<=ID0
&& ID0<(int)((double)(i+1)*avnum+1.0e-12)){
NPROCS1_ID[ID0] = (int)((double)(i+1)*avnum+1.0e-12) - (int)((double)(i)*avnum+1.0e-12);
Comm_World1[ID0] = i;
if (num==0) Comm_World_StartID[i] = ID0;
num++;
}
}
NPROCS1_WD[i] = num;
}
/**************************
make a set of MPI_CommWD
**************************/
for (i=0; i<Num_Comm_World; i++){
new_ranks = (int*)malloc(sizeof(int)*NPROCS1_WD[i]);
for (j=0; j<NPROCS1_WD[i]; j++) {
new_ranks[j] = Comm_World_StartID[i] + j;
}
MPI_Comm_group(MPI_Curret_Comm_WD, &old_group);
/* define a new group */
MPI_Group_incl(old_group,NPROCS1_WD[i],new_ranks,&new_group);
MPI_Comm_create(MPI_Curret_Comm_WD,new_group,&MPI_CommWD[i]);
MPI_Group_free(&new_group);
free(new_ranks); /* never forget cleaning! */
}
}
else {
numprocs1 = numprocs0;
*myworld1 = 0;
for (ID0=0; ID0<numprocs0; ID0++){
NPROCS1_ID[ID0] = numprocs0;
Comm_World1[ID0] = 0;
}
for (i=0; i<Num_Comm_World; i++){
Comm_World_StartID[i] = 0;
NPROCS1_WD[i] = numprocs0;
}
for (i=0; i<Num_Comm_World; i++){
MPI_CommWD[i] = MPI_Curret_Comm_WD;
}
}
}
|