1
0
mirror of https://github.com/paboyle/Grid.git synced 2024-09-20 09:15:38 +01:00

Fixing the MPI memory leak in the communicators

This commit is contained in:
Guido Cossu 2017-11-07 13:55:37 +00:00
parent 360efd0088
commit c519aab19d
4 changed files with 14 additions and 3 deletions

View File

@ -57,7 +57,7 @@ CartesianCommunicator::~CartesianCommunicator()
{ {
int MPI_is_finalised; int MPI_is_finalised;
MPI_Finalized(&MPI_is_finalised); MPI_Finalized(&MPI_is_finalised);
if (communicator && MPI_is_finalised) if (communicator && !MPI_is_finalised)
MPI_Comm_free(&communicator); MPI_Comm_free(&communicator);
} }

View File

@ -596,6 +596,14 @@ CartesianCommunicator::CartesianCommunicator(const std::vector<int> &processors)
} }
} }
}; };
CartesianCommunicator::~CartesianCommunicator()
{
int MPI_is_finalised;
MPI_Finalized(&MPI_is_finalised);
if (communicator && !MPI_is_finalised)
MPI_Comm_free(&communicator);
}
void CartesianCommunicator::GlobalSum(uint32_t &u){ void CartesianCommunicator::GlobalSum(uint32_t &u){
int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator); int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator);
assert(ierr==0); assert(ierr==0);

View File

@ -55,11 +55,12 @@ void CartesianCommunicator::Init(int *argc, char ***argv) {
CartesianCommunicator::~CartesianCommunicator() CartesianCommunicator::~CartesianCommunicator()
{ {
if (communicator && !MPI::Is_finalized()) int MPI_is_finalised;
MPI_Finalized(&MPI_is_finalised);
if (communicator && !MPI_is_finalised)
MPI_Comm_free(&communicator); MPI_Comm_free(&communicator);
} }
void CartesianCommunicator::GlobalSum(uint32_t &u){ void CartesianCommunicator::GlobalSum(uint32_t &u){
int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator); int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator);
assert(ierr==0); assert(ierr==0);

View File

@ -75,6 +75,8 @@ void CartesianCommunicator::Init(int *argc, char ***argv) {
ShmInitGeneric(); ShmInitGeneric();
} }
CartesianCommunicator::~CartesianCommunicator(){}
CartesianCommunicator::CartesianCommunicator(const std::vector<int> &processors,const CartesianCommunicator &parent) CartesianCommunicator::CartesianCommunicator(const std::vector<int> &processors,const CartesianCommunicator &parent)
: CartesianCommunicator(processors) : CartesianCommunicator(processors)
{ {