Realm
A distributed, event-based tasking library
Loading...
Searching...
No Matches
network.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// Realm inter-node networking abstractions
19
20#ifndef REALM_NETWORK_H
21#define REALM_NETWORK_H
22
23#include "realm/realm_config.h"
24#include "realm/module.h"
25#include "realm/nodeset.h"
26#include "realm/memory.h"
27#include "realm/bytearray.h"
28
29#include <map>
30
31namespace Realm {
32
33 // NodeID defined in nodeset.h
34
35 class NetworkModule;
36 class MemoryImpl;
37 class IBMemory;
38 class ByteArray;
39 class ActiveMessageImpl;
40 class IncomingMessageManager;
41 class NetworkSegment;
42
43 // a RemoteAddress is used to name the target of an RDMA operation - in some
44 // cases it's as simple as a pointer, but in others additional info is needed
45 // (hopefully we won't need more than 16B anywhere though)
47 union {
48 struct {
49 uintptr_t ptr;
50 uintptr_t extra;
51 };
52 unsigned char raw_bytes[384];
53 };
54 };
55
56 // a LocalAddress is used to name the local source of an RDMA write or target
57 // of an RDMA read
58 struct LocalAddress {
60 uintptr_t offset;
61 };
62
63 namespace Network {
64 // a few globals for efficiency
65 extern NodeID my_node_id;
66 extern NodeID max_node_id;
67 extern NodeSet all_peers;
68 // all peers that can access shared memory from this node
69 // NOTE: This is an over-estimation. Users should be robust to the fact that this may
70 // include peers that are not able to access shared memory.
71 extern NodeSet shared_peers;
72
73 // in most cases, there will be a single network module - if so, we set
74 // this so we don't have to do a per-node lookup
76
77 // gets the network for a given node
79
80 // and a few "global" operations that abstract over any/all networks
81 void barrier(void);
82
83 // result of a single quiescence-check round. The runtime's shutdown loop
84 // calls Network::check_for_quiescence repeatedly and stops when it sees
85 // DONE. We deliberately do not have a "stuck" status: without
86 // introspection into the network layer there is no way to tell a slow
87 // in-flight message from a lost one, so any timeout-based abort would
88 // produce spurious failures. If the system is genuinely hung, the
89 // shutdown loop hangs (which is debuggable - attach gdb). A periodic
90 // warning is emitted while counters are frozen, but the function never
91 // fails the run.
93 {
94 // confirmed quiescent: two consecutive rounds agreed on the global state
95 // AND the state is "no in-flight messages, no queued work, no pending
96 // completions". The runtime can safely proceed with detach.
97 DONE,
98 // not yet quiescent - counters may or may not have changed this round,
99 // but the system is not in a confirmed-quiet state. Caller should call
100 // again.
102 };
103
104 // a quiescence check across all nodes - returns DONE when the global system
105 // is confirmed quiescent, otherwise PROGRESSING. The implementation is a
106 // Mattern's-shaped two-round stability check; correctness requires that
107 // the application has already promised it will not initiate new work
108 // (e.g., post-precondition during shutdown).
110
111 // collective communication across all nodes (TODO: subcommunicators?)
112 template <typename T>
113 T broadcast(NodeID root, T val);
114
115 template <typename T>
116 void gather(NodeID root, T val, std::vector<T> &result);
117 template <typename T>
118 void gather(NodeID root, T val); // for non-root participants
119
120 // untyped versions
121 void broadcast(NodeID root, const void *val_in, void *val_out, size_t bytes);
122 void gather(NodeID root, const void *val_in, void *vals_out, size_t bytes);
123
124 // for sending active messages
126 create_active_message_impl(NodeID target, unsigned short msgid, size_t header_size,
127 size_t max_payload_size, const void *src_payload_addr,
128 size_t src_payload_lines, size_t src_payload_line_stride,
129 void *storage_base, size_t storage_size);
130
132 NodeID target, unsigned short msgid, size_t header_size, size_t max_payload_size,
133 const LocalAddress &src_payload_addr, size_t src_payload_lines,
134 size_t src_payload_line_stride, const RemoteAddress &dest_payload_addr,
135 void *storage_base, size_t storage_size);
136
138 NodeID target, unsigned short msgid, size_t header_size, size_t max_payload_size,
139 const RemoteAddress &dest_payload_addr, void *storage_base, size_t storage_size);
140
142 const NodeSet &targets, unsigned short msgid, size_t header_size,
143 size_t max_payload_size, const void *src_payload_addr, size_t src_payload_lines,
144 size_t src_payload_line_stride, void *storage_base, size_t storage_size);
145
146 size_t recommended_max_payload(NodeID target, bool with_congestion,
147 size_t header_size);
148 size_t recommended_max_payload(const NodeSet &targets, bool with_congestion,
149 size_t header_size);
150 size_t recommended_max_payload(NodeID target, const RemoteAddress &dest_payload_addr,
151 bool with_congestion, size_t header_size);
152 size_t recommended_max_payload(NodeID target, const void *data, size_t bytes_per_line,
153 size_t lines, size_t line_stride, bool with_congestion,
154 size_t header_size);
155 size_t recommended_max_payload(const NodeSet &targets, const void *data,
156 size_t bytes_per_line, size_t lines,
157 size_t line_stride, bool with_congestion,
158 size_t header_size);
159 size_t recommended_max_payload(NodeID target, const LocalAddress &src_payload_addr,
160 size_t bytes_per_line, size_t lines,
161 size_t line_stride,
162 const RemoteAddress &dest_payload_addr,
163 bool with_congestion, size_t header_size);
164
165 // returns the strict upper bound on payload size for a single active
166 // message - payloads larger than this CANNOT be sent without
167 // fragmentation
168 // if src_payload_addr is non-null, the limit may be higher because the
169 // backend can use the caller's buffer directly (e.g. UCX rendezvous);
170 // if null, the network must allocate the buffer internally
171 // network backends that handle fragmentation internally (e.g. UCX with
172 // caller-provided buffers) may return SIZE_MAX to indicate no
173 // practical limit
174 // NOTE: sending payloads up to this limit is safe but may not be
175 // optimal - use recommended_max_payload() to query the size that
176 // avoids performance penalties such as protocol downgrades, extra
177 // copies, or increased latency
178 size_t max_payload_size(size_t header_size, const void *src_payload_addr);
179 }; // namespace Network
180
181 // a network module provides additional functionality on top of a normal Realm
182 // module
184 protected:
185 NetworkModule(const std::string &_name);
186
187 public:
188 // all subclasses should define this (static) method - its responsibilities
189 // are:
190 // 1) determine if the network module should even be loaded
191 // 2) fix the command line if the spawning system hijacked it
192 // static NetworkModule *create_network_module(RuntimeImpl *runtime,
193 // int *argc, const char ***argv);
194
195 // Enumerates all the peers that the current node could potentially share memory with
196 virtual void get_shared_peers(NodeSet &shared_peers) = 0;
197
198 // actual parsing of the command line should wait until here if at all
199 // possible
200 virtual void parse_command_line(RuntimeImpl *runtime,
201 std::vector<std::string> &cmdline);
202
203 // "attaches" to the network, if that is meaningful - attempts to
204 // bind/register/(pick your network-specific verb) the requested memory
205 // segments with the network
206 virtual void attach(RuntimeImpl *runtime,
207 std::vector<NetworkSegment *> &segments) = 0;
208
209 // detaches from the network
210 virtual void detach(RuntimeImpl *runtime,
211 std::vector<NetworkSegment *> &segments) = 0;
212
213 // collective communication within this network
214 virtual void barrier(void) = 0;
215 virtual void broadcast(NodeID root, const void *val_in, void *val_out,
216 size_t bytes) = 0;
217 virtual void gather(NodeID root, const void *val_in, void *vals_out,
218 size_t bytes) = 0;
219 virtual void allgatherv(const char *val_in, size_t bytes, std::vector<char> &vals_out,
220 std::vector<size_t> &lengths) = 0;
221
222 // Per-rank state used by the quiescence-detection algorithm in
223 // Network::check_for_quiescence. Each backend exposes its current local
224 // state, the algorithm sums across ranks, and termination is declared
225 // when two consecutive rounds agree on a quiet state.
226 //
227 // Correctness depends on every source of "future messages from this rank"
228 // being captured by either:
229 // - queued_items > 0 (anything queued that could spontaneously
230 // produce a send when it runs), or
231 // - packets_reserved exceeding packets_received globally (anything
232 // in flight on the wire), or
233 // - pending_completions > 0 (any local-completion bookkeeping that
234 // could fire and produce comp replies)
235 //
236 // MONOTONICITY INVARIANT: the two-round stability check requires that
237 // any real activity between rounds shows up as a counter change. Two
238 // of the five reduced fields below are snapshot counters (rises AND
239 // falls): queued_items and pending_completions. Snapshot counters
240 // can alias - the same value across rounds while items flowed
241 // through. Each one is therefore paired with a monotonic field in
242 // the same allreduce array, so the joint stability of the pair rules
243 // out aliased activity:
244 // queued_items <- paired with -> events_added (monotonic)
245 // pending_completions <- paired with -> packets_reserved (monotonic)
246 // The monotonic fields packets_reserved, packets_received, and
247 // events_added are themselves never decremented (paths that would
248 // decrement them - e.g., cancel_pbuf in GASNet-EX - are stubbed to
249 // abort). See per-field comments for the pairing argument.
251 // total number of items currently queued on this rank that could
252 // produce a future network operation: work-item queues (injector,
253 // completer, poller, rgetter), pending in-flight requests, etc.
254 // This is a SNAPSHOT (rises and falls); for stability detection it
255 // must be combined with events_added (monotonic) so that a queue
256 // whose count happens to stay the same across rounds while items
257 // flow through still registers as activity. Reduced via SUM.
258 uint64_t queued_items;
259 // Monotonic count of items ever added to any queue on this rank;
260 // the monotonic mate of queued_items. REQUIRED for stability
261 // detection: queued_items alone can be the same value across two
262 // consecutive rounds while the queue contents change (e.g., a
263 // put-completion event firing pops 1 from pending_events and adds
264 // 1 to ready_xpairs - net change in queued_items is zero, but
265 // real work happened). events_added goes up whenever any queue
266 // gains an entry, so concurrent add+remove activity that nets to
267 // zero in queued_items still shows as a change in events_added.
268 // Together with queued_items (snapshot) this fully captures
269 // queue-level activity: pure pops show up as queued_items
270 // decreasing, pure adds show up in both, and balanced add+pop
271 // shows up in events_added. Reduced via SUM.
272 uint64_t events_added;
273 // Monotonic cumulative count of network messages this rank has
274 // originated. At quiescence, sum across ranks must equal sum of
275 // packets_received. Also serves as the monotonic mate of
276 // pending_completions (see below): every alloc of a
277 // PendingCompletion is co-located with a packets_reserved++ at the
278 // same send site, so balanced alloc+recycle activity that leaves
279 // pending_completions unchanged still shows up here.
281 // Monotonic cumulative count of network messages this rank has
282 // received and counted - sampled post-drain so the count reflects
283 // every received message that has been dispatched to handlers as
284 // of the call.
286 // Snapshot count of pending remote completions on this rank waiting
287 // for replies to arrive; rises on PendingCompletion alloc, falls
288 // on recycle (comp_reply receipt or local-completion firing).
289 // Reduced via SUM. Although non-monotonic, the stability check is
290 // aliasing-safe because every alloc is paired with packets_reserved++
291 // at the same send site: between two rounds, if N allocs and M
292 // recycles happened then Δpending = N-M and Δreserved = N. Joint
293 // stability of pending_completions AND packets_reserved forces
294 // N = M = 0, ruling out balanced alloc+recycle activity that
295 // pending_completions alone would miss.
297 // local-only (NOT reduced) count of messages this rank has received
298 // that pass through IncomingMessageManager and need to be drained
299 // before the post-drain sample is taken. Must be a subset of
300 // packets_received: any wire packet that bypasses IMM (e.g., UCX
301 // remote-completion replies handled directly, GASNet-EX
302 // comp_reply/rget control AMs that are processed inline) MUST be
303 // excluded, otherwise drain_incoming_messages waits forever for
304 // total_messages_handled to reach a target it cannot. For backends
305 // where every received packet goes through IMM (GASNet-EX), this
306 // equals packets_received. MPI has a separate subset counter because
307 // completion replies bypass IMM.
309 };
310
311 // Sample the current quiescence state of this network. Called after the
312 // IncomingMessageManager has been drained, so 'packets_received' reflects
313 // every received message that has been dispatched as of the call.
314 virtual void sample_quiescence_state(QuiescenceState &state) = 0;
315
316 // Optional escape hatch for backends with an existing quiescence protocol
317 // that does not naturally expose the sampled counters above. Return true
318 // after setting 'status' if the backend handled the check itself.
319 virtual bool custom_quiescence_check(IncomingMessageManager *message_manager,
321
322 // Sum-reduce a small array of uint64_t across all ranks. Used by the
323 // Mattern's-shaped Network::check_for_quiescence loop to combine
324 // per-rank QuiescenceState samples into a global tally.
325 virtual void quiescence_allreduce_sum(const uint64_t *local_counts,
326 uint64_t *total_counts, size_t count) = 0;
327
328 // used to create a remote proxy for a memory
329 virtual MemoryImpl *create_remote_memory(RuntimeImpl *runtime, Memory m, size_t size,
330 Memory::Kind kind,
331 const ByteArray &rdma_info) = 0;
332 virtual IBMemory *create_remote_ib_memory(RuntimeImpl *runtime, Memory m, size_t size,
333 Memory::Kind kind,
334 const ByteArray &rdma_info) = 0;
335
336 virtual ActiveMessageImpl *
337 create_active_message_impl(NodeID target, unsigned short msgid, size_t header_size,
338 size_t max_payload_size, const void *src_payload_addr,
339 size_t src_payload_lines, size_t src_payload_line_stride,
340 void *storage_base, size_t storage_size) = 0;
341
343 NodeID target, unsigned short msgid, size_t header_size, size_t max_payload_size,
344 const LocalAddress &src_payload_addr, size_t src_payload_lines,
345 size_t src_payload_line_stride, const RemoteAddress &dest_payload_addr,
346 void *storage_base, size_t storage_size) = 0;
347
348 virtual ActiveMessageImpl *
349 create_active_message_impl(NodeID target, unsigned short msgid, size_t header_size,
350 size_t max_payload_size,
351 const RemoteAddress &dest_payload_addr, void *storage_base,
352 size_t storage_size) = 0;
353
355 const NodeSet &targets, unsigned short msgid, size_t header_size,
356 size_t max_payload_size, const void *src_payload_addr, size_t src_payload_lines,
357 size_t src_payload_line_stride, void *storage_base, size_t storage_size) = 0;
358
359 virtual size_t recommended_max_payload(NodeID target, bool with_congestion,
360 size_t header_size) = 0;
361 virtual size_t recommended_max_payload(const NodeSet &targets, bool with_congestion,
362 size_t header_size) = 0;
363 virtual size_t recommended_max_payload(NodeID target,
364 const RemoteAddress &dest_payload_addr,
365 bool with_congestion, size_t header_size) = 0;
366 virtual size_t recommended_max_payload(NodeID target, const void *data,
367 size_t bytes_per_line, size_t lines,
368 size_t line_stride, bool with_congestion,
369 size_t header_size) = 0;
370 virtual size_t recommended_max_payload(const NodeSet &targets, const void *data,
371 size_t bytes_per_line, size_t lines,
372 size_t line_stride, bool with_congestion,
373 size_t header_size) = 0;
374 virtual size_t recommended_max_payload(NodeID target,
375 const LocalAddress &src_payload_addr,
376 size_t bytes_per_line, size_t lines,
377 size_t line_stride,
378 const RemoteAddress &dest_payload_addr,
379 bool with_congestion, size_t header_size) = 0;
380
381 // returns the hard upper bound on payload size - see Network::max_payload_size
382 // for full documentation; callers wanting optimal performance should use
383 // recommended_max_payload() instead
384 virtual size_t max_payload_size(size_t header_size, const void *src_payload_addr) = 0;
385 };
386
387 namespace NetworkSegmentInfo {
388 // "enum" (using a namespace so that they can be extended in other
389 // headers) describing the different kind of memories that a network
390 // segment can live in
391 typedef unsigned MemoryType;
392
393 // each memory type gets to define what the extra data means for itself
394 typedef uintptr_t MemoryTypeExtraData;
395
396 static const MemoryType Unknown = 0;
397
398 // generic memory that is read/write-able by the host CPUs
399 static const MemoryType HostMem = 1;
400
401 // optional flags for a network segment
402 typedef unsigned FlagsType;
403 struct OptionFlags {
404 // registration should be performed on-demand rather than eagerly
405 static const FlagsType OnDemandRegistration = 1U << 0;
406 };
407 }; // namespace NetworkSegmentInfo
408
410 public:
412
413 // normally a request will just be for a particular size
414 void request(NetworkSegmentInfo::MemoryType _memtype, size_t _bytes,
415 size_t _alignment, NetworkSegmentInfo::MemoryTypeExtraData _memextra = 0,
417
418 // but it can also be for a pre-allocated chunk of memory with a fixed address
419 void assign(NetworkSegmentInfo::MemoryType _memtype, void *_base, size_t _bytes,
422
423 void *base; // once this is non-null, it cannot be changed
424 size_t bytes, alignment;
428
429 // again, a single network puts itself here in addition to adding to the map
432
433 // a map from each of the networks that successfully bound the segment to
434 // whatever data (if any) that network needs to track the binding
435 std::map<NetworkModule *, ByteArray> networks;
436
437 void add_rdma_info(NetworkModule *network, const void *data, size_t len);
438 const ByteArray *get_rdma_info(NetworkModule *network) const;
439
440 // returns whether the segment is registered for all networks,
441 // or for a specific network
442 bool is_registered() const;
443 bool is_registered(NetworkModule *network) const;
444
445 // tests whether an address range is in segment
446 bool in_segment(const void *range_base, size_t range_bytes) const;
447 bool in_segment(uintptr_t range_base, size_t range_bytes) const;
448 };
449
450}; // namespace Realm
451
452#include "realm/network.inl"
453
454#endif
Definition activemsg.h:221
Definition bytearray.h:53
Definition ib_memory.h:30
Definition activemsg.h:361
Definition mem_impl.h:50
Definition memory.h:33
Kind
Definition memory.h:59
Definition module.h:42
Definition network.h:183
virtual IBMemory * create_remote_ib_memory(RuntimeImpl *runtime, Memory m, size_t size, Memory::Kind kind, const ByteArray &rdma_info)=0
virtual ActiveMessageImpl * create_active_message_impl(NodeID target, unsigned short msgid, size_t header_size, size_t max_payload_size, const RemoteAddress &dest_payload_addr, void *storage_base, size_t storage_size)=0
virtual size_t recommended_max_payload(NodeID target, const RemoteAddress &dest_payload_addr, bool with_congestion, size_t header_size)=0
virtual void attach(RuntimeImpl *runtime, std::vector< NetworkSegment * > &segments)=0
virtual void sample_quiescence_state(QuiescenceState &state)=0
virtual size_t recommended_max_payload(NodeID target, const LocalAddress &src_payload_addr, size_t bytes_per_line, size_t lines, size_t line_stride, const RemoteAddress &dest_payload_addr, bool with_congestion, size_t header_size)=0
virtual size_t recommended_max_payload(const NodeSet &targets, const void *data, size_t bytes_per_line, size_t lines, size_t line_stride, bool with_congestion, size_t header_size)=0
virtual void parse_command_line(RuntimeImpl *runtime, std::vector< std::string > &cmdline)
virtual void broadcast(NodeID root, const void *val_in, void *val_out, size_t bytes)=0
virtual size_t recommended_max_payload(NodeID target, const void *data, size_t bytes_per_line, size_t lines, size_t line_stride, bool with_congestion, size_t header_size)=0
virtual ActiveMessageImpl * create_active_message_impl(NodeID target, unsigned short msgid, size_t header_size, size_t max_payload_size, const LocalAddress &src_payload_addr, size_t src_payload_lines, size_t src_payload_line_stride, const RemoteAddress &dest_payload_addr, void *storage_base, size_t storage_size)=0
virtual ActiveMessageImpl * create_active_message_impl(const NodeSet &targets, unsigned short msgid, size_t header_size, size_t max_payload_size, const void *src_payload_addr, size_t src_payload_lines, size_t src_payload_line_stride, void *storage_base, size_t storage_size)=0
virtual MemoryImpl * create_remote_memory(RuntimeImpl *runtime, Memory m, size_t size, Memory::Kind kind, const ByteArray &rdma_info)=0
virtual void barrier(void)=0
virtual void detach(RuntimeImpl *runtime, std::vector< NetworkSegment * > &segments)=0
virtual void get_shared_peers(NodeSet &shared_peers)=0
virtual ActiveMessageImpl * create_active_message_impl(NodeID target, unsigned short msgid, size_t header_size, size_t max_payload_size, const void *src_payload_addr, size_t src_payload_lines, size_t src_payload_line_stride, void *storage_base, size_t storage_size)=0
virtual void quiescence_allreduce_sum(const uint64_t *local_counts, uint64_t *total_counts, size_t count)=0
NetworkModule(const std::string &_name)
virtual void allgatherv(const char *val_in, size_t bytes, std::vector< char > &vals_out, std::vector< size_t > &lengths)=0
virtual bool custom_quiescence_check(IncomingMessageManager *message_manager, Network::QuiescenceStatus &status)
virtual void gather(NodeID root, const void *val_in, void *vals_out, size_t bytes)=0
virtual size_t recommended_max_payload(NodeID target, bool with_congestion, size_t header_size)=0
virtual size_t recommended_max_payload(const NodeSet &targets, bool with_congestion, size_t header_size)=0
virtual size_t max_payload_size(size_t header_size, const void *src_payload_addr)=0
Definition network.h:409
NetworkModule * single_network
Definition network.h:430
NetworkSegmentInfo::FlagsType flags
Definition network.h:427
NetworkSegmentInfo::MemoryType memtype
Definition network.h:425
const ByteArray * get_rdma_info(NetworkModule *network) const
bool is_registered(NetworkModule *network) const
ByteArray * single_network_data
Definition network.h:431
bool in_segment(const void *range_base, size_t range_bytes) const
size_t alignment
Definition network.h:424
NetworkSegmentInfo::MemoryTypeExtraData memextra
Definition network.h:426
std::map< NetworkModule *, ByteArray > networks
Definition network.h:435
void assign(NetworkSegmentInfo::MemoryType _memtype, void *_base, size_t _bytes, NetworkSegmentInfo::MemoryTypeExtraData _memextra=0, NetworkSegmentInfo::FlagsType _flags=0)
void add_rdma_info(NetworkModule *network, const void *data, size_t len)
bool is_registered() const
void request(NetworkSegmentInfo::MemoryType _memtype, size_t _bytes, size_t _alignment, NetworkSegmentInfo::MemoryTypeExtraData _memextra=0, NetworkSegmentInfo::FlagsType _flags=0)
void * base
Definition network.h:423
bool in_segment(uintptr_t range_base, size_t range_bytes) const
Definition nodeset.h:117
Definition runtime_impl.h:267
#define REALM_INTERNAL_API_EXTERNAL_LINKAGE
Definition compiler_support.h:218
unsigned MemoryType
Definition network.h:391
uintptr_t MemoryTypeExtraData
Definition network.h:394
unsigned FlagsType
Definition network.h:402
NodeSet all_peers
ActiveMessageImpl * create_active_message_impl(NodeID target, unsigned short msgid, size_t header_size, size_t max_payload_size, const void *src_payload_addr, size_t src_payload_lines, size_t src_payload_line_stride, void *storage_base, size_t storage_size)
size_t max_payload_size(size_t header_size, const void *src_payload_addr)
T broadcast(NodeID root, T val)
void gather(NodeID root, T val, std::vector< T > &result)
NodeID max_node_id
size_t recommended_max_payload(NodeID target, bool with_congestion, size_t header_size)
QuiescenceStatus check_for_quiescence(IncomingMessageManager *message_manager)
NodeSet shared_peers
QuiescenceStatus
Definition network.h:93
NetworkModule * single_network
void barrier(void)
NetworkModule * get_network(NodeID node)
Definition activemsg.h:42
int NodeID
Definition nodeset.h:40
Definition network.h:58
uintptr_t offset
Definition network.h:60
const NetworkSegment * segment
Definition network.h:59
uint64_t events_added
Definition network.h:272
uint64_t queued_items
Definition network.h:258
uint64_t messages_to_drain
Definition network.h:308
uint64_t packets_received
Definition network.h:285
uint64_t pending_completions
Definition network.h:296
uint64_t packets_reserved
Definition network.h:280
static const FlagsType OnDemandRegistration
Definition network.h:405
Definition network.h:46
uintptr_t extra
Definition network.h:50
uintptr_t ptr
Definition network.h:49
unsigned char raw_bytes[384]
Definition network.h:52
unsigned short msgid
Definition ucp_internal.h:2