Realm
A distributed, event-based tasking library
Loading...
Searching...
No Matches
mpool.h
Go to the documentation of this file.
1/*
2 * Copyright 2025 NVIDIA Corporation
3 * SPDX-License-Identifier: Apache-2.0
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#ifndef MPOOL_H
19#define MPOOL_H
20
21#include <string>
22#include <climits>
23#include <cstdint>
24#include <unordered_map>
25
26/* A chunk looks like this:
27 * +----------+-----+-----------+-----+------+---------+-----+
28 * Chunk | pad | Elem | obj | pad | Elem | obj | ... |
29 * +----------+-----+-----------+-----+------+---------+-----+
30 * |<-->|
31 * This location is aligned
32 */
33
34namespace Realm {
35
36 namespace UCP {
37
38 using chunk_alloc_t = void *(*)(size_t bytes, void *arg);
39 using chunk_release_t = void (*)(void *chunk, void *arg);
40 using obj_init_t = void (*)(void *obj, void *arg);
41 using obj_cleanup_t = void (*)(void *obj, void *arg);
42
43 class MPool {
44 public:
45 MPool(std::string name_, bool leak_check_, size_t obj_size_, size_t alignment_,
46 size_t alignment_offset_, size_t objs_per_chunk_ = 1024,
47 size_t init_num_objs_ = 1024, size_t max_objs_ = UINT_MAX,
48 size_t max_chunk_size_ = UINT_MAX,
49 double expand_factor_ = 1.5, // new size = expand_factor * current size
51 void *chunk_alloc_arg_ = nullptr,
52 chunk_release_t chunk_release_ = &MPool::free_wrapper,
53 void *chunk_release_arg_ = nullptr, obj_init_t obj_init_ = nullptr,
54 void *obj_init_arg_ = nullptr, obj_cleanup_t obj_cleanup_ = nullptr,
55 void *obj_cleanup_arg_ = nullptr);
56
57 MPool &operator=(const MPool &) = delete;
58 MPool(const MPool &) = delete;
60
61 void *get();
62 static void put(void *obj);
63 bool expand(size_t ext_objs);
64 bool has(bool with_expand);
65
66 static void *malloc_wrapper(size_t size, void *arg)
67 {
68 (void)arg;
69 return malloc(size);
70 }
71
72 static void free_wrapper(void *chunk, void *arg)
73 {
74 (void)arg;
75 free(chunk);
76 }
77
78 private:
79 union Elem {
80 Elem *next{nullptr}; // used when in freelist
81 MPool *mp; // used when not in freelist
82 // obj
83 };
84 struct Chunk {
85 size_t num_objs;
86 void *elems;
87 Chunk *next{nullptr};
88 // elements
89 };
90
91 bool validate_config();
92 void free_list_add(Elem *elem);
93 void *chunk_elems(const Chunk *chunk);
94 Elem *chunk_ith_elem(const Chunk *chunk, size_t i);
95
96 std::string name;
97 bool leak_check;
98 size_t obj_size;
99 size_t alignment;
100 size_t alignment_offset;
101 size_t objs_per_chunk;
102 size_t init_num_objs;
103 size_t max_objs;
104 size_t max_chunk_size;
105 double expand_factor; // new size = expand_factor * current size
106 chunk_alloc_t chunk_alloc;
107 void *chunk_alloc_arg;
108 chunk_release_t chunk_release;
109 void *chunk_release_arg;
110 obj_init_t obj_init;
111 void *obj_init_arg;
112 obj_cleanup_t obj_cleanup;
113 void *obj_cleanup_arg;
114
115 size_t num_objs{0};
116 size_t num_chunks{0};
117 size_t obj_alloc_size;
118 Elem *free_list{nullptr};
119 Chunk *chunks{nullptr};
120 };
121
122 class VMPool {
123 public:
124 VMPool(std::string name_, bool leak_check_, size_t max_obj_size_, size_t alignment_,
125 size_t objs_per_chunk_ = 128, size_t init_num_objs_ = 256,
126 size_t max_objs_ = UINT_MAX, size_t max_chunk_size_ = UINT_MAX,
127 double expand_factor_ = 1.5, // new size = expand_factor * current size
128 chunk_alloc_t chunk_alloc_ = &MPool::malloc_wrapper,
129 void *chunk_alloc_arg_ = nullptr,
130 chunk_release_t chunk_release_ = &MPool::free_wrapper,
131 void *chunk_release_arg_ = nullptr, obj_init_t obj_init_ = nullptr,
132 void *obj_init_arg_ = nullptr, obj_cleanup_t obj_cleanup_ = nullptr,
133 void *obj_cleanup_arg_ = nullptr);
134
136
137 void *get(size_t size);
138 static void put(void *buf);
139 bool expand(size_t ext_objs);
140
141 private:
142 struct Elem {
143 VMPool *vmp;
144 uintptr_t parent_obj;
145 // sub-allocation
146 };
147
148 static const size_t metadata_size{sizeof(Elem) + alignof(Elem)};
149 uintptr_t obj_cached{0};
150 uintptr_t addr_cached{0};
151 size_t max_obj_size;
152 size_t mpool_max_obj_size;
153 size_t alignment;
154 MPool *mp;
155 std::unordered_map<uintptr_t, size_t> objs_map;
156 };
157
158 }; // namespace UCP
159
160}; // namespace Realm
161
162#endif
Definition mpool.h:43
MPool(std::string name_, bool leak_check_, size_t obj_size_, size_t alignment_, size_t alignment_offset_, size_t objs_per_chunk_=1024, size_t init_num_objs_=1024, size_t max_objs_=UINT_MAX, size_t max_chunk_size_=UINT_MAX, double expand_factor_=1.5, chunk_alloc_t chunk_alloc_=&MPool::malloc_wrapper, void *chunk_alloc_arg_=nullptr, chunk_release_t chunk_release_=&MPool::free_wrapper, void *chunk_release_arg_=nullptr, obj_init_t obj_init_=nullptr, void *obj_init_arg_=nullptr, obj_cleanup_t obj_cleanup_=nullptr, void *obj_cleanup_arg_=nullptr)
static void put(void *obj)
static void free_wrapper(void *chunk, void *arg)
Definition mpool.h:72
static void * malloc_wrapper(size_t size, void *arg)
Definition mpool.h:66
bool expand(size_t ext_objs)
MPool(const MPool &)=delete
MPool & operator=(const MPool &)=delete
bool has(bool with_expand)
Definition mpool.h:122
bool expand(size_t ext_objs)
void * get(size_t size)
VMPool(std::string name_, bool leak_check_, size_t max_obj_size_, size_t alignment_, size_t objs_per_chunk_=128, size_t init_num_objs_=256, size_t max_objs_=UINT_MAX, size_t max_chunk_size_=UINT_MAX, double expand_factor_=1.5, chunk_alloc_t chunk_alloc_=&MPool::malloc_wrapper, void *chunk_alloc_arg_=nullptr, chunk_release_t chunk_release_=&MPool::free_wrapper, void *chunk_release_arg_=nullptr, obj_init_t obj_init_=nullptr, void *obj_init_arg_=nullptr, obj_cleanup_t obj_cleanup_=nullptr, void *obj_cleanup_arg_=nullptr)
static void put(void *buf)
void(*)(void *obj, void *arg) obj_cleanup_t
Definition mpool.h:41
void(*)(void *chunk, void *arg) chunk_release_t
Definition mpool.h:39
void *(*)(size_t bytes, void *arg) chunk_alloc_t
Definition mpool.h:38
void(*)(void *obj, void *arg) obj_init_t
Definition mpool.h:40
Definition activemsg.h:38