- Timestamp:
- 06/04/18 19:25:08 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/branch_openmp/extern/src_ep_dev/ep_intercomm.cpp
r1354 r1520 10 10 int MPI_Intercomm_create(MPI_Comm local_comm, int local_leader, MPI_Comm peer_comm, int remote_leader, int tag, MPI_Comm *newintercomm) 11 11 { 12 assert(local_comm .is_ep);12 assert(local_comm->is_ep); 13 13 14 14 int ep_rank, ep_rank_loc, mpi_rank; 15 15 int ep_size, num_ep, mpi_size; 16 16 17 ep_rank = local_comm .ep_comm_ptr->size_rank_info[0].first;18 ep_rank_loc = local_comm .ep_comm_ptr->size_rank_info[1].first;19 mpi_rank = local_comm .ep_comm_ptr->size_rank_info[2].first;20 ep_size = local_comm .ep_comm_ptr->size_rank_info[0].second;21 num_ep = local_comm .ep_comm_ptr->size_rank_info[1].second;22 mpi_size = local_comm .ep_comm_ptr->size_rank_info[2].second;17 ep_rank = local_comm->ep_comm_ptr->size_rank_info[0].first; 18 ep_rank_loc = local_comm->ep_comm_ptr->size_rank_info[1].first; 19 mpi_rank = local_comm->ep_comm_ptr->size_rank_info[2].first; 20 ep_size = local_comm->ep_comm_ptr->size_rank_info[0].second; 21 num_ep = local_comm->ep_comm_ptr->size_rank_info[1].second; 22 mpi_size = local_comm->ep_comm_ptr->size_rank_info[2].second; 23 23 24 24 25 25 MPI_Barrier(local_comm); 26 27 int leader_ranks_in_peer[3]; // local_leader_rank_in_peer 28 // remote_leader_rank_in_peer 29 // size of peer 30 31 if(ep_rank == local_leader) 32 { 33 MPI_Comm_rank(peer_comm, &leader_ranks_in_peer[0]); 34 leader_ranks_in_peer[1] = remote_leader; 35 MPI_Comm_size(peer_comm, &leader_ranks_in_peer[2]); 36 } 37 38 MPI_Bcast(leader_ranks_in_peer, 3, MPI_INT, local_leader, local_comm); 39 40 if(leader_ranks_in_peer[0] != leader_ranks_in_peer[2]) 41 { 42 Debug("calling MPI_Intercomm_create_kernel\n"); 43 return MPI_Intercomm_create_kernel(local_comm, local_leader, peer_comm, remote_leader, tag, newintercomm); 44 } 45 46 else 47 { 48 if(leader_ranks_in_peer[2] == 1) 49 { 50 Debug("calling MPI_Intercomm_create_unique\n"); 51 return MPI_Intercomm_create_unique_leader(local_comm, local_leader, peer_comm, remote_leader, tag, newintercomm); 52 53 } 54 else 55 { 56 Debug("calling MPI_Intercomm_create_world\n"); 57 return MPI_Intercomm_create_from_world(local_comm, local_leader, peer_comm, remote_leader, tag, newintercomm); 58 } 59 60 } 61 62 26 63 27 64 … … 61 98 if( leader_ranks[1] * leader_ranks[4] == 1) 62 99 { 63 if(ep_rank == local_leader) Debug("calling MPI_Intercomm_create_unique_leader\n");64 local_comm .ep_comm_ptr->comm_label = -99;100 if(ep_rank == local_leader) printf("calling MPI_Intercomm_create_unique_leader\n"); 101 local_comm->ep_comm_ptr->comm_label = -99; 65 102 66 103 return MPI_Intercomm_create_unique_leader(local_comm, local_leader, peer_comm, remote_leader, tag, newintercomm); … … 77 114 // change leader 78 115 is_decider = true; 79 int target = local_comm .rank_map->at(local_leader).second;116 int target = local_comm->ep_rank_map->at(local_leader).second; 80 117 { 81 118 for(int i=0; i<ep_size; i++) 82 119 { 83 if(local_comm .rank_map->at(i).second != target && local_comm.rank_map->at(i).first == 0)120 if(local_comm->ep_rank_map->at(i).second != target && local_comm->ep_rank_map->at(i).first == 0) 84 121 { 85 122 new_local_leader = i; … … 100 137 // change leader 101 138 is_decider = true; 102 int target = local_comm .rank_map->at(local_leader).second;139 int target = local_comm->ep_rank_map->at(local_leader).second; 103 140 { 104 141 for(int i=0; i<ep_size; i++) 105 142 { 106 if(local_comm .rank_map->at(i).second != target && local_comm.rank_map->at(i).first == 0)143 if(local_comm->ep_rank_map->at(i).second != target && local_comm->ep_rank_map->at(i).first == 0) 107 144 { 108 145 new_local_leader = i; … … 146 183 if(ep_rank == new_local_leader) 147 184 { 148 ::MPI_Comm_rank(to_mpi_comm(MPI_COMM_WORLD .mpi_comm), &leader_in_world[0]);185 ::MPI_Comm_rank(to_mpi_comm(MPI_COMM_WORLD->mpi_comm), &leader_in_world[0]); 149 186 } 150 187 … … 165 202 MPI_Bcast(&leader_in_world[1], 1, MPI_INT, local_leader, local_comm); 166 203 167 local_comm .ep_comm_ptr->comm_label = tag;168 169 if(ep_rank == local_leader) Debug("calling MPI_Intercomm_create_from_world\n");170 171 return MPI_Intercomm_create_from_world(local_comm, new_local_leader, MPI_COMM_WORLD .mpi_comm, leader_in_world[1], new_tag_in_world, newintercomm);204 local_comm->ep_comm_ptr->comm_label = tag; 205 206 if(ep_rank == local_leader) printf("calling MPI_Intercomm_create_from_world\n"); 207 208 return MPI_Intercomm_create_from_world(local_comm, new_local_leader, MPI_COMM_WORLD->mpi_comm, leader_in_world[1], new_tag_in_world, newintercomm); 172 209 173 210 } 174 211 } 175 212 176 if(ep_rank == local_leader) Debug("calling MPI_Intercomm_create_kernel\n"); 177 178 return MPI_Intercomm_create_kernel(local_comm, local_leader, peer_comm, remote_leader, tag, newintercomm); 213 179 214 180 215 } … … 183 218 { 184 219 *flag = false; 185 if(comm .is_ep)186 { 187 *flag = comm .is_intercomm;220 if(comm->is_ep) 221 { 222 *flag = comm->is_intercomm; 188 223 return 0; 189 224 } 190 else if(comm .mpi_comm != static_cast< ::MPI_Comm*>(MPI_COMM_NULL.mpi_comm))191 { 192 ::MPI_Comm mpi_comm = to_mpi_comm(comm .mpi_comm);225 else if(comm->mpi_comm != static_cast< ::MPI_Comm*>(MPI_COMM_NULL->mpi_comm)) 226 { 227 ::MPI_Comm mpi_comm = to_mpi_comm(comm->mpi_comm); 193 228 194 229 ::MPI_Comm_test_inter(mpi_comm, flag);
Note: See TracChangeset
for help on using the changeset viewer.