The current MPI interface provides only two intercommunicator construction routines:
In the following discussions, the two groups in an intercommunicator are called the left and right groups. A process in an intercommunicator is a member of either the left or the right group. From the point of view of that process, the group that the process is a member of is called the local group; the other group (relative to that process) is the remote group. The left and right group labels give us a way to describe the two groups in an intercommunicator that is not relative to any particular process (as the local and remote groups are).
In addition, the specification of collective operations (Section 4.1 of MPI-1) requires that all collective routines are called with matching arguments. For the intercommunicator extensions, this is weakened to matching for all members of the same local group.
| MPI_COMM_CREATE(comm_in, group, comm_out) | |
| IN comm_in | original communicator (handle) | 
| IN group | group of processes to be in new communicator (handle) | 
| OUT comm_out | new communicator (handle) | 
 
  MPI::Intercomm MPI::Intercomm::Create(const Group& group) const 
  
  
  MPI::Intracomm MPI::Intracomm::Create(const Group& group) const 
  
  
The C and Fortran language bindings are identical to those in MPI-1, so are omitted here.
If comm_in is an intercommunicator, then the output communicator is also an intercommunicator where the local group consists only of those processes contained in group (see Figure 9 ). The group argument should only contain those processes in the local group of the input intercommunicator that are to be a part of comm_out. If either group does not specify at least one process in the local group of the intercommunicator, or if the calling process is not included in the group, MPI_COMM_NULL is returned.
 
 
 
 Rationale.  
 
In the case where either the left or right group is empty, a null communicator  
is returned instead of an intercommunicator with  MPI_GROUP_EMPTY  
because the side with the empty group must return  MPI_COMM_NULL.  
 ( End of rationale.) 
 
  
  

 
[ ]Intercommunicator create using  MPI_COMM_CREATE  
extended to intercommunicators.  The input groups are those in the grey  
circle.  
    
 Example  
The following example illustrates how the first node in the left  
side of an intercommunicator could be joined with all members on the  
right side of an intercommunicator to form a new  
intercommunicator.  
  
 
        MPI_Comm  inter_comm, new_inter_comm; 
        MPI_Group local_group, group; 
        int       rank = 0; /* rank on left side to include in  
                               new inter-comm */ 
 
        /* Construct the original intercommunicator: "inter_comm" */ 
        ... 
 
        /* Construct the group of processes to be in new  
           intercommunicator */ 
        if (/* I'm on the left side of the intercommunicator */) { 
          MPI_Comm_group ( inter_comm, &local_group ); 
          MPI_Group_incl ( local_group, 1, &rank, &group ); 
          MPI_Group_free ( &local_group ); 
        } 
        else  
          MPI_Comm_group ( inter_comm, &group ); 
 
        MPI_Comm_create ( inter_comm, group, &new_inter_comm ); 
        MPI_Group_free( &group ); 
 
  
| MPI_COMM_SPLIT(comm_in, color, key, comm_out) | |
| IN comm_in | original communicator (handle) | 
| IN color | control of subset assignment (integer) | 
| IN key | control of rank assignment (integer) | 
| OUT comm_out | new communicator (handle) | 
 
  MPI::Intercomm MPI::Intercomm::Split(int color, int key) const 
  
  
  MPI::Intracomm MPI::Intracomm::Split(int color, int key) const 
  
  
The C and Fortran language bindings are identical to those in MPI-1, so are omitted here.
The result of MPI_COMM_SPLIT on an intercommunicator is that those processes on the left with the same color as those processes on the right combine to create a new intercommunicator. The key argument describes the relative rank of processes on each side of the intercommunicator (see Figure 10 ). For those colors that are specified only on one side of the intercommunicator, MPI_COMM_NULL is returned. MPI_COMM_NULL is also returned to those processes that specify MPI_UNDEFINED as the color.

 
[ ]Intercommunicator construction achieved by splitting an  
    existing intercommunicator with  MPI_COMM_SPLIT  
extended to intercommunicators.  
    
 Example(Parallel client-server model).  
The following client code illustrates how clients on the left side of an  
intercommunicator could be assigned to a single server from a pool of  
servers on the right side of an intercommunicator.  
  
 
        /* Client code */ 
        MPI_Comm  multiple_server_comm; 
        MPI_Comm  single_server_comm; 
        int       color, rank, num_servers; 
         
        /* Create intercommunicator with clients and servers:  
           multiple_server_comm */ 
        ... 
         
        /* Find out the number of servers available */ 
        MPI_Comm_remote_size ( multiple_server_comm, &num_servers ); 
         
        /* Determine my color */ 
        MPI_Comm_rank ( multiple_server_comm, &rank ); 
        color = rank % num_servers; 
         
        /* Split the intercommunicator */ 
        MPI_Comm_split ( multiple_server_comm, color, rank,  
                         &single_server_comm ); 
 
 The following is the corresponding server code:  
        /* Server code */ 
        MPI_Comm  multiple_client_comm; 
        MPI_Comm  single_server_comm; 
        int       rank; 
 
        /* Create intercommunicator with clients and servers:  
           multiple_client_comm */ 
        ... 
         
        /* Split the intercommunicator for a single server per group 
           of clients */ 
        MPI_Comm_rank ( multiple_client_comm, &rank ); 
        MPI_Comm_split ( multiple_client_comm, rank, 0,  
                         &single_server_comm );