ttg 1.0.0-alpha
Template Task Graph (TTG): flowgraph-based programming model for high-performance distributed-memory algorithms
Loading...
Searching...
No Matches
env.h
Go to the documentation of this file.
1//
2// Created by Eduard Valeyev on 5/20/25.
3//
4
5#ifndef TTG_ENV_H
6#define TTG_ENV_H
7
8#include <umpire_cxx_allocator.hpp>
9
10#include <umpire/strategy/QuickPool.hpp>
11#include <umpire/strategy/SizeLimiter.hpp>
12
13#include <cassert>
14#include <memory>
15#include <mutex>
16
17namespace ttg {
18
25 class Env {
26 public:
27 ~Env() {
28 }
29
30 Env(const Env&) = delete;
31 Env(Env&&) = delete;
32 Env& operator=(const Env&) = delete;
33 Env& operator=(Env&&) = delete;
34
37 static std::unique_ptr<Env>& instance() {
38 if (!instance_accessor()) {
39 initialize();
40 }
41 return instance_accessor();
42 }
43
44 // clang-format off
51 // clang-format on
52 static void initialize(const std::uint64_t page_size = (1ul << 25),
53 const std::uint64_t pinned_alloc_limit = (1ul << 40)) {
54 static std::mutex mtx; // to make initialize() reentrant
55 std::scoped_lock lock{mtx};
56 // only the winner of the lock race gets to initialize
57 if (instance_accessor() == nullptr) {
58
59 // uncomment to debug umpire ops
60 //
61 // umpire::util::Logger::getActiveLogger()->setLoggingMsgLevel(
62 // umpire::util::message::Debug);
63
64 auto& rm = umpire::ResourceManager::getInstance();
65
66 // turn off Umpire introspection for non-Debug builds
67#ifndef NDEBUG
68 constexpr auto introspect = true;
69#else
70 constexpr auto introspect = false;
71#endif
72
73 // allocate pinned_alloc_limit in pinned memory
74 auto pinned_size_limited_alloc =
75 rm.makeAllocator<umpire::strategy::SizeLimiter, introspect>(
76 "SizeLimited_PINNED", rm.getAllocator("PINNED"),
77 pinned_alloc_limit);
78 auto pinned_dynamic_pool =
79 rm.makeAllocator<umpire::strategy::QuickPool, introspect>(
80 "QuickPool_SizeLimited_PINNED", pinned_size_limited_alloc,
81 /* first_minimum_pool_allocation_size = */ 0,
82 /* next_minimum_pool_allocation_size = */ page_size,
83 /* alignment */ 16);
84
85 auto env = std::unique_ptr<Env>(new Env(pinned_dynamic_pool));
86 instance_accessor() = std::move(env);
87 }
88 }
89
94 auto& pinned_allocator() { return pinned_allocator_; }
95
96 // clang-format off
100 // clang-format on
102 assert(dynamic_cast<::umpire::strategy::QuickPool*>(
103 pinned_allocator_.getAllocationStrategy()) != nullptr);
104 return dynamic_cast<::umpire::strategy::QuickPool*>(
105 pinned_allocator_.getAllocationStrategy())
106 ->getActualHighwaterMark();
107 }
108
109 protected:
110 Env(::umpire::Allocator pinned_alloc)
111 : pinned_allocator_(pinned_alloc) {}
112
113 private:
114 // allocates from a dynamic, size-limited pinned memory pool
115 // N.B. not thread safe, so must be wrapped into umpire_based_allocator_impl
116 ::umpire::Allocator pinned_allocator_;
117
118 inline static std::unique_ptr<Env>& instance_accessor() {
119 static std::unique_ptr<Env> instance_{nullptr};
120 return instance_;
121 }
122 }; // class Env
123
124 namespace umpire {
125
126 struct pinned_allocator_getter {
127 inline ::umpire::Allocator& operator()() { return Env::instance()->pinned_allocator(); }
128 };
129
130 }
131
133 template <typename T>
134 using pinned_allocator_t = ::umpire::default_init_allocator<
135 T, ::umpire::allocator<T, ::umpire::detail::MutexLock<::ttg::Env>,
136 umpire::pinned_allocator_getter>>;
137
138} // namespace ttg
139
140#endif // TTG_ENV_H
Definition env.h:25
static void initialize(const std::uint64_t page_size=(1ul<< 25), const std::uint64_t pinned_alloc_limit=(1ul<< 40))
Definition env.h:52
auto & pinned_allocator()
Definition env.h:94
Env(Env &&)=delete
Env(::umpire::Allocator pinned_alloc)
Definition env.h:110
Env & operator=(Env &&)=delete
Env(const Env &)=delete
~Env()
Definition env.h:27
Env & operator=(const Env &)=delete
std::size_t pinned_allocator_getActualHighWatermark()
Definition env.h:101
static std::unique_ptr< Env > & instance()
Definition env.h:37
top-level TTG namespace contains runtime-neutral functionality
Definition keymap.h:8
::umpire::default_init_allocator< T, ::umpire::allocator< T, ::umpire::detail::MutexLock<::ttg::Env >, umpire::pinned_allocator_getter > > pinned_allocator_t
pooled thread-safe pinned host memory allocator for device computing
Definition env.h:136