2 #include "sopt/config.h"
11 void initializer::deleter(initializer *tag) {
12 if (tag ==
nullptr)
return;
18 auto const error = MPI_Finalize();
19 if (error != MPI_SUCCESS) {
20 SOPT_ERROR(
"Error while calling MPI_Initialized ({})", error);
21 throw std::runtime_error(
"MPI error");
24 std::weak_ptr<initializer> initializer::singleton;
27 std::shared_ptr<details::initializer>
init(
int argc,
const char **argv) {
28 if (
finalized())
throw std::runtime_error(
"MPI session has already been finalized");
30 assert(details::initializer::singleton.expired());
31 std::shared_ptr<details::initializer>
const ptr(
new details::initializer,
32 &details::initializer::deleter);
35 if (MPI_Init_thread(&argc,
const_cast<char ***
>(&argv), MPI_THREAD_FUNNELED, &provided) ==
38 if (MPI_Init(&argc,
const_cast<char ***
>(&argv)) == MPI_SUCCESS)
40 details::initializer::singleton = ptr;
43 if (provided < MPI_THREAD_FUNNELED)
SOPT_THROW(
"MPI threading support not sufficient.");
45 return details::initializer::singleton.lock();
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();
58 return details::initializer::singleton.lock();
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");
68 return static_cast<bool>(flag);
#define SOPT_ERROR(...)
\macro Something is definitely wrong, algorithm exits
std::shared_ptr< details::initializer > session_singleton()
std::shared_ptr< details::initializer > init(int argc, const char **argv)