Changeset 1539 for XIOS/dev/branch_openmp/extern/src_ep_dev/ep_dup.cpp
- Timestamp:
- 06/12/18 11:54:13 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/branch_openmp/extern/src_ep_dev/ep_dup.cpp
r1520 r1539 7 7 { 8 8 9 int MPI_Comm_dup_mpi(MPI_Comm comm, MPI_Comm *newcomm) 9 10 int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm) 10 11 { 11 newcomm = new MPI_Comm; 12 (*newcomm)->is_ep = false; 12 13 if(!comm->is_ep) 14 { 15 Debug("MPI_Comm_dup with MPI\n"); 16 return MPI_Comm_dup_mpi(comm, newcomm); 17 } 13 18 14 ::MPI_Comm *output = new ::MPI_Comm; 15 16 ::MPI_Comm_dup(to_mpi_comm(comm->mpi_comm), output); 17 18 (*newcomm)->mpi_comm = output; 19 return MPI_Comm_dup_endpoint(comm, newcomm); 20 19 21 } 20 22 21 int MPI_Comm_dup_intracomm(MPI_Comm comm, MPI_Comm *newcomm) 23 24 25 int MPI_Comm_dup_endpoint(MPI_Comm comm, MPI_Comm *newcomm) 22 26 { 23 27 int ep_rank_loc = comm->ep_comm_ptr->size_rank_info[1].first; … … 37 41 38 42 *newcomm = (comm->ep_comm_ptr->comm_list[0]->mem_bridge[ep_rank_loc]); 43 44 if(comm->is_intercomm) 45 { 46 (*newcomm)->is_intercomm = true; 47 (*newcomm)->ep_comm_ptr->size_rank_info[0] = comm->ep_comm_ptr->size_rank_info[0]; 48 (*newcomm)->inter_rank_map = new INTER_RANK_MAP; 49 50 for(INTER_RANK_MAP::iterator it = comm->inter_rank_map->begin(); it !=comm->inter_rank_map->end(); it++) 51 { 52 (*newcomm)->inter_rank_map->insert(std::make_pair(it->first, it->second)); 53 } 54 55 } 39 56 40 57 } 41 58 42 int MPI_Comm_dup (MPI_Comm comm, MPI_Comm *newcomm)59 int MPI_Comm_dup_mpi(MPI_Comm comm, MPI_Comm *newcomm) 43 60 { 44 45 if(!comm->is_ep) 46 { 47 Debug("MPI_Comm_dup with MPI\n"); 48 return MPI_Comm_dup_mpi(comm, newcomm); 49 } 61 newcomm = new MPI_Comm; 62 (*newcomm)->is_ep = false; 50 63 51 if(comm->is_intercomm) return MPI_Comm_dup_intercomm(comm, newcomm); 64 ::MPI_Comm *output = new ::MPI_Comm; 65 66 ::MPI_Comm_dup(to_mpi_comm(comm->mpi_comm), output); 52 67 53 54 return MPI_Comm_dup_intracomm(comm, newcomm); 55 56 57 } 58 59 int MPI_Comm_dup_intercomm(MPI_Comm comm, MPI_Comm *newcomm) 60 { 61 62 int newcomm_ep_rank =comm->ep_comm_ptr->intercomm->size_rank_info[0].first; 63 int newcomm_ep_rank_loc = comm->ep_comm_ptr->intercomm->size_rank_info[1].first; 64 int newcomm_num_ep = comm->ep_comm_ptr->intercomm->size_rank_info[1].second; 65 66 67 if(0 == newcomm_ep_rank_loc) 68 { 69 //printf("in dup , newcomm_ep_rank_loc = 0 : ep %d\n", comm->ep_comm_ptr->intercomm->size_rank_info[0].first); 70 71 MPI_Info info; 72 MPI_Comm *out_comm; 73 74 MPI_Comm_create_endpoints(comm->mpi_comm, newcomm_num_ep, info, out_comm); 75 76 ::MPI_Comm *mpi_inter_comm = new ::MPI_Comm; 77 ::MPI_Comm_dup(to_mpi_comm(comm->ep_comm_ptr->intercomm->mpi_inter_comm), mpi_inter_comm); 78 79 for(int i=0; i<newcomm_num_ep; i++) 80 { 81 out_comm[i]->is_intercomm = true; 82 out_comm[i]->ep_comm_ptr->comm_label = comm->ep_comm_ptr->comm_list[i]->ep_comm_ptr->comm_label; 83 out_comm[i]->ep_comm_ptr->intercomm = new ep_lib::ep_intercomm; 84 #ifdef _showinfo 85 printf("new out_comm[%d]->ep_comm_ptr->intercomm = %p\n", i, out_comm[i]->ep_comm_ptr->intercomm); 86 #endif 87 out_comm[i]->ep_comm_ptr->intercomm->mpi_inter_comm = mpi_inter_comm; 88 } 89 90 91 comm->ep_comm_ptr->comm_list[0]->mem_bridge = out_comm; 92 } 93 94 MPI_Barrier_local(comm); 95 96 *newcomm = (comm->ep_comm_ptr->comm_list[0]->mem_bridge[newcomm_ep_rank_loc]); 97 98 (*newcomm)->ep_comm_ptr->size_rank_info[0] = comm->ep_comm_ptr->size_rank_info[0]; 99 (*newcomm)->ep_comm_ptr->size_rank_info[1] = comm->ep_comm_ptr->size_rank_info[1]; 100 (*newcomm)->ep_comm_ptr->size_rank_info[2] = comm->ep_comm_ptr->size_rank_info[2]; 101 102 (*newcomm)->ep_comm_ptr->intercomm->size_rank_info[0] = comm->ep_comm_ptr->intercomm->size_rank_info[0]; 103 (*newcomm)->ep_comm_ptr->intercomm->size_rank_info[1] = comm->ep_comm_ptr->intercomm->size_rank_info[1]; 104 (*newcomm)->ep_comm_ptr->intercomm->size_rank_info[2] = comm->ep_comm_ptr->intercomm->size_rank_info[2]; 105 106 (*newcomm)->ep_comm_ptr->intercomm->intercomm_tag = comm->ep_comm_ptr->intercomm->intercomm_tag; 107 108 109 int ep_rank_loc = (*newcomm)->ep_comm_ptr->size_rank_info[1].first; 110 111 if(ep_rank_loc == 0) 112 { 113 int world_rank; 114 MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 115 116 (*newcomm)->ep_comm_ptr->intercomm->intercomm_rank_map = new INTERCOMM_RANK_MAP; 117 (*newcomm)->ep_comm_ptr->intercomm->local_rank_map = new EP_RANK_MAP; 118 119 *(*newcomm)->ep_comm_ptr->intercomm->intercomm_rank_map = *comm->ep_comm_ptr->intercomm->intercomm_rank_map; 120 *(*newcomm)->ep_comm_ptr->intercomm->local_rank_map = *comm->ep_comm_ptr->intercomm->local_rank_map; 121 } 122 123 MPI_Barrier_local(comm); 124 125 if(ep_rank_loc !=0 ) 126 { 127 int target = (*newcomm)->ep_comm_ptr->intercomm->intercomm_tag; 128 (*newcomm)->ep_comm_ptr->intercomm->intercomm_rank_map = (*newcomm)->ep_comm_ptr->comm_list[target]->ep_comm_ptr->intercomm->intercomm_rank_map; 129 (*newcomm)->ep_comm_ptr->intercomm->local_rank_map = (*newcomm)->ep_comm_ptr->comm_list[target]->ep_comm_ptr->intercomm->local_rank_map; 130 } 131 132 133 134 135 136 68 (*newcomm)->mpi_comm = output; 137 69 } 138 70
Note: See TracChangeset
for help on using the changeset viewer.