diff --git a/projects/rocshmem/src/backend_bc.cpp b/projects/rocshmem/src/backend_bc.cpp index 9a4e37b2c4..d46ee2c1c4 100644 --- a/projects/rocshmem/src/backend_bc.cpp +++ b/projects/rocshmem/src/backend_bc.cpp @@ -129,7 +129,11 @@ void Backend::destroy_remaining_ctxs() { } } -Backend::~Backend() { CHECK_HIP(hipFree(print_lock)); } +Backend::~Backend() { + CHECK_HIP(hipFree(print_lock)); + if (backend_comm != MPI_COMM_NULL) + NET_CHECK(MPI_Comm_free(&backend_comm)); +} void Backend::dump_stats() { printf("PE %d\n", my_pe); diff --git a/projects/rocshmem/src/backend_bc.hpp b/projects/rocshmem/src/backend_bc.hpp index e52cd1cbda..9ddf1175eb 100644 --- a/projects/rocshmem/src/backend_bc.hpp +++ b/projects/rocshmem/src/backend_bc.hpp @@ -223,7 +223,7 @@ class Backend { * @todo document where this is used and try to coalesce this into another * class */ - MPI_Comm backend_comm{}; + MPI_Comm backend_comm{MPI_COMM_NULL}; /** * @brief Object contains the interface and internal data structures diff --git a/projects/rocshmem/src/reverse_offload/mpi_transport.cpp b/projects/rocshmem/src/reverse_offload/mpi_transport.cpp index 87a9b58b1d..761721dd19 100644 --- a/projects/rocshmem/src/reverse_offload/mpi_transport.cpp +++ b/projects/rocshmem/src/reverse_offload/mpi_transport.cpp @@ -63,7 +63,10 @@ MPITransport::MPITransport(MPI_Comm comm, Queue* q) NET_CHECK(MPI_Comm_rank(ro_net_comm_world, &my_pe)); } -MPITransport::~MPITransport() {} +MPITransport::~MPITransport() { + if (ro_net_comm_world != MPI_COMM_NULL) + NET_CHECK(MPI_Comm_free(&ro_net_comm_world)); +} void MPITransport::threadProgressEngine() { auto *bp{backend_proxy->get()}; diff --git a/projects/rocshmem/src/reverse_offload/mpi_transport.hpp b/projects/rocshmem/src/reverse_offload/mpi_transport.hpp index cc1b2c3c0e..c9bca9755e 100644 --- a/projects/rocshmem/src/reverse_offload/mpi_transport.hpp +++ b/projects/rocshmem/src/reverse_offload/mpi_transport.hpp @@ -169,7 +169,7 @@ private: std::vector outstanding{}; - MPI_Comm ro_net_comm_world{}; + MPI_Comm ro_net_comm_world{MPI_COMM_NULL}; std::map comm_map{}; diff --git a/projects/rocshmem/src/rocshmem.cpp b/projects/rocshmem/src/rocshmem.cpp index dd49b349eb..8fb5c08ea5 100644 --- a/projects/rocshmem/src/rocshmem.cpp +++ b/projects/rocshmem/src/rocshmem.cpp @@ -422,7 +422,7 @@ __host__ int rocshmem_team_split_strided( * not */ backend->team_tracker.track(*new_team); } - + MPI_Comm_free (&team_comm); return 0; } diff --git a/projects/rocshmem/src/team.cpp b/projects/rocshmem/src/team.cpp index 0036b95366..d3e5bc74d5 100644 --- a/projects/rocshmem/src/team.cpp +++ b/projects/rocshmem/src/team.cpp @@ -78,8 +78,9 @@ __host__ Team::Team(Backend* handle, TeamInfo* team_info_wrt_parent, tinfo_wrt_parent(team_info_wrt_parent), tinfo_wrt_world(team_info_wrt_world), num_pes(_num_pes), - my_pe(_my_pe), - mpi_comm(_mpi_comm) {} + my_pe(_my_pe) { + MPI_Comm_dup (_mpi_comm, &mpi_comm); +} __host__ __device__ int Team::get_pe_in_world(int pe) { int pe_start{tinfo_wrt_world->pe_start}; @@ -108,6 +109,9 @@ __host__ __device__ int Team::get_pe_in_my_team(int pe_in_world) { return pe_in_my_team; } -__host__ Team::~Team() {} +__host__ Team::~Team() { + if (mpi_comm != MPI_COMM_NULL) + MPI_Comm_free (&mpi_comm); +} } // namespace rocshmem