Inter-Communication Examples (original) (raw)
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
162.1. Example 1: Three-Group ``Pipeline''
Up: Inter-Communication Examples Next: Example 2: Three-Group ``Ring'' Previous: Inter-Communication Examples
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;
}
Up: Inter-Communication Examples Next: Example 2: Three-Group ``Ring'' Previous: Inter-Communication Examples
162.2. Example 2: Three-Group ``Ring''
Up: Inter-Communication Examples Next: Caching Previous: Example 1: Three-Group ``Pipeline''
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;
}
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