dune-common  2.9.0
mpihelper.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 // SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
4 // SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
5 #ifndef DUNE_MPIHELPER
6 #define DUNE_MPIHELPER
7 
8 #if HAVE_MPI
9 #include <cassert>
10 #include <mpi.h>
11 #endif
12 
13 #include <mutex>
14 
16 #if HAVE_MPI
19 #endif
21 
22 namespace Dune
23 {
74  {
75  public:
80  constexpr static bool isFake = true;
81 
86 
94  {
95  static MPICommunicator comm;
96  return comm;
97  }
98 
106  {
107  return getCommunicator();
108  }
109 
110 
111 
117  [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
119  {
121  }
122 
125  {
127  }
128 
144  DUNE_EXPORT static FakeMPIHelper& instance([[maybe_unused]] int argc,
145  [[maybe_unused]] char** argv)
146  {
147  return instance();
148  }
149 
151  {
152  static FakeMPIHelper singleton;
153  return singleton;
154  }
155 
159  int rank () const { return 0; }
163  int size () const { return 1; }
164 
165  private:
166  FakeMPIHelper() {}
167  FakeMPIHelper(const FakeMPIHelper&);
168  FakeMPIHelper& operator=(const FakeMPIHelper);
169  };
170 
171 #if HAVE_MPI
178  class MPIHelper
179  {
180  public:
185  constexpr static bool isFake = false;
186 
190  typedef MPI_Comm MPICommunicator;
191 
199  {
200  return MPI_COMM_WORLD;
201  }
202 
210  {
211  return MPI_COMM_SELF;
212  }
213 
219  [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
222  {
224  }
225 
228  {
230  }
246  DUNE_EXPORT static MPIHelper& instance(int& argc, char**& argv)
247  {
248  // create singleton instance
249  if (!instance_){
250  static std::mutex mutex;
251  std::lock_guard<std::mutex> guard(mutex);
252  if(!instance_)
253  instance_.reset(new MPIHelper(argc,argv));
254  }
255  return *instance_;
256  }
257 
259  {
260  if(!instance_)
261  DUNE_THROW(InvalidStateException, "MPIHelper not initialized! Call MPIHelper::instance(argc, argv) with arguments first.");
262  return *instance_;
263  }
264 
268  int rank () const { return rank_; }
272  int size () const { return size_; }
273 
276  {
277  int wasFinalized = -1;
278  MPI_Finalized( &wasFinalized );
279  if(!wasFinalized && initializedHere_)
280  {
281  MPI_Finalize();
282  dverb << "Called MPI_Finalize on p=" << rank_ << "!" <<std::endl;
283  }
284 
285  }
286 
287  private:
288  int rank_;
289  int size_;
290  bool initializedHere_;
291  void prevent_warning(int){}
292  static inline std::unique_ptr<MPIHelper> instance_ = {};
293 
295  MPIHelper(int& argc, char**& argv)
296  : initializedHere_(false)
297  {
298  int wasInitialized = -1;
299  MPI_Initialized( &wasInitialized );
300  if(!wasInitialized)
301  {
302  rank_ = -1;
303  size_ = -1;
304  static int is_initialized = MPI_Init(&argc, &argv);
305  prevent_warning(is_initialized);
306  initializedHere_ = true;
307  }
308 
309  MPI_Comm_rank(MPI_COMM_WORLD,&rank_);
310  MPI_Comm_size(MPI_COMM_WORLD,&size_);
311 
312  assert( rank_ >= 0 );
313  assert( size_ >= 1 );
314 
315  dverb << "Called MPI_Init on p=" << rank_ << "!" << std::endl;
316  }
317 
318  MPIHelper(const MPIHelper&);
319  MPIHelper& operator=(const MPIHelper);
320  };
321 #else // !HAVE_MPI
322  // We do not have MPI therefore FakeMPIHelper
323  // is the MPIHelper
328  typedef FakeMPIHelper MPIHelper;
329 
330 #endif // !HAVE_MPI
331 
332 } // end namespace Dune
333 #endif
Implements an utility class that provides collective communication methods for sequential programs.
Implements an utility class that provides MPI's collective communication methods.
Standard Dune debug streams.
Definition of macros controlling symbol visibility at the ABI level.
#define DUNE_EXPORT
Export a symbol as part of the public ABI.
Definition: visibility.hh:20
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
DVerbType dverb(std::cout)
Singleton of verbose debug stream.
Definition: stdstreams.hh:116
Dune namespace.
Definition: alignedallocator.hh:13
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:281
Definition: communication.hh:46
Collective communication interface and sequential default implementation.
Definition: communication.hh:100
A fake mpi helper.
Definition: mpihelper.hh:74
static DUNE_EXPORT MPICommunicator getCommunicator()
get the default communicator
Definition: mpihelper.hh:93
static DUNE_EXPORT FakeMPIHelper & instance([[maybe_unused]] int argc, [[maybe_unused]] char **argv)
Get the singleton instance of the helper.
Definition: mpihelper.hh:144
constexpr static bool isFake
Are we fake (i.e. pretend to have MPI support but are compiled without.)
Definition: mpihelper.hh:80
static Communication< MPICommunicator > getCollectiveCommunication()
Definition: mpihelper.hh:118
int size() const
return rank of process, i.e. one
Definition: mpihelper.hh:163
static Communication< MPICommunicator > getCommunication()
Definition: mpihelper.hh:124
static MPICommunicator getLocalCommunicator()
get a local communicator
Definition: mpihelper.hh:105
No_Comm MPICommunicator
The type of the mpi communicator.
Definition: mpihelper.hh:85
static DUNE_EXPORT FakeMPIHelper & instance()
Definition: mpihelper.hh:150
int rank() const
return rank of process, i.e. zero
Definition: mpihelper.hh:159
A real mpi helper.
Definition: mpihelper.hh:179
int size() const
return number of processes
Definition: mpihelper.hh:272
static Communication< MPICommunicator > getCollectiveCommunication()
Definition: mpihelper.hh:221
~MPIHelper()
calls MPI_Finalize
Definition: mpihelper.hh:275
int rank() const
return rank of process
Definition: mpihelper.hh:268
MPI_Comm MPICommunicator
The type of the mpi communicator.
Definition: mpihelper.hh:190
static MPICommunicator getCommunicator()
get the default communicator
Definition: mpihelper.hh:198
static MPICommunicator getLocalCommunicator()
get a local communicator
Definition: mpihelper.hh:209
static Communication< MPICommunicator > getCommunication()
Definition: mpihelper.hh:227
static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)
Get the singleton instance of the helper.
Definition: mpihelper.hh:246
static DUNE_EXPORT MPIHelper & instance()
Definition: mpihelper.hh:258
constexpr static bool isFake
Are we fake (i. e. pretend to have MPI support but are compiled without.
Definition: mpihelper.hh:185