8.6.3. Inter-Communication Examples

PreviousUpNext
Up: Inter-Communication Next: Example 1: Three-Group ``Pipeline'' Previous: Inter-Communicator Operations


PreviousUpNext
Up: Inter-Communication Next: Example 1: Three-Group ``Pipeline'' Previous: Inter-Communicator Operations


8.6.3.1. Example 1: Three-Group ``Pipeline''

PreviousUpNext
Up: Inter-Communication Examples Next: Example 2: Three-Group ``Ring'' Previous: Inter-Communication Examples

Image file


Figure 20: Three-group pipeline

As shown in Figure 20, groups 0 and 1 communicate. Groups 1 and 2 communicate. Therefore, group 0 requires one inter-communicator, group 1 requires two inter-communicators, and group 2 requires 1 inter-communicator.


Example

int main(int argc, char *argv[]) 
{ 
  MPI_Comm   myComm;       /* intra-communicator of local sub-group */ 
  MPI_Comm   myFirstComm;  /* inter-communicator */ 
  MPI_Comm   mySecondComm; /* second inter-communicator (group 1 only) */ 
  int membershipKey; 
  int rank; 
 
  MPI_Init(&argc, &argv); 
  MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
 
  /* User code must generate membershipKey in the range [0, 1, 2] */ 
  membershipKey = rank % 3; 
 
  /* Build intra-communicator for local sub-group */ 
  MPI_Comm_split(MPI_COMM_WORLD, membershipKey, rank, &myComm); 
 
  /* Build inter-communicators. Tags are hard-coded. */ 
  if (membershipKey == 0) 
  {                     /* Group 0 communicates with group 1. */ 
    MPI_Intercomm_create(myComm, 0, MPI_COMM_WORLD, 1, 
                         1, &myFirstComm); 
  } 
  else if (membershipKey == 1) 
  {              /* Group 1 communicates with groups 0 and 2. */ 
    MPI_Intercomm_create(myComm, 0, MPI_COMM_WORLD, 0, 
                         1, &myFirstComm); 
    MPI_Intercomm_create(myComm, 0, MPI_COMM_WORLD, 2, 
                         12, &mySecondComm); 
  } 
  else if (membershipKey == 2) 
  {                     /* Group 2 communicates with group 1. */ 
    MPI_Intercomm_create(myComm, 0, MPI_COMM_WORLD, 1, 
                         12, &myFirstComm); 
  } 
 
  /* Do work ... */ 
 
  switch(membershipKey)  /* free communicators appropriately */ 
  { 
  case 1: 
     MPI_Comm_free(&mySecondComm); 
  case 0: 
  case 2: 
     MPI_Comm_free(&myFirstComm); 
     break; 
  } 
 
  MPI_Finalize(); 
  return 0; 
} 


PreviousUpNext
Up: Inter-Communication Examples Next: Example 2: Three-Group ``Ring'' Previous: Inter-Communication Examples


8.6.3.2. Example 2: Three-Group ``Ring''

PreviousUpNext
Up: Inter-Communication Examples Next: Caching Previous: Example 1: Three-Group ``Pipeline''

Image file


Figure 21: Three-group ring

As shown in Figure 21, groups 0 and 1 communicate. Groups 1 and 2 communicate. Groups 0 and 2 communicate. Therefore, each requires two inter-communicators.


Example

int main(int argc, char *argv[]) 
{ 
  MPI_Comm   myComm;      /* intra-communicator of local sub-group */ 
  MPI_Comm   myFirstComm; /* inter-communicators */ 
  MPI_Comm   mySecondComm; 
  int membershipKey; 
  int rank; 
 
  MPI_Init(&argc, &argv); 
  MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
  ... 
 
  /* User code must generate membershipKey in the range [0, 1, 2] */ 
  membershipKey = rank % 3; 
 
  /* Build intra-communicator for local sub-group */ 
  MPI_Comm_split(MPI_COMM_WORLD, membershipKey, rank, &myComm); 
 
  /* Build inter-communicators. Tags are hard-coded. */ 
  if (membershipKey == 0) 
  {             /* Group 0 communicates with groups 1 and 2. */ 
    MPI_Intercomm_create(myComm, 0, MPI_COMM_WORLD, 1, 
                         1, &myFirstComm); 
    MPI_Intercomm_create(myComm, 0, MPI_COMM_WORLD, 2, 
                         2, &mySecondComm); 
  } 
  else if (membershipKey == 1) 
  {         /* Group 1 communicates with groups 0 and 2. */ 
    MPI_Intercomm_create(myComm, 0, MPI_COMM_WORLD, 0, 
                         1, &myFirstComm); 
    MPI_Intercomm_create(myComm, 0, MPI_COMM_WORLD, 2, 
                         12, &mySecondComm); 
  } 
  else if (membershipKey == 2) 
  {        /* Group 2 communicates with groups 0 and 1. */ 
    MPI_Intercomm_create(myComm, 0, MPI_COMM_WORLD, 0, 
                         2, &myFirstComm); 
    MPI_Intercomm_create(myComm, 0, MPI_COMM_WORLD, 1, 
                         12, &mySecondComm); 
  } 
 
  /* Do some work ... */ 
 
  /* Then free communicators before terminating... */ 
  MPI_Comm_free(&myFirstComm); 
  MPI_Comm_free(&mySecondComm); 
  MPI_Comm_free(&myComm); 
  MPI_Finalize(); 
  return 0; 
} 


PreviousUpNext
Up: Inter-Communication Examples Next: Caching Previous: Example 1: Three-Group ``Pipeline''


Return to MPI-5.0 Standard Index
Return to MPI Forum Home Page

(Unofficial) MPI-5.0 of June 9, 2025
HTML Generated on March 2, 2025