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