Changeset 1520 for XIOS/dev/branch_openmp/extern/src_ep_dev/ep_dup.cpp
- 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_dup.cpp
r1468 r1520 7 7 { 8 8 9 int MPI_Comm_dup (MPI_Comm comm, MPI_Comm *newcomm)9 int MPI_Comm_dup_mpi(MPI_Comm comm, MPI_Comm *newcomm) 10 10 { 11 if(!comm.is_ep) 12 { 13 Debug("Comm_dup MPI\n"); 14 newcomm = new MPI_Comm; 15 newcomm->is_ep = comm.is_ep; 11 newcomm = new MPI_Comm; 12 (*newcomm)->is_ep = false; 16 13 17 ::MPI_Comm input = to_mpi_comm(comm.mpi_comm); 18 ::MPI_Comm *output = new ::MPI_Comm; 14 ::MPI_Comm *output = new ::MPI_Comm; 15 16 ::MPI_Comm_dup(to_mpi_comm(comm->mpi_comm), output); 19 17 20 21 ::MPI_Comm_dup(input, output);18 (*newcomm)->mpi_comm = output; 19 } 22 20 23 newcomm->mpi_comm = output; 24 25 return 0; 26 } 27 28 if(comm.is_intercomm) return MPI_Comm_dup_intercomm(comm, newcomm); 29 30 // for intracomm 31 if(comm.mpi_comm == static_cast< ::MPI_Comm* >(MPI_COMM_NULL.mpi_comm)) return 0; 21 int MPI_Comm_dup_intracomm(MPI_Comm comm, MPI_Comm *newcomm) 22 { 23 int ep_rank_loc = comm->ep_comm_ptr->size_rank_info[1].first; 24 int num_ep = comm->ep_comm_ptr->size_rank_info[1].second; 32 25 33 26 34 int my_rank = comm.ep_comm_ptr->size_rank_info[1].first; 35 int num_ep = comm.ep_comm_ptr->size_rank_info[1].second; 36 37 38 if(0 == my_rank) 27 if(0 == ep_rank_loc) 39 28 { 40 29 MPI_Info info; 41 30 MPI_Comm *out_comm; 42 ::MPI_Comm *mpi_dup = new ::MPI_Comm;43 31 44 ::MPI_Comm in_comm = to_mpi_comm(comm.mpi_comm); 45 46 ::MPI_Comm_dup(in_comm, mpi_dup); 47 48 MPI_Comm_create_endpoints(mpi_dup, num_ep, info, out_comm); 49 comm.ep_comm_ptr->comm_list->mem_bridge = out_comm; 32 MPI_Comm_create_endpoints(comm->mpi_comm, num_ep, info, out_comm); 33 comm->ep_comm_ptr->comm_list[0]->mem_bridge = out_comm; 50 34 } 51 35 52 MPI_Barrier (comm);36 MPI_Barrier_local(comm); 53 37 54 *newcomm = (comm.ep_comm_ptr->comm_list->mem_bridge[my_rank]); 38 *newcomm = (comm->ep_comm_ptr->comm_list[0]->mem_bridge[ep_rank_loc]); 39 40 } 55 41 56 return MPI_SUCCESS; 42 int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm) 43 { 44 45 if(!comm->is_ep) 46 { 47 Debug("MPI_Comm_dup with MPI\n"); 48 return MPI_Comm_dup_mpi(comm, newcomm); 49 } 50 51 if(comm->is_intercomm) return MPI_Comm_dup_intercomm(comm, newcomm); 52 53 54 return MPI_Comm_dup_intracomm(comm, newcomm); 55 56 57 57 } 58 58 … … 60 60 { 61 61 62 if(comm.mpi_comm == static_cast< ::MPI_Comm* >(MPI_COMM_NULL.mpi_comm)) return 0; 63 64 int my_rank = comm.ep_comm_ptr->size_rank_info[1].first; 65 int num_ep = comm.ep_comm_ptr->size_rank_info[1].second; 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; 66 65 67 66 68 if(0 == my_rank)67 if(0 == newcomm_ep_rank_loc) 69 68 { 69 //printf("in dup , newcomm_ep_rank_loc = 0 : ep %d\n", comm->ep_comm_ptr->intercomm->size_rank_info[0].first); 70 70 71 MPI_Info info; 71 72 MPI_Comm *out_comm; 72 ::MPI_Comm *mpi_dup = new ::MPI_Comm;73 73 74 ::MPI_Comm in_comm = to_mpi_comm(comm.mpi_comm);74 MPI_Comm_create_endpoints(comm->mpi_comm, newcomm_num_ep, info, out_comm); 75 75 76 ::MPI_Comm_dup(in_comm, mpi_dup); 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); 77 78 78 MPI_Comm_create_endpoints(mpi_dup, num_ep, info, out_comm); 79 80 ::MPI_Comm *mpi_inter = new ::MPI_Comm; 81 82 ::MPI_Comm_dup(to_mpi_comm(comm.ep_comm_ptr->intercomm->mpi_inter_comm), mpi_inter); 83 84 for(int i=0; i<num_ep; i++) 79 for(int i=0; i<newcomm_num_ep; i++) 85 80 { 86 out_comm[i].ep_comm_ptr->comm_label = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->comm_label; 87 out_comm[i].ep_comm_ptr->intercomm = new ep_intercomm; 88 89 out_comm[i].ep_comm_ptr->intercomm->mpi_inter_comm = mpi_inter; 90 out_comm[i].is_intercomm = true; 91 92 out_comm[i].ep_comm_ptr->intercomm->intercomm_rank_map = new RANK_MAP; 93 out_comm[i].ep_comm_ptr->intercomm->local_rank_map = new RANK_MAP; 94 out_comm[i].ep_comm_ptr->intercomm->remote_rank_map = new RANK_MAP; 95 96 int map_size = 0; 97 map_size = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->intercomm_rank_map->size(); 98 out_comm[i].ep_comm_ptr->intercomm->intercomm_rank_map->resize(map_size); 99 for(int ii=0; ii<map_size; ii++) 100 out_comm[i].ep_comm_ptr->intercomm->intercomm_rank_map->at(ii) = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->intercomm_rank_map->at(ii); 101 102 map_size = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->local_rank_map->size(); 103 out_comm[i].ep_comm_ptr->intercomm->local_rank_map->resize(map_size); 104 for(int ii=0; ii<map_size; ii++) 105 out_comm[i].ep_comm_ptr->intercomm->local_rank_map->at(ii) = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->local_rank_map->at(ii); 106 107 map_size = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->remote_rank_map->size(); 108 out_comm[i].ep_comm_ptr->intercomm->remote_rank_map->resize(map_size); 109 for(int ii=0; ii<map_size; ii++) 110 out_comm[i].ep_comm_ptr->intercomm->remote_rank_map->at(ii) = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->remote_rank_map->at(ii); 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 } 111 89 112 90 113 //out_comm[i].ep_comm_ptr->intercomm->intercomm_rank_map = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->intercomm_rank_map; 114 //out_comm[i].ep_comm_ptr->intercomm->local_rank_map = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->local_rank_map; 115 //out_comm[i].ep_comm_ptr->intercomm->remote_rank_map = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->remote_rank_map; 116 117 out_comm[i].ep_comm_ptr->intercomm->local_comm = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->local_comm; 118 out_comm[i].ep_comm_ptr->intercomm->intercomm_tag = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->intercomm_tag; 119 120 for(int j =0; j<3; j++) 121 { 122 out_comm[i].ep_comm_ptr->intercomm->size_rank_info[j] = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->size_rank_info[j]; 123 } 124 125 } 126 127 comm.ep_comm_ptr->comm_list->mem_bridge = out_comm; 91 comm->ep_comm_ptr->comm_list[0]->mem_bridge = out_comm; 128 92 } 129 93 130 MPI_Barrier (comm);94 MPI_Barrier_local(comm); 131 95 132 *newcomm = comm.ep_comm_ptr->comm_list->mem_bridge[my_rank]; 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 133 132 134 133 135 return MPI_SUCCESS; 134 135 136 136 137 } 137 138
Note: See TracChangeset
for help on using the changeset viewer.