Realm
A distributed, event-based tasking library
Loading...
Searching...
No Matches
gasnetex_internal.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// GASNet-EX network module internals
19
20#ifndef GASNETEX_INTERNAL_H
21#define GASNETEX_INTERNAL_H
22
24
25#ifdef REALM_USE_GASNETEX_WRAPPER
26// Disable the definitions and importing of symbols we're not going to use
27#define GEX_NO_PROTOTYPES 1
28#endif
29
31
32#include "realm/bgwork.h"
33#include "realm/atomics.h"
34#include "realm/activemsg.h"
35#include "realm/lists.h"
36
37namespace Realm {
38
39#define REALM_GEX_MODULE_VERSION 20240301
40
42
43 // rdma pointers need to identify which endpoint they belong to
48
49 class OutbufManager;
50
52 public:
54
60
62
74
75 static const int MAX_PACKETS = 256;
76
77 bool pktbuf_reserve(size_t bytes, int &pktidx, uintptr_t &offset);
79 uintptr_t pktbuf_get_offset(int pktidx);
80 bool pktbuf_commit(int pktidx, PktType pkttype, bool update_realbuf);
81
82 protected:
83 friend class OutbufManager;
84 friend class XmitSrcDestPair;
85
86 void set_state(State new_state);
87
91 uintptr_t baseptr;
92 size_t size;
93
97
99
100 // pbuf reservatsions are NOT thread-safe - external serialization is used
101 atomic<int> pktbuf_total_packets; // unsynchronized read ok
103 size_t pktbuf_pkt_ends[MAX_PACKETS]; // stores where a packet _ends_
104
105 // pbuf commits are lock-free
108
109 // pbuf consumption is NOT thread-safe - one pusher at a time
113 };
114
116 public:
118 : md(_md)
119 {}
120
121 void operator()() const { md->dec_usecount(); }
122
123 protected:
125 };
126
128 public:
131
132 void init(size_t _outbuf_count, size_t _outbuf_size, uintptr_t _baseptr);
133
135 bool new_endpoint);
137
138 virtual bool do_work(TimeLimit work_until);
139
140 protected:
145 // we manage the copying over overflow bufs back to real outbufs - track
146 // both pending overflow bufs and reserved outbufs and request bgwork
147 // time when we've got at least one of each
149 // In order to detect the case of misconfigured objcounts given the
150 // number of endpoints we count how many different endpoints we
151 // need to allocate buffers for, if it is more than the total number
152 // of buffers then we fail immediately since we'll never succeed
153 // TODO: Remove this once we insert a slow insertion pathway
154 // from dynamically allocated output buffers that are not
155 // registered with GASNet
156 // https://github.com/StanfordLegion/realm/issues/239
161 };
162
164
166 public:
168
169 void *add_local_completion(size_t bytes, bool late_ok = false);
170 void *add_remote_completion(size_t bytes);
171
172 // marks ready and returns true if non-empty, else resets and returns false
173 bool mark_ready(unsigned exp_local, unsigned exp_remote);
174
177
178 // these two calls can be concurrent, which complicates the determination of
179 // who can free the entry
182
183 int index;
186 // these three bits need to be in a single atomic location
187 static const unsigned LOCAL_PENDING_BIT = 1;
188 static const unsigned REMOTE_PENDING_BIT = 2;
189 static const unsigned READY_BIT = 4;
193
194 static const size_t TOTAL_CAPACITY = 256;
198 Storage_aligned storage;
199 };
200
202 static const size_t LOG2_GROUPSIZE = 8; // 256 per group
203
205 };
206
208 public:
211
214
216 void invoke_completions(PendingCompletion *comp, bool do_local, bool do_remote);
217
219
221
222 protected:
223 // NOTE: we stuff completion IDs, message IDs and 2 more bits into a
224 // 32-bit word, so we're limited to 2^(30-12) = 256K completions
225 static const size_t LOG2_MAXGROUPS = 10;
226
227 // protects pops from the free list (to avoid A-B-A problem), but NOT pushes
230 Realm::atomic<int> num_groups; // number of groups currently allocated
233 size_t pending_soft_limit; // try to stall traffic above this threshold
234 };
235
236 template <typename T, unsigned CHUNK_SIZE>
238 public:
241
243 void free_obj(T *obj);
244
245 protected:
246 // we'll store a pointer back to the chunk header just past each object
247 // each object needs enough space for a pointer back to the chunk header
248 struct Chunk;
249 struct WithPtr {
250 typedef char Storage_unaligned[sizeof(T)];
252 union {
253 Storage_aligned raw_storage;
254 uintptr_t nextptr;
255 };
257 };
263
265 uintptr_t free_head;
266 uintptr_t *free_tail;
270 };
271
272 struct PendingPutHeader;
273
275 protected:
276 // should not be directly allocated
277 template <typename T, unsigned CHUNK_SIZE>
278 friend class ChunkedRecycler;
281
282 public:
284 {
286 STRAT_SHORT_IMMEDIATE, // AM short, attempt immediate
287 STRAT_SHORT_PBUF, // AM short, deferred in pktbuf
288 STRAT_MEDIUM_IMMEDIATE, // AM medium, attempt immediate
289 STRAT_MEDIUM_PBUF, // AM medium, header/data in pktbuf
290 STRAT_MEDIUM_MALLOCSRC, // AM medium, malloc'd temp source (HACK)
291 STRAT_MEDIUM_PREP, // AM medium, using NPAM
298 };
302 unsigned short msgid;
310 };
311
312 // we'll keep separate transmit queues for each src/dst pair
313 // (i.e src_ep_index, dst_rank, dst_ep_index), hopefully avoiding any
314 // head of line blocking if networking resources are exhausted on a given
315 // path
317 public:
319 gex_rank_t _tgt_rank, gex_ep_index_t _tgt_ep_index);
321
322 // indicates whether any packets are pending, including those that
323 // have not been committed yet - useful for quiescence detection but
324 // also for ensuring new packets don't jump the queue
325 bool has_packets_queued() const;
326
327 // a packet that is sent immediately is counted as if it was
328 // reserved and then sent in rapid succession
330
331 // reserves space in a pbuf for an outbound packet (allocating and
332 // enqueuing a pbuf if needed)
333 bool reserve_pbuf_inline(size_t hdr_bytes, size_t payload_bytes, bool overflow_ok,
334 OutbufMetadata *&pktbuf, int &pktidx, void *&hdr_base,
335 void *&payload_base);
336 bool reserve_pbuf_long_rget(size_t hdr_bytes, bool overflow_ok,
337 OutbufMetadata *&pktbuf, int &pktidx, void *&hdr_base);
338 bool reserve_pbuf_put(bool overflow_ok, OutbufMetadata *&pktbuf, int &pktidx);
339 void commit_pbuf_inline(OutbufMetadata *pktbuf, int pktidx, const void *hdr_base,
340 gex_am_arg_t arg0, size_t act_payload_bytes);
341 void commit_pbuf_long(OutbufMetadata *pktbuf, int pktidx, const void *hdr_base,
342 gex_am_arg_t arg0, const void *payload_base,
343 size_t payload_bytes, uintptr_t dest_addr,
344 OutbufMetadata *databuf);
345 void commit_pbuf_rget(OutbufMetadata *pktbuf, int pktidx, const void *hdr_base,
346 gex_am_arg_t arg0, const void *payload_base,
347 size_t payload_bytes, uintptr_t dest_addr,
349 void commit_pbuf_put(OutbufMetadata *pktbuf, int pktidx, PendingPutHeader *put,
350 const void *payload_base, size_t payload_bytes,
351 uintptr_t dest_addr);
352 void cancel_pbuf(OutbufMetadata *pktbuf, int pktidx);
353
355
357
358 // adds the xpair to the injector ready list or the poller critical
359 // pair list as appropriate, eventually resulting in a call to
360 // push_packets - MUST NOT be called until the push_packets
361 // that resulted from the previous enqueue is done-ish (i.e. not going
362 // to push anything else)
363 void request_push(bool force_critical);
364
365 void push_packets(bool immediate_mode, TimeLimit work_until);
366
367 long long time_since_failure() const;
368
369 // cancels a pending push that was enqueued via request_push but never
370 // processed by push_packets - used during shutdown to balance the
371 // push_mutex_check lock
373
374 // used when cfg_am_limit is nonzero
376 void return_am_credits(int count);
377
383
385 const void *payload_base;
387 uintptr_t dest_addr;
388 union {
389 struct {
391 } l;
392 struct {
393 // rget needs to give both src and target ep index for data
395 } r;
396 };
397 };
398
399 struct PutMetadata {
400 const void *src_addr;
401 uintptr_t dest_addr;
404 };
405
406 protected:
407 friend class GASNetEXInternal;
408
409 bool reserve_pbuf_helper(size_t total_bytes, bool overflow_ok,
410 OutbufMetadata *&pktbuf, int &pktidx, uintptr_t &baseptr);
411 bool commit_pbuf_helper(OutbufMetadata *pktbuf, int pktidx, const void *hdr_base,
412 uintptr_t &baseptr);
413
420 // we don't hold the mutex while pushing packets, but we need definitely
421 // don't want multiple threads trying to push for the same src/dst pair
430 // circular queue of pending completion replys
433 atomic<unsigned> comp_reply_count; // read without mutex
435 // TODO: track packets in flight to avoid clogging?
436 atomic<int> am_credits; // available end-to-end AM credits for this peer
437 };
438
439 class XmitSrc {
440 public:
441 XmitSrc(GASNetEXInternal *_internal, gex_ep_index_t _src_ep_index);
443
445
446 protected:
447 friend class GASNetEXInternal;
448
451
452 // we'll allocate XmitSrcDestPair's on demand - atomics allow nonblocking
453 // lookup
455
456 // TODO: track in flight work at src level?
457 };
458
459 struct PendingReverseGet;
460
499
500 // an injector tries to send packets, but is not allowed to stall -
501 // all requests must use GEX_FLAG_IMMEDIATE and any failure results in
502 // handing the xpair off to the poller (which is allowed to block eventually)
504 public:
506
508
509 // drains any xpairs remaining in the ready queue, cancelling their
510 // pending pushes - called during shutdown
512
513 // Count of items in ready_xpairs plus 1 if a worker has popped an
514 // xpair and is currently inside push_packets (work_active). Used by
515 // GASNetEXInternal::sample_quiescence_state to feed
516 // QuiescenceState::queued_items; reporting a count rather than a
517 // boolean lets a draining queue surface as "progressing" across
518 // Mattern's rounds, and including work_active keeps an in-flight
519 // push_packets visible so the quiescence check doesn't fire DONE
520 // mid-push.
521 size_t queue_size();
522
523 virtual bool do_work(TimeLimit work_until);
524
525 protected:
528 atomic<bool> work_active; // set during do_work when xpairs are on stack
530 };
531
533 public:
535
538
540
541 // drains any xpairs remaining in the critical queue, cancelling their
542 // pending pushes - called during shutdown
544
546
547 // Count of items in critical_xpairs + pending_events plus 1 if a
548 // worker is currently inside do_work with items on its stack. See
549 // GASNetEXInjector::queue_size.
550 size_t queue_size();
551
552 virtual bool do_work(TimeLimit work_until);
553
554 // causes calling thread to wait for a full call to gasnet_AMPoll() to
555 // be performed by the poller
557
558 protected:
559 bool started = false;
562 atomic<bool> shutdown_flag; // set/cleared inside mutex, but tested outside
564 atomic<bool> pollwait_flag; // set/cleared inside mutex, but tested outside
566 atomic<bool> work_active; // set during do_work when items are on stack
569 };
570
572 public:
574
576
577 // Count of items in ready_events; returns 1 instead of 0 when
578 // has_work is set but ready_events has been swapped to a worker's
579 // local todo list. See GASNetEXInjector::queue_size.
580 size_t queue_size();
581
582 virtual bool do_work(TimeLimit work_until);
583
584 protected:
587 atomic<bool> has_work; // can be read without mutex
589 };
590
592 protected:
593 // should not be directly allocated
594 template <typename T, unsigned CHUNK_SIZE>
595 friend class ChunkedRecycler;
598
599 public:
603 static const size_t MAX_HDR_SIZE = 128;
604 size_t hdr_size;
605 unsigned char hdr_data[MAX_HDR_SIZE];
606 uintptr_t src_ptr, tgt_ptr;
611 };
612
613 // NOTE: ReverseGetter exists for now because we have to use RMAs instead
614 // of long AMs for transfers between segments bound to non-primordial
615 // endpoints (on the source and/or the target) - once GASNet supports
616 // AMs on all endpoints, this code should probably go away
617 class ReverseGetter;
618
620 protected:
621 // should not be directly allocated
622 template <typename T, unsigned CHUNK_SIZE>
623 friend class ChunkedRecycler;
626
627 public:
633 static const size_t MAX_HDR_SIZE = 128;
634 size_t hdr_size;
635 unsigned char hdr_data[MAX_HDR_SIZE];
636 uintptr_t src_ptr, tgt_ptr;
638 };
639
641 public:
643
644 void add_reverse_get(gex_rank_t srcrank, gex_ep_index_t src_ep_index,
645 gex_ep_index_t tgt_ep_index, gex_am_arg_t arg0, const void *hdr,
646 size_t hdr_bytes, uintptr_t src_ptr, uintptr_t tgt_ptr,
647 size_t payload_bytes);
648
649 // O(n) walk of the pending-rget list under the mutex. See
650 // GASNetEXInjector::queue_size.
651 size_t queue_size();
652
653 virtual bool do_work(TimeLimit work_until);
654
655 protected:
656 friend class GASNetEXEvent;
658
664 };
665
667 public:
669
671
672 bool init(int *argc, const char ***argv);
673 uintptr_t attach(size_t size);
674
675 bool attempt_binding(void *base, size_t size, NetworkSegmentInfo::MemoryType memtype,
677 gex_ep_index_t *ep_indexp);
679
680 void detach();
681
682 void get_shared_peers(Realm::NodeSet &shared_peers);
683 void barrier();
684 void broadcast(gex_rank_t root, const void *val_in, void *val_out, size_t bytes);
685 void gather(gex_rank_t root, const void *val_in, void *vals_out, size_t bytes);
686 void allgatherv(const char *val_in, size_t bytes, std::vector<char> &vals_out,
687 std::vector<size_t> &lengths);
688
690 void quiescence_allreduce_sum(const uint64_t *local_counts, uint64_t *total_counts,
691 size_t count);
692
695
696 size_t recommended_max_payload(gex_rank_t target, gex_ep_index_t target_ep_index,
697 bool with_congestion, size_t header_size,
698 uintptr_t dest_payload_addr);
699 size_t recommended_max_payload(gex_rank_t target, gex_ep_index_t target_ep_index,
700 const void *data, size_t bytes_per_line, size_t lines,
701 size_t line_stride, bool with_congestion,
702 size_t header_size, uintptr_t dest_payload_addr);
703 size_t recommended_max_payload(bool with_congestion, size_t header_size);
704
706 unsigned short msgid, void *&header_base,
707 size_t header_size, void *&payload_base,
708 size_t payload_size, uintptr_t dest_payload_addr);
709 void commit_message(PreparedMessage *msg, PendingCompletion *comp, void *header_base,
710 size_t header_size, void *payload_base, size_t payload_size);
712
713 gex_am_arg_t handle_short(gex_rank_t srcrank, gex_am_arg_t arg0, const void *hdr,
714 size_t hdr_bytes);
715 gex_am_arg_t handle_medium(gex_rank_t srcrank, gex_am_arg_t arg0, const void *hdr,
716 size_t hdr_bytes, const void *data, size_t data_bytes);
717 gex_am_arg_t handle_long(gex_rank_t srcrank, gex_am_arg_t arg0, const void *hdr,
718 size_t hdr_bytes, const void *data, size_t data_bytes);
719 void handle_reverse_get(gex_rank_t srcrank, gex_ep_index_t src_ep_index,
720 gex_ep_index_t tgt_ep_index, gex_am_arg_t arg0,
721 const void *hdr, size_t hdr_bytes, uintptr_t src_ptr,
722 uintptr_t tgt_ptr, size_t payload_bytes);
724 const void *data, size_t data_bytes, gex_am_arg_t *comps);
726 size_t nargs);
727
728 protected:
729 friend class ReverseGetter;
730 friend class XmitSrc;
731 friend class XmitSrcDestPair;
732 friend class GASNetEXEvent;
733 friend class GASNetEXPoller;
734 friend class GASNetEXCompleter;
735 friend class GASNetEXInjector;
736
737 // callbacks from IncomingMessageManager
738 static void short_message_complete(NodeID sender, uintptr_t objptr,
739 uintptr_t comp_info);
740 static void medium_message_complete(NodeID sender, uintptr_t objptr,
741 uintptr_t comp_info);
742 static void long_message_complete(NodeID sender, uintptr_t objptr,
743 uintptr_t comp_info);
744
746
747 GASNetEXModule *module;
750 // order in 'eps' should match GASNet's indexing
751 std::vector<gex_ep_opaque_t> eps;
756
764 struct SegmentInfoSorter;
765 // this list is sorted by address to enable quick address lookup
766 std::vector<SegmentInfo> segments_by_addr;
767
768 const SegmentInfo *find_segment(const void *srcptr) const;
769
770 std::vector<XmitSrc *> xmitsrcs;
771
778
779 // TODO: split counter into per-thread values to avoid contention?
781
782 // Monotonic count of items ever added to any of the four background-work
783 // queues (injector ready_xpairs, poller critical_xpairs/pending_events,
784 // completer ready_events, rgetter pending list). Sampled by
785 // sample_quiescence_state and reduced via SUM as
786 // QuiescenceState::events_added. Required because queued_items is a
787 // snapshot count that can be the same across rounds while items flow
788 // through (e.g., a put-completion event firing pops 1 from
789 // pending_events and adds 1 to ready_xpairs - net change 0 in
790 // queued_items, but real activity). Bumped at the same sites that call
791 // make_active() / push_back into a queue.
793
794 // manage a single open databuf for all endpoints
798
799 // allocator/managers for various objects we want to reuse
803 };
804
805}; // namespace Realm
806
807#endif
Definition bgwork.h:129
Definition gasnetex_internal.h:237
Mutex mutex
Definition gasnetex_internal.h:264
size_t max_alloc
Definition gasnetex_internal.h:269
atomic< size_t > cur_alloc
Definition gasnetex_internal.h:268
Chunk * chunks_head
Definition gasnetex_internal.h:267
uintptr_t free_head
Definition gasnetex_internal.h:265
size_t cur_capacity
Definition gasnetex_internal.h:269
uintptr_t * free_tail
Definition gasnetex_internal.h:266
static const size_t ALIGNMENT
Definition activemsg.h:199
Definition threads.h:428
Definition gasnetex_internal.h:571
GASNetEXCompleter(GASNetEXInternal *_internal)
void add_ready_events(GASNetEXEvent::EventList &newly_ready)
atomic< bool > has_work
Definition gasnetex_internal.h:587
Mutex mutex
Definition gasnetex_internal.h:586
GASNetEXInternal * internal
Definition gasnetex_internal.h:585
GASNetEXEvent::EventList ready_events
Definition gasnetex_internal.h:588
virtual bool do_work(TimeLimit work_until)
Definition gasnetex_internal.h:461
GASNetEXEvent & set_pktbuf(OutbufMetadata *_pktbuf)
GASNetEXEvent * leaf
Definition gasnetex_internal.h:497
~GASNetEXEvent()
Definition gasnetex_internal.h:467
REALM_PMTA_DEFN(GASNetEXEvent, IntrusiveListLink< GASNetEXEvent >, event_list_link)
GASNetEXEvent & set_leaf(GASNetEXEvent *_leaf)
GASNetEXEvent & set_put(PendingPutHeader *_put)
gex_ep_opaque_t event
Definition gasnetex_internal.h:491
PendingCompletion * local_comp
Definition gasnetex_internal.h:492
GASNetEXEvent & set_event(gex_event_opaque_t _event)
GASNetEXEvent & set_rget(PendingReverseGet *_rget)
GASNetEXEvent & set_databuf(OutbufMetadata *_databuf)
PendingPutHeader * put
Definition gasnetex_internal.h:496
IntrusiveListLink< GASNetEXEvent > event_list_link
Definition gasnetex_internal.h:484
OutbufMetadata * pktbuf
Definition gasnetex_internal.h:493
gex_event_opaque_t get_event() const
OutbufMetadata * databuf
Definition gasnetex_internal.h:494
void trigger(GASNetEXInternal *internal)
IntrusiveList< GASNetEXEvent, REALM_PMTA_USE(GASNetEXEvent, event_list_link), DummyLock > EventList
Definition gasnetex_internal.h:488
GASNetEXEvent & set_local_comp(PendingCompletion *_local_comp)
PendingReverseGet * rget
Definition gasnetex_internal.h:495
Definition gasnetex_internal.h:503
void add_ready_xpair(XmitSrcDestPair *xpair)
GASNetEXInjector(GASNetEXInternal *_internal)
GASNetEXInternal * internal
Definition gasnetex_internal.h:526
atomic< bool > work_active
Definition gasnetex_internal.h:528
virtual bool do_work(TimeLimit work_until)
XmitSrcDestPair::XmitPairList ready_xpairs
Definition gasnetex_internal.h:529
Mutex mutex
Definition gasnetex_internal.h:527
Definition gasnetex_internal.h:666
GASNetEXCompleter completer
Definition gasnetex_internal.h:774
std::vector< XmitSrc * > xmitsrcs
Definition gasnetex_internal.h:770
atomic< uint64_t > total_packets_received
Definition gasnetex_internal.h:780
size_t recommended_max_payload(bool with_congestion, size_t header_size)
gex_rank_t prim_rank
Definition gasnetex_internal.h:753
gex_callback_handle_t gex_callback_handle
Definition gasnetex_internal.h:797
PreparedMessage * prepare_message(gex_rank_t target, gex_ep_index_t target_ep_index, unsigned short msgid, void *&header_base, size_t header_size, void *&payload_base, size_t payload_size, uintptr_t dest_payload_addr)
static void long_message_complete(NodeID sender, uintptr_t objptr, uintptr_t comp_info)
OutbufMetadata * databuf_md
Definition gasnetex_internal.h:796
size_t recommended_max_payload(gex_rank_t target, gex_ep_index_t target_ep_index, bool with_congestion, size_t header_size, uintptr_t dest_payload_addr)
GASNetEXPoller poller
Definition gasnetex_internal.h:772
void sample_quiescence_state(NetworkModule::QuiescenceState &state)
Mutex databuf_mutex
Definition gasnetex_internal.h:795
PendingCompletionManager compmgr
Definition gasnetex_internal.h:776
bool init(int *argc, const char ***argv)
void cancel_message(PreparedMessage *msg)
GASNetEXModule *RuntimeImpl * runtime
Definition gasnetex_internal.h:748
gex_tm_opaque_t prim_tm
Definition gasnetex_internal.h:752
uintptr_t attach(size_t size)
OutbufManager obmgr
Definition gasnetex_internal.h:777
size_t recommended_max_payload(gex_rank_t target, gex_ep_index_t target_ep_index, const void *data, size_t bytes_per_line, size_t lines, size_t line_stride, bool with_congestion, size_t header_size, uintptr_t dest_payload_addr)
const SegmentInfo * find_segment(const void *srcptr) const
size_t handle_batch(gex_rank_t srcrank, gex_am_arg_t arg0, gex_am_arg_t cksum, const void *data, size_t data_bytes, gex_am_arg_t *comps)
static void medium_message_complete(NodeID sender, uintptr_t objptr, uintptr_t comp_info)
PendingCompletion * early_local_completion(PendingCompletion *comp)
GASNetEXInternal(GASNetEXModule *_module, RuntimeImpl *_runtime)
std::vector< gex_ep_opaque_t > eps
Definition gasnetex_internal.h:751
PendingCompletion * get_available_comp()
gex_client_opaque_t client
Definition gasnetex_internal.h:749
ChunkedRecycler< PendingPutHeader, 32 > put_alloc
Definition gasnetex_internal.h:802
static void short_message_complete(NodeID sender, uintptr_t objptr, uintptr_t comp_info)
void get_shared_peers(Realm::NodeSet &shared_peers)
ReverseGetter rgetter
Definition gasnetex_internal.h:775
size_t prim_segsize
Definition gasnetex_internal.h:755
gex_am_arg_t handle_short(gex_rank_t srcrank, gex_am_arg_t arg0, const void *hdr, size_t hdr_bytes)
ChunkedRecycler< PreparedMessage, 32 > prep_alloc
Definition gasnetex_internal.h:801
void handle_completion_reply(gex_rank_t srcrank, const gex_am_arg_t *args, size_t nargs)
void commit_message(PreparedMessage *msg, PendingCompletion *comp, void *header_base, size_t header_size, void *payload_base, size_t payload_size)
gex_am_arg_t handle_medium(gex_rank_t srcrank, gex_am_arg_t arg0, const void *hdr, size_t hdr_bytes, const void *data, size_t data_bytes)
gex_am_arg_t handle_long(gex_rank_t srcrank, gex_am_arg_t arg0, const void *hdr, size_t hdr_bytes, const void *data, size_t data_bytes)
void allgatherv(const char *val_in, size_t bytes, std::vector< char > &vals_out, std::vector< size_t > &lengths)
void broadcast(gex_rank_t root, const void *val_in, void *val_out, size_t bytes)
GASNetEXInjector injector
Definition gasnetex_internal.h:773
void gather(gex_rank_t root, const void *val_in, void *vals_out, size_t bytes)
ChunkedRecycler< GASNetEXEvent, 64 > event_alloc
Definition gasnetex_internal.h:800
atomic< uint64_t > total_events_added
Definition gasnetex_internal.h:792
void quiescence_allreduce_sum(const uint64_t *local_counts, uint64_t *total_counts, size_t count)
gex_segment_opaque_t prim_segment
Definition gasnetex_internal.h:754
gex_rank_t prim_size
Definition gasnetex_internal.h:753
PendingCompletion * extract_arg0_local_comp(gex_am_arg_t &arg0)
void handle_reverse_get(gex_rank_t srcrank, gex_ep_index_t src_ep_index, gex_ep_index_t tgt_ep_index, gex_am_arg_t arg0, const void *hdr, size_t hdr_bytes, uintptr_t src_ptr, uintptr_t tgt_ptr, size_t payload_bytes)
std::vector< SegmentInfo > segments_by_addr
Definition gasnetex_internal.h:766
bool attempt_binding(void *base, size_t size, NetworkSegmentInfo::MemoryType memtype, NetworkSegmentInfo::MemoryTypeExtraData memextra, gex_ep_index_t *ep_indexp)
Definition gasnetex_module.h:29
Definition gasnetex_internal.h:532
GASNetEXPoller(GASNetEXInternal *_internal)
GASNetEXEvent::EventList pending_events
Definition gasnetex_internal.h:568
void add_pending_event(GASNetEXEvent *event)
virtual bool do_work(TimeLimit work_until)
Mutex mutex
Definition gasnetex_internal.h:561
Mutex::CondVar pollwait_cond
Definition gasnetex_internal.h:565
XmitSrcDestPair::XmitPairList critical_xpairs
Definition gasnetex_internal.h:567
void add_critical_xpair(XmitSrcDestPair *xpair)
atomic< bool > shutdown_flag
Definition gasnetex_internal.h:562
Mutex::CondVar shutdown_cond
Definition gasnetex_internal.h:563
bool started
Definition gasnetex_internal.h:559
GASNetEXInternal * internal
Definition gasnetex_internal.h:560
atomic< bool > work_active
Definition gasnetex_internal.h:566
atomic< bool > pollwait_flag
Definition gasnetex_internal.h:564
Definition lists.h:66
Definition mutex.h:80
Definition nodeset.h:117
Definition gasnetex_internal.h:127
OutbufMetadata * reserved_head
Definition gasnetex_internal.h:160
void init(size_t _outbuf_count, size_t _outbuf_size, uintptr_t _baseptr)
size_t num_endpoints
Definition gasnetex_internal.h:157
size_t outbuf_size
Definition gasnetex_internal.h:142
OutbufMetadata * overflow_head
Definition gasnetex_internal.h:158
OutbufMetadata * metadatas
Definition gasnetex_internal.h:141
OutbufMetadata * first_available
Definition gasnetex_internal.h:144
size_t num_overflow
Definition gasnetex_internal.h:148
OutbufMetadata ** overflow_tail
Definition gasnetex_internal.h:159
OutbufMetadata * alloc_outbuf(OutbufMetadata::State state, bool overflow_ok, bool new_endpoint)
void free_outbuf(OutbufMetadata *md)
virtual bool do_work(TimeLimit work_until)
size_t num_buffers
Definition gasnetex_internal.h:157
Mutex mutex
Definition gasnetex_internal.h:143
size_t num_reserved
Definition gasnetex_internal.h:148
Definition gasnetex_internal.h:51
OutbufManager * manager
Definition gasnetex_internal.h:89
bool is_overflow
Definition gasnetex_internal.h:94
size_t pktbuf_rsrv_offset
Definition gasnetex_internal.h:102
static const int MAX_PACKETS
Definition gasnetex_internal.h:75
bool pktbuf_reserve(size_t bytes, int &pktidx, uintptr_t &offset)
atomic< int > remain_count
Definition gasnetex_internal.h:98
State state
Definition gasnetex_internal.h:88
atomic< OutbufMetadata * > realbuf
Definition gasnetex_internal.h:96
OutbufMetadata * next_overflow
Definition gasnetex_internal.h:95
size_t pktbuf_sent_offset
Definition gasnetex_internal.h:111
atomic< int > pktbuf_total_packets
Definition gasnetex_internal.h:101
int pktbuf_use_count
Definition gasnetex_internal.h:112
PktType
Definition gasnetex_internal.h:64
@ PKTTYPE_LONG
Definition gasnetex_internal.h:68
@ PKTTYPE_RGET
Definition gasnetex_internal.h:69
@ PKTTYPE_INLINE
Definition gasnetex_internal.h:66
@ PKTTYPE_COPY_IN_PROGRESS
Definition gasnetex_internal.h:72
@ PKTTYPE_PUT
Definition gasnetex_internal.h:70
@ PKTTYPE_INVALID
Definition gasnetex_internal.h:65
@ PKTTYPE_INLINE_SHORT
Definition gasnetex_internal.h:67
@ PKTTYPE_CANCELLED
Definition gasnetex_internal.h:71
void set_state(State new_state)
bool pktbuf_commit(int pktidx, PktType pkttype, bool update_realbuf)
size_t size
Definition gasnetex_internal.h:92
atomic< PktType > pktbuf_pkt_types[MAX_PACKETS]
Definition gasnetex_internal.h:106
OutbufMetadata * nextbuf
Definition gasnetex_internal.h:90
uintptr_t pktbuf_get_offset(int pktidx)
int pktbuf_sent_packets
Definition gasnetex_internal.h:110
size_t pktbuf_pkt_ends[MAX_PACKETS]
Definition gasnetex_internal.h:103
State
Definition gasnetex_internal.h:56
@ STATE_PKTBUF
Definition gasnetex_internal.h:58
@ STATE_IDLE
Definition gasnetex_internal.h:57
atomic< int > pktbuf_ready_packets
Definition gasnetex_internal.h:107
uintptr_t baseptr
Definition gasnetex_internal.h:91
Definition gasnetex_internal.h:115
OutbufMetadata * md
Definition gasnetex_internal.h:124
OutbufUsecountDec(OutbufMetadata *_md)
Definition gasnetex_internal.h:117
void operator()() const
Definition gasnetex_internal.h:121
Definition gasnetex_internal.h:207
void invoke_completions(PendingCompletion *comp, bool do_local, bool do_remote)
PendingCompletion * get_available()
Realm::atomic< PendingCompletionGroup * > groups[1<< LOG2_MAXGROUPS]
Definition gasnetex_internal.h:231
size_t pending_soft_limit
Definition gasnetex_internal.h:233
Realm::atomic< PendingCompletion * > first_free
Definition gasnetex_internal.h:229
PendingCompletion * lookup_completion(int index)
Realm::Mutex mutex
Definition gasnetex_internal.h:228
void recycle_comp(PendingCompletion *comp)
Realm::atomic< int > num_groups
Definition gasnetex_internal.h:230
atomic< size_t > num_pending
Definition gasnetex_internal.h:232
static const size_t LOG2_MAXGROUPS
Definition gasnetex_internal.h:225
bool over_pending_completion_soft_limit() const
Definition gasnetex_internal.h:165
REALM_ALIGNED_TYPE_CONST(Storage_aligned, Storage_unaligned, Realm::CompletionCallbackBase::ALIGNMENT)
void * add_local_completion(size_t bytes, bool late_ok=false)
int index
Definition gasnetex_internal.h:183
Storage_aligned storage
Definition gasnetex_internal.h:198
PendingCompletionManager * manager
Definition gasnetex_internal.h:185
static const size_t TOTAL_CAPACITY
Definition gasnetex_internal.h:194
char Storage_unaligned[TOTAL_CAPACITY]
Definition gasnetex_internal.h:195
static const unsigned LOCAL_PENDING_BIT
Definition gasnetex_internal.h:187
size_t remote_bytes
Definition gasnetex_internal.h:192
void * add_remote_completion(size_t bytes)
static const unsigned REMOTE_PENDING_BIT
Definition gasnetex_internal.h:188
Realm::atomic< unsigned > remote_left
Definition gasnetex_internal.h:191
Realm::atomic< unsigned > local_left
Definition gasnetex_internal.h:191
static const unsigned READY_BIT
Definition gasnetex_internal.h:189
Realm::atomic< unsigned > state
Definition gasnetex_internal.h:190
size_t local_bytes
Definition gasnetex_internal.h:192
PendingCompletion * next_free
Definition gasnetex_internal.h:184
bool mark_ready(unsigned exp_local, unsigned exp_remote)
Definition gasnetex_internal.h:640
void add_reverse_get(gex_rank_t srcrank, gex_ep_index_t src_ep_index, gex_ep_index_t tgt_ep_index, gex_am_arg_t arg0, const void *hdr, size_t hdr_bytes, uintptr_t src_ptr, uintptr_t tgt_ptr, size_t payload_bytes)
GASNetEXInternal * internal
Definition gasnetex_internal.h:659
PendingReverseGet ** tailp
Definition gasnetex_internal.h:662
Mutex mutex
Definition gasnetex_internal.h:660
ChunkedRecycler< PendingReverseGet, 8 > rget_alloc
Definition gasnetex_internal.h:663
PendingReverseGet * head
Definition gasnetex_internal.h:661
virtual bool do_work(TimeLimit work_until)
void reverse_get_complete(PendingReverseGet *rget)
ReverseGetter(GASNetEXInternal *_internal)
Definition runtime_impl.h:267
Definition timers.h:129
Definition mutex.h:325
Definition mutex.h:223
Definition gasnetex_internal.h:316
IntrusiveListLink< XmitSrcDestPair > xpair_list_link
Definition gasnetex_internal.h:378
OutbufMetadata * cur_pbuf
Definition gasnetex_internal.h:424
void commit_pbuf_inline(OutbufMetadata *pktbuf, int pktidx, const void *hdr_base, gex_am_arg_t arg0, size_t act_payload_bytes)
bool commit_pbuf_helper(OutbufMetadata *pktbuf, int pktidx, const void *hdr_base, uintptr_t &baseptr)
void enqueue_put_header(PendingPutHeader *put)
atomic< unsigned > comp_reply_count
Definition gasnetex_internal.h:433
unsigned comp_reply_capacity
Definition gasnetex_internal.h:434
void commit_pbuf_put(OutbufMetadata *pktbuf, int pktidx, PendingPutHeader *put, const void *payload_base, size_t payload_bytes, uintptr_t dest_addr)
atomic< OutbufMetadata * > first_pbuf
Definition gasnetex_internal.h:423
GASNetEXInternal * internal
Definition gasnetex_internal.h:414
void request_push(bool force_critical)
bool reserve_pbuf_put(bool overflow_ok, OutbufMetadata *&pktbuf, int &pktidx)
unsigned comp_reply_wrptr
Definition gasnetex_internal.h:432
IntrusiveList< XmitSrcDestPair, REALM_PMTA_USE(XmitSrcDestPair, xpair_list_link), DummyLock > XmitPairList
Definition gasnetex_internal.h:382
bool has_packets_queued() const
gex_ep_index_t src_ep_index
Definition gasnetex_internal.h:415
atomic< size_t > packets_reserved
Definition gasnetex_internal.h:418
REALM_PMTA_DEFN(XmitSrcDestPair, IntrusiveListLink< XmitSrcDestPair >, xpair_list_link)
Mutex mutex
Definition gasnetex_internal.h:419
long long time_since_failure() const
atomic< int > am_credits
Definition gasnetex_internal.h:436
atomic< unsigned > imm_fail_count
Definition gasnetex_internal.h:425
gex_am_arg_t * comp_reply_data
Definition gasnetex_internal.h:431
long long first_fail_time
Definition gasnetex_internal.h:427
void return_am_credits(int count)
atomic< size_t > packets_sent
Definition gasnetex_internal.h:418
bool reserve_pbuf_long_rget(size_t hdr_bytes, bool overflow_ok, OutbufMetadata *&pktbuf, int &pktidx, void *&hdr_base)
atomic< PendingPutHeader * > put_head
Definition gasnetex_internal.h:428
unsigned comp_reply_rdptr
Definition gasnetex_internal.h:432
void commit_pbuf_rget(OutbufMetadata *pktbuf, int pktidx, const void *hdr_base, gex_am_arg_t arg0, const void *payload_base, size_t payload_bytes, uintptr_t dest_addr, gex_ep_index_t src_ep_index, gex_ep_index_t tgt_ep_index)
void enqueue_completion_reply(gex_am_arg_t comp_info)
MutexChecker push_mutex_check
Definition gasnetex_internal.h:422
void commit_pbuf_long(OutbufMetadata *pktbuf, int pktidx, const void *hdr_base, gex_am_arg_t arg0, const void *payload_base, size_t payload_bytes, uintptr_t dest_addr, OutbufMetadata *databuf)
bool reserve_pbuf_helper(size_t total_bytes, bool overflow_ok, OutbufMetadata *&pktbuf, int &pktidx, uintptr_t &baseptr)
gex_rank_t tgt_rank
Definition gasnetex_internal.h:416
atomic< PendingPutHeader * > * put_tailp
Definition gasnetex_internal.h:429
void cancel_pbuf(OutbufMetadata *pktbuf, int pktidx)
gex_ep_index_t tgt_ep_index
Definition gasnetex_internal.h:417
void push_packets(bool immediate_mode, TimeLimit work_until)
bool has_ready_packets
Definition gasnetex_internal.h:426
XmitSrcDestPair(GASNetEXInternal *_internal, gex_ep_index_t _src_ep_index, gex_rank_t _tgt_rank, gex_ep_index_t _tgt_ep_index)
bool reserve_pbuf_inline(size_t hdr_bytes, size_t payload_bytes, bool overflow_ok, OutbufMetadata *&pktbuf, int &pktidx, void *&hdr_base, void *&payload_base)
Definition gasnetex_internal.h:439
XmitSrc(GASNetEXInternal *_internal, gex_ep_index_t _src_ep_index)
XmitSrcDestPair * lookup_pair(gex_rank_t tgt_rank, gex_ep_index_t tgt_ep_index)
gex_ep_index_t src_ep_index
Definition gasnetex_internal.h:450
atomic< XmitSrcDestPair * > * pairs
Definition gasnetex_internal.h:454
GASNetEXInternal * internal
Definition gasnetex_internal.h:449
Definition atomics.h:31
void * gex_tm_opaque_t
Definition gasnetex_wrapper.h:38
void * gex_event_opaque_t
Definition gasnetex_wrapper.h:42
int32_t gex_am_arg_t
Definition gasnetex_wrapper.h:33
uint16_t gex_ep_index_t
Definition gasnetex_wrapper.h:30
void * gex_am_src_desc_opaque_t
Definition gasnetex_wrapper.h:43
uint32_t gex_rank_t
Definition gasnetex_wrapper.h:29
void * gex_segment_opaque_t
Definition gasnetex_wrapper.h:39
void * gex_ep_opaque_t
Definition gasnetex_wrapper.h:37
void * gex_client_opaque_t
Definition gasnetex_wrapper.h:36
#define REALM_PMTA_USE(structtype, name)
Definition lists.h:42
unsigned MemoryType
Definition network.h:391
uintptr_t MemoryTypeExtraData
Definition network.h:394
Definition activemsg.h:42
int NodeID
Definition nodeset.h:40
gex_wrapper_handle_t gex_wrapper_handle
Definition gasnetex_internal.h:258
Chunk * next_chunk
Definition gasnetex_internal.h:260
atomic< unsigned > remaining_count
Definition gasnetex_internal.h:259
WithPtr elements[CHUNK_SIZE]
Definition gasnetex_internal.h:261
Definition gasnetex_internal.h:249
Storage_aligned raw_storage
Definition gasnetex_internal.h:253
Chunk * backptr
Definition gasnetex_internal.h:256
REALM_ALIGNED_TYPE_SAMEAS(Storage_aligned, Storage_unaligned, T)
char Storage_unaligned[sizeof(T)]
Definition gasnetex_internal.h:250
uintptr_t nextptr
Definition gasnetex_internal.h:254
Definition gasnetex_internal.h:757
uintptr_t base
Definition gasnetex_internal.h:758
NetworkSegmentInfo::MemoryTypeExtraData memextra
Definition gasnetex_internal.h:762
gex_segment_opaque_t segment
Definition gasnetex_internal.h:760
uintptr_t limit
Definition gasnetex_internal.h:758
NetworkSegmentInfo::MemoryType memtype
Definition gasnetex_internal.h:761
gex_ep_index_t ep_index
Definition gasnetex_internal.h:759
Definition gasnetex_internal.h:44
gex_ep_index_t ep_index
Definition gasnetex_internal.h:46
uintptr_t base
Definition gasnetex_internal.h:45
Definition gasnetex_internal.h:201
static const size_t LOG2_GROUPSIZE
Definition gasnetex_internal.h:202
PendingCompletion entries[1<< LOG2_GROUPSIZE]
Definition gasnetex_internal.h:204
Definition gasnetex_internal.h:591
gex_ep_index_t src_ep_index
Definition gasnetex_internal.h:601
PendingPutHeader()
Definition gasnetex_internal.h:596
uintptr_t tgt_ptr
Definition gasnetex_internal.h:606
gex_ep_index_t tgt_ep_index
Definition gasnetex_internal.h:601
gex_am_arg_t arg0
Definition gasnetex_internal.h:602
~PendingPutHeader()
Definition gasnetex_internal.h:597
size_t payload_bytes
Definition gasnetex_internal.h:607
static const size_t MAX_HDR_SIZE
Definition gasnetex_internal.h:603
size_t hdr_size
Definition gasnetex_internal.h:604
atomic< PendingPutHeader * > next_put
Definition gasnetex_internal.h:610
XmitSrcDestPair * xpair
Definition gasnetex_internal.h:609
unsigned char hdr_data[MAX_HDR_SIZE]
Definition gasnetex_internal.h:605
uintptr_t src_ptr
Definition gasnetex_internal.h:606
gex_rank_t target
Definition gasnetex_internal.h:600
PendingCompletion * local_comp
Definition gasnetex_internal.h:608
Definition gasnetex_internal.h:619
ReverseGetter * rgetter
Definition gasnetex_internal.h:628
unsigned char hdr_data[MAX_HDR_SIZE]
Definition gasnetex_internal.h:635
PendingReverseGet()
Definition gasnetex_internal.h:624
static const size_t MAX_HDR_SIZE
Definition gasnetex_internal.h:633
gex_am_arg_t arg0
Definition gasnetex_internal.h:632
~PendingReverseGet()
Definition gasnetex_internal.h:625
gex_ep_index_t tgt_ep_index
Definition gasnetex_internal.h:631
size_t payload_bytes
Definition gasnetex_internal.h:637
size_t hdr_size
Definition gasnetex_internal.h:634
gex_ep_index_t src_ep_index
Definition gasnetex_internal.h:631
uintptr_t tgt_ptr
Definition gasnetex_internal.h:636
gex_rank_t srcrank
Definition gasnetex_internal.h:630
PendingReverseGet * next_rget
Definition gasnetex_internal.h:629
uintptr_t src_ptr
Definition gasnetex_internal.h:636
Definition gasnetex_internal.h:274
gex_ep_index_t source_ep_index
Definition gasnetex_internal.h:301
PreparedMessage()
Definition gasnetex_internal.h:279
PendingPutHeader * put
Definition gasnetex_internal.h:309
OutbufMetadata * databuf
Definition gasnetex_internal.h:305
unsigned short msgid
Definition gasnetex_internal.h:302
void * temp_buffer
Definition gasnetex_internal.h:304
gex_am_src_desc_opaque_t srcdesc
Definition gasnetex_internal.h:308
Strategy
Definition gasnetex_internal.h:284
@ STRAT_MEDIUM_IMMEDIATE
Definition gasnetex_internal.h:288
@ STRAT_RGET_IMMEDIATE
Definition gasnetex_internal.h:294
@ STRAT_SHORT_PBUF
Definition gasnetex_internal.h:287
@ STRAT_PUT_PBUF
Definition gasnetex_internal.h:297
@ STRAT_LONG_IMMEDIATE
Definition gasnetex_internal.h:292
@ STRAT_LONG_PBUF
Definition gasnetex_internal.h:293
@ STRAT_SHORT_IMMEDIATE
Definition gasnetex_internal.h:286
@ STRAT_MEDIUM_PREP
Definition gasnetex_internal.h:291
@ STRAT_RGET_PBUF
Definition gasnetex_internal.h:295
@ STRAT_MEDIUM_MALLOCSRC
Definition gasnetex_internal.h:290
@ STRAT_MEDIUM_PBUF
Definition gasnetex_internal.h:289
@ STRAT_PUT_IMMEDIATE
Definition gasnetex_internal.h:296
@ STRAT_UNKNOWN
Definition gasnetex_internal.h:285
gex_ep_index_t target_ep_index
Definition gasnetex_internal.h:301
OutbufMetadata * pktbuf
Definition gasnetex_internal.h:306
Strategy strategy
Definition gasnetex_internal.h:299
uintptr_t dest_payload_addr
Definition gasnetex_internal.h:303
int pktidx
Definition gasnetex_internal.h:307
~PreparedMessage()
Definition gasnetex_internal.h:280
gex_rank_t target
Definition gasnetex_internal.h:300
Definition gasnetex_internal.h:384
struct Realm::XmitSrcDestPair::LongRgetData::@12::@14 l
struct Realm::XmitSrcDestPair::LongRgetData::@12::@15 r
size_t payload_bytes
Definition gasnetex_internal.h:386
OutbufMetadata * databuf
Definition gasnetex_internal.h:390
const void * payload_base
Definition gasnetex_internal.h:385
gex_ep_index_t src_ep_index
Definition gasnetex_internal.h:394
gex_ep_index_t tgt_ep_index
Definition gasnetex_internal.h:394
uintptr_t dest_addr
Definition gasnetex_internal.h:387
Definition gasnetex_internal.h:399
const void * src_addr
Definition gasnetex_internal.h:400
uintptr_t dest_addr
Definition gasnetex_internal.h:401
size_t payload_bytes
Definition gasnetex_internal.h:402
PendingPutHeader * put
Definition gasnetex_internal.h:403
Definition gasnetex_wrapper.h:251
Handle structure that contains the full API for the wrapper.
Definition gasnetex_wrapper.h:77
unsigned short msgid
Definition ucp_internal.h:2