Realm
A distributed, event-based tasking library
Loading...
Searching...
No Matches
sparsity_impl.h
Go to the documentation of this file.
1/*
2 * Copyright 2025 Stanford University, 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// implementation sparsity maps
19
20#ifndef REALM_DEPPART_SPARSITY_IMPL_H
21#define REALM_DEPPART_SPARSITY_IMPL_H
22
23#include "realm/indexspace.h"
24#include "realm/sparsity.h"
25#include "realm/id.h"
26
27#include "realm/activemsg.h"
28#include "realm/nodeset.h"
29#include "realm/atomics.h"
30#include <limits>
31#include <functional>
32#include <memory>
33
34namespace Realm {
35
36 class PartitioningMicroOp;
37
76
77 template <int N, typename T>
79 public:
80 virtual ~SparsityMapCommunicator() = default;
81
82 virtual void send_request(SparsityMap<N, T> me, bool request_precise,
83 bool request_approx);
84
85 virtual void send_contribute(SparsityMap<N, T> me, size_t piece_count,
86 size_t total_count, bool disjoint,
87 const void *data = nullptr, size_t datalen = 0);
88
89 virtual void send_contribute(NodeID target, SparsityMap<N, T> me, size_t piece_count,
90 size_t total_count, bool disjoint,
91 const void *data = nullptr, size_t datalen = 0);
92
93 virtual size_t recommend_max_payload(NodeID owner, bool with_congestion);
94 };
95
104 template <int N, typename T>
106 public:
108
110 SparsityMapCommunicator<N, T> *_sparsity_comm);
111
112 // actual implementation - SparsityMapPublicImpl's version just calls this one
113 Event make_valid(bool precise = true);
114
116
117 // methods used in the population of a sparsity map
118
119 // when we plan out a partitioning operation, we'll know how many
120 // different uops are going to contribute something (or nothing) to
121 // the sparsity map - once all of those contributions arrive, we can
122 // finalize the sparsity map
123 void set_contributor_count(int count);
125
127 void contribute_dense_rect_list(const std::vector<Rect<N, T>> &rects, bool disjoint);
128 void contribute_raw_rects(const Rect<N, T> *rects, size_t count, size_t piece_count,
129 bool disjoint, size_t total_count);
130
131 // adds a microop as a waiter for valid sparsity map data - returns true
132 // if the uop is added to the list (i.e. will be getting a callback at some point),
133 // or false if the sparsity map became valid before this call (i.e. no callback)
134 bool add_waiter(PartitioningMicroOp *uop, bool precise);
135
136 void remote_data_request(NodeID requestor, bool send_precise, bool send_approx);
137 void remote_data_reply(NodeID requestor, bool send_precise, bool send_approx);
138
140
145
146 static void handle_message(NodeID sender, const RemoteSparsityRequest &msg,
147 const void *data, size_t datalen);
148 };
149
152 size_t piece_count; // non-zero only on last piece of contribution
153 bool disjoint; // if set, all rectangles (from this source and any other)
154 // are known to be disjoint
155 size_t total_count; // if non-zero, advertises the known total number of
156 // recangles in the sparsity map
157
158 static void handle_message(NodeID sender, const RemoteSparsityContrib &msg,
159 const void *data, size_t datalen);
160 };
161
164 size_t count;
165
166 static void handle_message(NodeID sender, const SetContribCountMessage &msg,
167 const void *data, size_t datalen);
168 };
169
170 protected:
171 void finalize(void);
172
176
180 std::vector<PartitioningMicroOp *> approx_waiters, precise_waiters;
186 size_t sizeof_precise{0};
187
188 std::unique_ptr<SparsityMapCommunicator<N, T>> sparsity_comm;
189 };
190
193 public:
194 virtual ~SparsityWrapperCommunicator() = default;
195 virtual void unsubscribe(SparsityMapImplWrapper *impl, NodeID sender, ID id);
196 };
197
198 // we need a type-erased wrapper to store in the runtime's lookup table
200 public:
202
205 bool _report_leaks);
207
208 void init(ID _me, unsigned _init_owner);
209 void recycle(void);
210 void unsubscribe(NodeID node);
211
212 void add_references(unsigned count, Event wait_on = Event::NO_EVENT);
213 void remove_references(unsigned count, Event wait_on);
214
215 static ID make_id(const SparsityMapImplWrapper &dummy, int owner, ID::IDType index)
216 {
217 return ID::make_sparsity(owner, 0, index);
218 }
219
221 unsigned owner{std::numeric_limits<unsigned>::max()};
224 atomic<void *> map_impl{nullptr}; // actual implementation
227 std::unique_ptr<SparsityWrapperCommunicator> communicator;
228 bool report_leaks{false};
229
230 std::function<void(void *)> map_deleter;
231
232 template <int N, typename T>
234
237 static void handle_message(NodeID sender, const UnsubscribeMessage &msg,
238 const void *data, size_t datalen);
239 };
241 };
242
243}; // namespace Realm
244
245#endif // REALM_DEPPART_SPARSITY_IMPL_H
246
247#include "realm/deppart/sparsity_impl.inl"
Definition activemsg.h:303
Definition event.h:50
static const Event NO_EVENT
The value should be usued to initialize an event handle. NO_EVENT is always in has triggered state .
Definition event.h:71
Definition id.h:30
ID_Types
Definition id.h:250
@ ID_SPARSITY
Definition id.h:262
::realm_id_t IDType
Definition id.h:32
static ID make_sparsity(unsigned owner_node, unsigned creator_node, unsigned sparsity_idx)
Definition nodeset.h:117
Definition partitions.h:98
Definition sparsity_impl.h:78
virtual ~SparsityMapCommunicator()=default
virtual void send_contribute(NodeID target, SparsityMap< N, T > me, size_t piece_count, size_t total_count, bool disjoint, const void *data=nullptr, size_t datalen=0)
virtual void send_request(SparsityMap< N, T > me, bool request_precise, bool request_approx)
virtual void send_contribute(SparsityMap< N, T > me, size_t piece_count, size_t total_count, bool disjoint, const void *data=nullptr, size_t datalen=0)
virtual size_t recommend_max_payload(NodeID owner, bool with_congestion)
Definition sparsity_impl.h:199
atomic< unsigned > references
Definition sparsity_impl.h:225
atomic< void * > map_impl
Definition sparsity_impl.h:224
static ID make_id(const SparsityMapImplWrapper &dummy, int owner, ID::IDType index)
Definition sparsity_impl.h:215
bool report_leaks
Definition sparsity_impl.h:228
static constexpr ID::ID_Types ID_TYPE
Definition sparsity_impl.h:201
unsigned owner
Definition sparsity_impl.h:221
void remove_references(unsigned count, Event wait_on)
SparsityMapImplWrapper(SparsityWrapperCommunicator *_communicator, bool _report_leaks)
std::unique_ptr< SparsityWrapperCommunicator > communicator
Definition sparsity_impl.h:227
void init(ID _me, unsigned _init_owner)
void unsubscribe(NodeID node)
std::function< void(void *)> map_deleter
Definition sparsity_impl.h:230
atomic< DynamicTemplates::TagType > type_tag
Definition sparsity_impl.h:223
SparsityMapImpl< N, T > * get_or_create(SparsityMap< N, T > me)
void add_references(unsigned count, Event wait_on=Event::NO_EVENT)
ID me
Definition sparsity_impl.h:220
SparsityMapImplWrapper * next_free
Definition sparsity_impl.h:222
NodeSet subscribers
Definition sparsity_impl.h:226
static ActiveMessageHandlerReg< UnsubscribeMessage > unsubscribe_message_handler_reg
Definition sparsity_impl.h:240
Definition sparsity_impl.h:105
static ActiveMessageHandlerReg< RemoteSparsityContrib > remote_sparsity_contrib_reg
Definition sparsity_impl.h:174
Event make_valid(bool precise=true)
void set_contributor_count(int count)
void record_remote_contributor(NodeID contributor)
static ActiveMessageHandlerReg< SetContribCountMessage > set_contrib_count_msg_reg
Definition sparsity_impl.h:175
bool approx_requested
Definition sparsity_impl.h:181
void contribute_raw_rects(const Rect< N, T > *rects, size_t count, size_t piece_count, bool disjoint, size_t total_count)
static SparsityMapImpl< N, T > * lookup(SparsityMap< N, T > sparsity)
atomic< int > remaining_contributor_count
Definition sparsity_impl.h:177
std::vector< PartitioningMicroOp * > approx_waiters
Definition sparsity_impl.h:180
Event precise_ready_event
Definition sparsity_impl.h:182
Mutex mutex
Definition sparsity_impl.h:179
bool add_waiter(PartitioningMicroOp *uop, bool precise)
size_t sizeof_precise
Definition sparsity_impl.h:186
void remote_data_request(NodeID requestor, bool send_precise, bool send_approx)
atomic< int > remaining_piece_count
Definition sparsity_impl.h:178
SparsityMap< N, T > me
Definition sparsity_impl.h:139
SparsityMapImpl(SparsityMap< N, T > _me, NodeSet &subscribers, SparsityMapCommunicator< N, T > *_sparsity_comm)
NodeSet remote_approx_waiters
Definition sparsity_impl.h:184
NodeSet remote_precise_waiters
Definition sparsity_impl.h:184
static ActiveMessageHandlerReg< RemoteSparsityRequest > remote_sparsity_request_reg
Definition sparsity_impl.h:173
bool precise_requested
Definition sparsity_impl.h:181
atomic< int > total_piece_count
Definition sparsity_impl.h:178
void remote_data_reply(NodeID requestor, bool send_precise, bool send_approx)
NodeSet & remote_subscribers
Definition sparsity_impl.h:185
Event approx_ready_event
Definition sparsity_impl.h:183
SparsityMapImpl(SparsityMap< N, T > _me, NodeSet &subscribers)
void contribute_dense_rect_list(const std::vector< Rect< N, T > > &rects, bool disjoint)
std::unique_ptr< SparsityMapCommunicator< N, T > > sparsity_comm
Definition sparsity_impl.h:188
std::vector< PartitioningMicroOp * > precise_waiters
Definition sparsity_impl.h:180
void contribute_nothing(void)
Definition sparsity.h:171
Definition sparsity_impl.h:43
Event add_references(unsigned count)
static ActiveMessageHandlerReg< SparsityMapAddReferenceMessage > sparse_untyped_add_references_message_handler_reg
Definition sparsity_impl.h:72
id_t id
Definition sparsity_impl.h:46
void remove_references(unsigned count, Event wait_on)
static ActiveMessageHandlerReg< SparsityMapRemoveReferencesMessage > sparse_untyped_remove_references_message_handler_reg
Definition sparsity_impl.h:74
SparsityMapRefCounter(::realm_id_t id)
::realm_id_t id_t
Definition sparsity_impl.h:45
Definition sparsity.h:65
Definition sparsity_impl.h:192
virtual ~SparsityWrapperCommunicator()=default
virtual void unsubscribe(SparsityMapImplWrapper *impl, NodeID sender, ID id)
Definition mutex.h:223
Definition atomics.h:31
Definition activemsg.h:38
int NodeID
Definition nodeset.h:40
unsigned long long realm_id_t
Definition realm_c.h:64
Definition point.h:143
static void handle_message(NodeID sender, const UnsubscribeMessage &msg, const void *data, size_t datalen)
::realm_id_t id
Definition sparsity_impl.h:236
Definition sparsity_impl.h:150
size_t total_count
Definition sparsity_impl.h:155
bool disjoint
Definition sparsity_impl.h:153
size_t piece_count
Definition sparsity_impl.h:152
SparsityMap< N, T > sparsity
Definition sparsity_impl.h:151
static void handle_message(NodeID sender, const RemoteSparsityContrib &msg, const void *data, size_t datalen)
Definition sparsity_impl.h:141
bool send_precise
Definition sparsity_impl.h:143
static void handle_message(NodeID sender, const RemoteSparsityRequest &msg, const void *data, size_t datalen)
bool send_approx
Definition sparsity_impl.h:144
SparsityMap< N, T > sparsity
Definition sparsity_impl.h:142
static void handle_message(NodeID sender, const SetContribCountMessage &msg, const void *data, size_t datalen)
SparsityMap< N, T > sparsity
Definition sparsity_impl.h:163
size_t count
Definition sparsity_impl.h:164
static void handle_message(NodeID sender, const SparsityMapAddReferenceMessage &msg, const void *data, size_t datalen)
static void handle_message(NodeID sender, const SparsityMapRemoveReferencesMessage &msg, const void *data, size_t datalen)