diff --git a/include/mpicpp-lite/impl/Environment.h b/include/mpicpp-lite/impl/Environment.h index 997796d..3e612b6 100644 --- a/include/mpicpp-lite/impl/Environment.h +++ b/include/mpicpp-lite/impl/Environment.h @@ -10,6 +10,10 @@ namespace mpicpp_lite { +namespace op { +MPI_Op create(MPI_User_function * user_fn, bool commute); +} + enum class ThreadSupport : int { SINGLE = MPI_THREAD_SINGLE, FUNNELED = MPI_THREAD_FUNNELED, @@ -51,9 +55,12 @@ class Environment { private: /// User-registered datatypes static inline std::vector user_datatypes_; + /// user-defined operations + static inline std::vector user_operations_; template friend MPI_Datatype register_mpi_datatype(); + friend MPI_Op op::create(MPI_User_function * user_fn, bool commute); }; inline Environment::Environment() : initialized_(false) @@ -150,6 +157,10 @@ Environment::destroy() for (auto & dt : user_datatypes_) MPI_CHECK(MPI_Type_free(&dt)); user_datatypes_.clear(); + + for (auto & op : user_operations_) + MPI_CHECK(MPI_Op_free(&op)); + user_operations_.clear(); } } // namespace mpicpp_lite diff --git a/include/mpicpp-lite/impl/Operation.h b/include/mpicpp-lite/impl/Operation.h index c76af61..be85db0 100644 --- a/include/mpicpp-lite/impl/Operation.h +++ b/include/mpicpp-lite/impl/Operation.h @@ -5,6 +5,7 @@ #include "mpi.h" #include "Error.h" +#include "Environment.h" #include #include #include @@ -315,6 +316,7 @@ create(MPI_User_function * user_fn, bool commute) { MPI_Op op; MPI_CHECK(MPI_Op_create(user_fn, commute, &op)); + Environment::user_operations_.push_back(op); return op; }