144. Inter-Communication Examples


Up: Inter-Communication Next: Example 1: Three-Group ``Pipeline" Previous: Inter-communicator Operations



Up: Inter-Communication Next: Example 1: Three-Group ``Pipeline" Previous: Inter-communicator Operations


144.1. Example 1: Three-Group ``Pipeline"


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


Figure 15: Three-group pipeline.

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.

2.2

   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(); 
   } 



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


144.2. Example 2: Three-Group ``Ring"


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


Figure 16: Three-group ring.

Groups 0 and 1 communicate. Groups 1 and 2 communicate. Groups 0 and 2 communicate. Therefore, each requires two inter-communicators.

2.2

   int main(int argc, char **argv) 
   { 
     MPI_Comm   myComm;      /* intra-communicator of local sub-group */ 
     MPI_Comm   myFirstComm; /* inter-communicators */ 
     MPI_Comm   mySecondComm; 
     MPI_Status status; 
     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(); 
   } 
2.2



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


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

(Unofficial) MPI-2.2 of September 4, 2009
HTML Generated on September 10, 2009