SOPT
Sparse OPTimisation
Namespaces | Functions
sopt::mpi Namespace Reference

Namespaces

 details
 

Functions

std::shared_ptr< details::initializer > init (int argc, const char **argv)
 
std::shared_ptr< details::initializer > session_singleton ()
 
bool initialized ()
 
bool finalized ()
 
void finalize ()
 

Function Documentation

◆ finalize()

void sopt::mpi::finalize ( )

Definition at line 77 of file session.cc.

77  {
78  if (finalized() or not initialized()) return;
79  MPI_Finalize();
80 }
bool finalized()
Definition: session.cc:71
bool initialized()
Definition: session.cc:61

References finalized(), and initialized().

◆ finalized()

bool sopt::mpi::finalized ( )

Definition at line 71 of file session.cc.

71  {
72  int finalized;
73  MPI_Finalized(&finalized);
74  return finalized != 0;
75 }

Referenced by finalize(), init(), and TEST_CASE().

◆ init()

void sopt::mpi::init ( int  argc,
const char **  argv 
)
inline

Definition at line 27 of file session.cc.

27  {
28  if (finalized()) throw std::runtime_error("MPI session has already been finalized");
29  if (not initialized()) {
30  assert(details::initializer::singleton.expired());
31  std::shared_ptr<details::initializer> const ptr(new details::initializer,
32  &details::initializer::deleter);
33 #ifdef SOPT_OPENMP
34  int provided;
35  if (MPI_Init_thread(&argc, const_cast<char ***>(&argv), MPI_THREAD_FUNNELED, &provided) ==
36  MPI_SUCCESS)
37 #else
38  if (MPI_Init(&argc, const_cast<char ***>(&argv)) == MPI_SUCCESS)
39 #endif
40  details::initializer::singleton = ptr;
41 
42 #ifdef SOPT_OPENMP
43  if (provided < MPI_THREAD_FUNNELED) SOPT_THROW("MPI threading support not sufficient.");
44 #endif
45  return details::initializer::singleton.lock();
46  }
47  return session_singleton();
48 }
#define SOPT_THROW(MSG)
Definition: exception.h:46
std::shared_ptr< details::initializer > session_singleton()
Definition: session.cc:50

References finalized(), initialized(), session_singleton(), and SOPT_THROW.

Referenced by main(), and TEST_CASE().

◆ initialized()

bool sopt::mpi::initialized ( )
inline

Definition at line 61 of file session.cc.

61  {
62  int flag;
63  auto const error = MPI_Initialized(&flag);
64  if (error != MPI_SUCCESS) {
65  SOPT_ERROR("Error while calling MPI_Initialized ({})", error);
66  throw std::runtime_error("MPI error");
67  }
68  return static_cast<bool>(flag);
69 }
#define SOPT_ERROR(...)
\macro Something is definitely wrong, algorithm exits
Definition: logging.h:211

References SOPT_ERROR.

Referenced by finalize(), init(), session_singleton(), and TEST_CASE().

◆ session_singleton()

std::shared_ptr<details::initializer> sopt::mpi::session_singleton ( )

Definition at line 50 of file session.cc.

50  {
51  if (not initialized()) throw std::runtime_error("MPI session not initialized");
52  if (details::initializer::singleton.expired()) {
53  std::shared_ptr<details::initializer> const ptr(new details::initializer,
54  &details::initializer::deleter);
55  details::initializer::singleton = ptr;
56  return details::initializer::singleton.lock();
57  }
58  return details::initializer::singleton.lock();
59 }

References initialized().

Referenced by init().