Commit e3c2ea07 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Fixed bugs in calls to MPI Init/Finalize

- There is an RAII wrapper called ScopedInitializer to handle
  finalization due to C++ exceptions and to avoid calls to Finalize in
  all exit branches.
- Fixed signature of MpiCommunicator::Init to match that of MPI_Init.
parent 63cf6c81
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
SET( headers MpiCommunicator.h
             MpiDefs.h             
             NoDistrCommunicator.h 
             ScopedInitializer.h
    )

INSTALL( FILES ${headers} DESTINATION ${TNL_TARGET_INCLUDE_DIRECTORY}/Communicators )
+1 −1
Original line number Diff line number Diff line
@@ -149,7 +149,7 @@ class MpiCommunicator
         return true;
      }

      static void Init(int argc, char **argv )
      static void Init(int& argc, char**& argv )
      {
#ifdef HAVE_MPI
         MPI_Init( &argc, &argv );
+1 −1
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ class NoDistrCommunicator
         return true;
      }
      
      static void Init(int argc, char **argv, bool redirect=false) {}
      static void Init(int& argc, char**& argv) {}
      
      static void setRedirection( bool redirect_ ) {}
      
+33 −0
Original line number Diff line number Diff line
/***************************************************************************
                          ScopedInitializer.h  -  description
                             -------------------
    begin                : Sep 16, 2018
    copyright            : (C) 2005 by Tomas Oberhuber et al.
    email                : tomas.oberhuber@fjfi.cvut.cz
 ***************************************************************************/

/* See Copyright Notice in tnl/Copyright */

// Implemented by: Jakub Klinkovský

#pragma once

namespace TNL {
namespace Communicators {

template< typename Communicator >
struct ScopedInitializer
{
   ScopedInitializer( int& argc, char**& argv )
   {
      Communicator::Init( argc, argv );
   }

   ~ScopedInitializer()
   {
      Communicator::Finalize();
   }
};

} // namespace Communicators
} // namespace TNL
+2 −8
Original line number Diff line number Diff line
@@ -187,14 +187,8 @@ class CommunicatorTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, t
      static bool run( const Config::ParameterContainer& parameters )
      {
         if( Communicators::MpiCommunicator::isDistributed() )
         {     
               bool ret=SolverInitiatorMeshResolver< ProblemSetter, Real, Device, Index, ConfigTag, Communicators::MpiCommunicator >::run( parameters );
               Communicators::MpiCommunicator::Finalize();      
               return ret;
         }
         Communicators::MpiCommunicator::Finalize();
            return SolverInitiatorMeshResolver< ProblemSetter, Real, Device, Index, ConfigTag, Communicators::MpiCommunicator >::run( parameters );
         return SolverInitiatorMeshResolver< ProblemSetter, Real, Device, Index, ConfigTag, Communicators::NoDistrCommunicator >::run( parameters );
         
      }
};

Loading