Inter-Communication Examples (original) (raw)


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


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

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

Image file

Figure 16: 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.

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


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

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

Image file

Figure 17: Three-group ring

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

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-3.1 Standard Index
Return to MPI Forum Home Page


(Unofficial) MPI-3.1 of June 4, 2015
HTML Generated on June 4, 2015