#include "ep_lib.hpp" #include #include "ep_declaration.hpp" #include "ep_mpi.hpp" namespace ep_lib { int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm) { if(!comm->is_ep) { Debug("MPI_Comm_dup with MPI\n"); return MPI_Comm_dup_mpi(comm, newcomm); } return MPI_Comm_dup_endpoint(comm, newcomm); } int MPI_Comm_dup_endpoint(MPI_Comm comm, MPI_Comm *newcomm) { int ep_rank_loc = comm->ep_comm_ptr->size_rank_info[1].first; int num_ep = comm->ep_comm_ptr->size_rank_info[1].second; if(0 == ep_rank_loc) { MPI_Info info; MPI_Comm *out_comm; MPI_Comm_create_endpoints(comm->mpi_comm, num_ep, info, out_comm); comm->ep_comm_ptr->comm_list[0]->mem_bridge = out_comm; } MPI_Barrier_local(comm); *newcomm = (comm->ep_comm_ptr->comm_list[0]->mem_bridge[ep_rank_loc]); if(comm->is_intercomm) { (*newcomm)->is_intercomm = true; (*newcomm)->ep_comm_ptr->size_rank_info[0] = comm->ep_comm_ptr->size_rank_info[0]; (*newcomm)->inter_rank_map = new INTER_RANK_MAP; for(INTER_RANK_MAP::iterator it = comm->inter_rank_map->begin(); it !=comm->inter_rank_map->end(); it++) { (*newcomm)->inter_rank_map->insert(std::make_pair(it->first, it->second)); } } } int MPI_Comm_dup_mpi(MPI_Comm comm, MPI_Comm *newcomm) { newcomm = new MPI_Comm; (*newcomm)->is_ep = false; ::MPI_Comm *output = new ::MPI_Comm; ::MPI_Comm_dup(to_mpi_comm(comm->mpi_comm), output); (*newcomm)->mpi_comm = output; } }