Realm
A distributed, event-based tasking library
Loading...
Searching...
No Matches
transfer.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// data transfer (a.k.a. dma) engine for Realm
19
20#ifndef REALM_TRANSFER_H
21#define REALM_TRANSFER_H
22
23#include "realm/bgwork.h"
24#include "realm/event.h"
25#include "realm/memory.h"
26#include "realm/indexspace.h"
27#include "realm/inst_impl.h"
28#include "realm/atomics.h"
29#include "realm/network.h"
30#include "realm/operation.h"
33#include "realm/profiling.h"
34
35#include <optional>
36
37namespace Realm {
38
39 // the data transfer engine has too much code to have it all be templated on the
40 // type of IndexSpace that is driving the transfer, so we need a widget that
41 // can hold an arbitrary IndexSpace and dispatch based on its type
42
43 struct Node;
44 class XferDes;
45 class AddressList;
46
48 public:
49 template <typename S>
50 static TransferIterator *deserialize_new(S &deserializer);
51
52 virtual ~TransferIterator(void);
53
54 // must be called (and waited on) before iteration is possible
55 virtual Event request_metadata(void);
56
57 // specify the xd port used for indirect address flow control, if any
58 virtual void set_indirect_input_port(XferDes *xd, int port_idx,
59 TransferIterator *inner_iter);
60
61 virtual void reset(void) = 0;
62 virtual bool done(void) = 0;
63 virtual size_t get_base_offset(void) const;
64 virtual size_t get_address_size(void) const;
65
66 // flag bits to control iterators
67 enum
68 {
69 SRC_PARTIAL_OK = (1 << 0),
70 SRC_LINES_OK = (1 << 1),
71 SRC_PLANES_OK = (1 << 2),
73
74 DST_PARTIAL_OK = (1 << 8),
75 DST_LINES_OK = (1 << 9),
76 DST_PLANES_OK = (1 << 10),
77 DST_FLAGMASK = 0xff00,
78
82 };
83
84 struct AddressInfo {
86 size_t bytes_per_chunk; // multiple of sizeof(T) unless PARTIAL_OK
87 size_t num_lines; // guaranteed to be 1 unless LINES_OK (i.e. 2D)
89 size_t num_planes; // guaranteed to be 1 unless PLANES_OK (i.e. 3D)
91 };
92
93 // a custom address info interface for cases where linearized
94 // addresses are not suitable
96 protected:
97 virtual ~AddressInfoCustom() {}
98
99 public:
100 // offers an N-D rectangle from a given piece of a given instance,
101 // along with a specified dimension order
102 // return value is how many dimensions are accepted (0 = single
103 // point), which can be less than the input if the target has
104 // strict ordering rules
105 virtual int set_rect(const RegionInstanceImpl *inst,
106 const InstanceLayoutPieceBase *piece, size_t field_size,
107 size_t field_offset, int ndims, const int64_t lo[/*ndims*/],
108 const int64_t hi[/*ndims*/], const int order[/*ndims*/]) = 0;
109 };
110
111 // if a step is tentative, it must either be confirmed or cancelled before
112 // another one is possible
113 virtual size_t step(size_t max_bytes, AddressInfo &info, unsigned flags,
114 bool tentative = false) = 0;
115 virtual size_t step_custom(size_t max_bytes, AddressInfoCustom &info,
116 bool tentative = false) = 0;
117
118 virtual void confirm_step(void) = 0;
119 virtual void cancel_step(void) = 0;
120
121 virtual bool get_addresses(AddressList &addrlist,
122 const InstanceLayoutPieceBase *&nonaffine) = 0;
123 };
124
126 //
127 // class TransferIteratorBase<N,T>
128 //
129
130 template <int N, typename T>
132 protected:
133 TransferIteratorBase(void); // used by deserializer
134 public:
135 TransferIteratorBase(RegionInstanceImpl *_inst_impl, const int _dim_order[N]);
136
137 virtual Event request_metadata(void);
138
139 virtual void reset(void);
140 virtual bool done(void);
141 virtual size_t step(size_t max_bytes, AddressInfo &info, unsigned flags,
142 bool tentative = false);
143 virtual size_t step_custom(size_t max_bytes, AddressInfoCustom &info,
144 bool tentative = false);
145
146 virtual void confirm_step(void);
147 virtual void cancel_step(void);
148
149 virtual size_t get_base_offset(void) const;
150
151 virtual bool get_addresses(AddressList &addrlist,
152 const InstanceLayoutPieceBase *&nonaffine);
153
154 protected:
155 virtual bool get_next_rect(Rect<N, T> &r, FieldID &fid, size_t &offset,
156 size_t &fsize) = 0;
157
163 bool carry;
164
166 // InstanceLayout<N, T> *inst_layout;
169 int dim_order[N];
170 };
171
173 //
174 // class TransferIteratorIndexSpace<N,T>
175 //
176
177 template <int N, typename T>
179 protected:
180 TransferIteratorIndexSpace(void); // used by deserializer
181 public:
182 TransferIteratorIndexSpace(const int _dim_order[N],
183 const std::vector<FieldID> &_fields,
184 const std::vector<size_t> &_fld_offsets,
185 const std::vector<size_t> &_fld_sizes,
186 RegionInstanceImpl *_inst_impl,
187 const IndexSpace<N, T> &_is);
188
189 TransferIteratorIndexSpace(const int _dim_order[N],
190 const std::vector<FieldID> &_fields,
191 const std::vector<size_t> &_fld_offsets,
192 const std::vector<size_t> &_fld_sizes,
193 RegionInstanceImpl *_inst_impl, const Rect<N, T> &_bounds,
194 SparsityMapImpl<N, T> *_sparsity_impl);
195
196 template <typename S>
197 static TransferIterator *deserialize_new(S &deserializer);
198
200
201 virtual Event request_metadata(void);
202
203 virtual void reset(void);
204
208
209 template <typename S>
210 bool serialize(S &serializer) const;
211
212 protected:
213 void reset_internal(void);
214 virtual bool get_next_rect(Rect<N, T> &r, FieldID &fid, size_t &offset,
215 size_t &fsize);
216
221 std::vector<FieldID> fields;
222 std::vector<size_t> fld_offsets, fld_sizes;
223 size_t field_idx{0};
224 };
225
227 //
228 // class IDIndexedFieldsIterator<N,T>
229 //
230
231 template <int N, typename T>
233 protected:
235
236 public:
237 IDIndexedFieldsIterator(const int _dim_order[N], const std::vector<FieldID> &_fields,
238 size_t _field_size, RegionInstanceImpl *_inst_impl,
239 const IndexSpace<N, T> &_is, ReplicatedHeap *_repl_heap);
240
241 template <typename S>
242 static TransferIterator *deserialize_new(S &deserializer);
243
245
246 Event request_metadata(void) override;
247 void reset(void) override;
248
252
253 template <typename S>
254 bool serialize(S &serializer) const;
255
257 const InstanceLayoutPieceBase *&nonaffine) override;
258
259 size_t step(size_t max_bytes, TransferIterator::AddressInfo &info, unsigned flags,
260 bool tentative = false) override;
261 size_t step_custom(size_t max_bytes, TransferIterator::AddressInfoCustom &info,
262 bool tentative = false) override;
263 void confirm_step(void) override;
264 void cancel_step(void) override;
265
266 protected:
267 void reset_internal(void);
268
269 bool get_next_rect(Rect<N, T> &r, FieldID &fid, size_t &offset,
270 size_t &fsize) override;
271
276 std::vector<FieldID> fields;
277
278 // const InstanceLayoutPiece<N, T> *layout_piece{nullptr};
280
281 size_t field_size{0};
282 size_t rect_idx{0};
283
286 };
287
288 template <int N, typename T>
290 protected:
291 TransferIteratorIndirect(void); // used by deserializer
292 public:
294 const std::vector<FieldID> &_fields,
295 const std::vector<size_t> &_fld_offsets,
296 const std::vector<size_t> &_fld_sizes);
297
298 template <typename S>
299 static TransferIterator *deserialize_new(S &deserializer);
300
302
303 virtual Event request_metadata(void);
304
305 // specify the xd port used for indirect address flow control, if any
306 virtual void set_indirect_input_port(XferDes *xd, int port_idx,
307 TransferIterator *inner_iter);
308 virtual void reset(void);
309
313
314 template <typename S>
315 bool serialize(S &serializer) const;
316
317 protected:
318 virtual bool get_next_rect(Rect<N, T> &r, FieldID &fid, size_t &offset,
319 size_t &fsize);
320
323 intptr_t addrs_mem_base{0};
324 bool can_merge{true};
325 static constexpr size_t MAX_POINTS = 64;
327 size_t point_pos{0}, num_points{0};
328 std::vector<FieldID> fields;
329 std::vector<size_t> fld_offsets, fld_sizes;
332 };
333
335 protected:
337
338 public:
339 template <typename S>
340 static TransferDomain *deserialize_new(S &deserializer);
341
342 template <int N, typename T>
344
345 virtual TransferDomain *clone(void) const = 0;
346
347 virtual ~TransferDomain(void);
348
349 virtual Event request_metadata(void) = 0;
350
351 virtual bool empty(void) const = 0;
352 virtual size_t volume(void) const = 0;
353
354 virtual void choose_dim_order(std::vector<int> &dim_order,
355 const std::vector<CopySrcDstField> &srcs,
356 const std::vector<CopySrcDstField> &dsts,
357 const std::vector<IndirectionInfo *> &indirects,
358 bool force_fortran_order, size_t max_stride) const = 0;
359
360 virtual void count_fragments(RegionInstance inst, const std::vector<int> &dim_order,
361 const std::vector<FieldID> &fields,
362 const std::vector<size_t> &fld_sizes,
363 std::vector<size_t> &fragments) const = 0;
364
366 const std::vector<int> &dim_order,
367 const std::vector<FieldID> &fields,
368 const std::vector<size_t> &fld_offsets,
369 const std::vector<size_t> &fld_sizes,
370 bool idindexed_fields = false) const = 0;
371
372 virtual TransferIterator *
374 const std::vector<FieldID> &fields,
375 const std::vector<size_t> &fld_offsets,
376 const std::vector<size_t> &fld_sizes) const = 0;
377
378 virtual void print(std::ostream &os) const = 0;
379 };
380
381 class TransferOperation;
382
383 // copies with generalized scatter and gather have a DAG that describes
384 // the overall transfer: nodes are transfer descriptors and edges are
385 // intermediate buffers
387 struct XDTemplate {
388 // TODO(apryakhin@): Remove target_node
390 // XferDesKind kind;
395 Channel *channel = nullptr;
396 bool idindexed_fields = false;
397
405 struct IO {
407 union {
408 struct {
410 unsigned fld_start;
411 unsigned fld_count;
413 struct {
414 unsigned ind_idx;
415 unsigned port;
417 unsigned fld_start;
418 unsigned fld_count;
420 unsigned edge;
421 struct {
422 unsigned fill_start;
423 unsigned fill_size;
426 };
427 };
428 static IO mk_inst(RegionInstance _inst, unsigned _fld_start, unsigned _fld_count);
429 static IO mk_indirect(unsigned _ind_idx, unsigned _port, RegionInstance _inst,
430 unsigned _fld_start, unsigned _fld_count);
431 static IO mk_edge(unsigned _edge);
432 static IO mk_fill(unsigned _fill_start, unsigned _fill_size, size_t _fill_total);
433
434 std::vector<IO> inputs; // TODO: short vectors
435 std::vector<IO> outputs;
436
437 // helper functions for initializing these things
438 void set_simple(Channel *channel, int in_edge, int out_edge);
439 };
440 struct IBInfo {
442 size_t size;
443 };
444 std::vector<XDTemplate> xd_nodes;
445 std::vector<IBInfo> ib_edges;
446 std::vector<unsigned> ib_alloc_order;
447 };
448
450 public:
451 // Copy the srcs, dsts, and indirects
452 template <int N, typename T>
454 IndexSpace<N, T> _is, const std::vector<CopySrcDstField> &_srcs,
455 const std::vector<CopySrcDstField> &_dsts,
456 const std::vector<const typename CopyIndirection<N, T>::Base *> &_indirects,
457 const ProfilingRequestSet &requests);
458
459 // Move the srcs, dsts, and indirects
460 template <int N, typename T>
462 IndexSpace<N, T> _is, std::vector<CopySrcDstField> &&_srcs,
463 std::vector<CopySrcDstField> &&_dsts,
464 const std::vector<const typename CopyIndirection<N, T>::Base *> &_indirects,
465 const ProfilingRequestSet &requests);
466
467 private:
468 template <int N, typename T, typename SrcVec, typename DstVec>
470 IndexSpace<N, T> _is, SrcVec &&_srcs, DstVec &&_dsts,
471 const std::vector<const typename CopyIndirection<N, T>::Base *> &_indirects,
472 const ProfilingRequestSet &requests,
473 std::true_type); // the true_type is used to disambiguate the constructor
474
475 protected:
476 // reference-counted - do not delete directly
478
479 public:
482
488
489 protected:
491
492 void check_analysis_preconditions(std::vector<Event> &preconditions) const;
493 [[nodiscard]] bool perform_analysis(TransferOperation *op, TimeLimit work_until);
494
495 friend class TransferOperation;
496
498 std::vector<CopySrcDstField> srcs, dsts;
499 std::vector<IndirectionInfo *> indirects;
501
504 std::vector<int> dim_order;
505 std::vector<FieldInfo> src_fields, dst_fields;
507 size_t fill_size;
508 bool analysis_init_done = false;
513 std::vector<bool> analysis_field_done;
516 };
517
519 public:
521
523
524 // push an op that has already begun processing back on the front of the
525 // queue, e.g. when the tail of the async IB response path hits a timeout
527
528 virtual bool do_work(TimeLimit work_until) override;
529
530 protected:
532 std::deque<TransferOperation *> pending_copies;
533 };
534
536 public:
537 virtual ~IndirectionInfo(void) {}
538 virtual Event request_metadata(void) = 0;
539
540 virtual void
541 generate_gather_paths(const Node *node_info, Memory dst_mem,
542 TransferGraph::XDTemplate::IO dst_edge, unsigned indirect_idx,
543 unsigned src_fld_start, unsigned src_fld_count,
544 size_t bytes_per_element, CustomSerdezID serdez_id,
545 std::vector<TransferGraph::XDTemplate> &xd_nodes,
546 std::vector<TransferGraph::IBInfo> &ib_edges,
547 std::vector<TransferDesc::FieldInfo> &src_fields) = 0;
548
550 Memory src_mem, TransferGraph::XDTemplate::IO src_edge, unsigned indirect_idx,
551 unsigned dst_fld_start, unsigned dst_fld_count, size_t bytes_per_element,
552 CustomSerdezID serdez_id, std::vector<TransferGraph::XDTemplate> &xd_nodes,
553 std::vector<TransferGraph::IBInfo> &ib_edges,
554 std::vector<TransferDesc::FieldInfo> &src_fields) = 0;
555
556 virtual RegionInstance get_pointer_instance(void) const = 0;
557
558 virtual const std::vector<RegionInstance> *get_instances(void) const = 0;
559
560 virtual FieldID get_field(void) const = 0;
561
563
565 Memory addrs_mem, RegionInstance inst, const std::vector<FieldID> &fields,
566 const std::vector<size_t> &fld_offsets, const std::vector<size_t> &fld_sizes,
567 Channel *channel = nullptr) const = 0;
568
569 virtual void print(std::ostream &os) const = 0;
570 };
571
572 std::ostream &operator<<(std::ostream &os, const IndirectionInfo &ii);
573
575 public:
576 IndirectionInfoBase(bool _structured, FieldID _field_id, RegionInstance _inst,
577 bool _is_ranges, bool _oor_possible, bool _aliasing_possible,
578 size_t _subfield_offset, const std::vector<RegionInstance> _insts,
579 Channel *_addrsplit_channel);
580
581 protected:
582 // most of the logic to generate unstructured gather/scatter paths is
583 // dimension-agnostic and we can define it in a base class to save
584 // compile time/code size ...
585 virtual void generate_gather_paths(const Node *nodes_info, Memory dst_mem,
587 unsigned indirect_idx, unsigned src_fld_start,
588 unsigned src_fld_count, size_t bytes_per_element,
589 CustomSerdezID serdez_id,
590 std::vector<TransferGraph::XDTemplate> &xd_nodes,
591 std::vector<TransferGraph::IBInfo> &ib_edges,
592 std::vector<TransferDesc::FieldInfo> &src_fields);
593
594 virtual void generate_scatter_paths(Memory src_mem,
596 unsigned indirect_idx, unsigned dst_fld_start,
597 unsigned dst_fld_count, size_t bytes_per_element,
598 CustomSerdezID serdez_id,
599 std::vector<TransferGraph::XDTemplate> &xd_nodes,
600 std::vector<TransferGraph::IBInfo> &ib_edges,
601 std::vector<TransferDesc::FieldInfo> &src_fields);
602
603 // ... but we need three helpers that will be defined in the typed versions
604 virtual size_t num_spaces() const = 0;
605 virtual void populate_copy_info(ChannelCopyInfo &info) const = 0;
606 virtual size_t domain_size() const = 0;
607 virtual size_t address_size() const = 0;
608
609 virtual XferDesFactory *create_addrsplit_factory(size_t bytes_per_element) const = 0;
610
618 std::vector<RegionInstance> insts;
620 };
621
623 //
624 // class IndirectionInfoTyped<N,T,N2,T2>
625 //
626
627 template <int N, typename T, int N2, typename T2>
629 public:
631 const IndexSpace<N, T> &is,
632 const typename CopyIndirection<N, T>::template Unstructured<N2, T2> &ind,
633 Channel *_addr_split_channel);
634
635 virtual Event request_metadata(void);
636
638
639 virtual const std::vector<RegionInstance> *get_instances(void) const;
640
641 virtual FieldID get_field(void) const;
642
644
646 Memory addrs_mem, RegionInstance inst, const std::vector<FieldID> &fields,
647 const std::vector<size_t> &fld_offsets, const std::vector<size_t> &fld_sizes,
648 Channel *channel = nullptr) const;
649
650 virtual void print(std::ostream &os) const;
651
652 protected:
653 virtual size_t num_spaces() const;
654 virtual void populate_copy_info(ChannelCopyInfo &info) const;
655 virtual size_t domain_size() const;
656 virtual size_t address_size() const;
657
658 virtual XferDesFactory *create_addrsplit_factory(size_t bytes_per_element) const;
659
661 std::vector<IndexSpace<N2, T2>> spaces;
663 mutable std::optional<size_t> cached_domain_size;
664 };
665
666 // a TransferOperation is an application-requested copy/fill/reduce
668 public:
669 TransferOperation(TransferDesc &_desc, Event _precondition,
670 GenEventImpl *_finish_event, EventImpl::gen_t _finish_gen,
671 int priority);
672
674
675 inline int get_priority(void) const { return priority; }
676 inline bool analyze(TimeLimit work_until)
677 {
678 return desc.perform_analysis(this, work_until);
679 }
680
681 virtual void print(std::ostream &os) const;
682
683 void start_or_defer(void);
684
685 virtual bool mark_ready(void);
686 virtual bool mark_started(void);
687
688 bool allocate_ibs(TimeLimit work_until);
689 bool create_xds(TimeLimit work_until);
690
691 void notify_ib_allocation(unsigned ib_index, off_t ib_offset, TimeLimit work_until);
692 void notify_ib_allocations(unsigned count, unsigned first_index, const off_t *offsets,
693 TimeLimit work_until);
695
697 public:
699 virtual void request_cancellation(void);
700 virtual void print(std::ostream &os) const;
701
702 protected:
704 };
705
706 protected:
707 virtual void mark_completed(void);
708
709 class DeferredStart : public EventWaiter {
710 public:
712 virtual void event_triggered(bool poisoned, TimeLimit work_until);
713 virtual void print(std::ostream &os) const;
714 virtual Event get_finish_event(void) const;
715
718 };
720
723 std::vector<XferDesID> xd_ids;
724 std::vector<XDLifetimeTracker *> xd_trackers;
725 std::vector<off_t> ib_offsets;
728
729 // resume state for incremental allocate_ibs / create_xds across timeouts
734 size_t create_xds_i{0};
735 std::vector<std::pair<XferDesID, int>> ib_pre_ids;
736 std::vector<std::pair<XferDesID, int>> ib_next_ids;
737 };
738
739 template <int N, typename T>
741 Event (*)(const IndexSpace<N, T> &, const std::vector<CopySrcDstField> &,
742 const std::vector<CopySrcDstField> &,
743 const std::vector<const typename CopyIndirection<N, T>::Base *> &,
744 const Realm::ProfilingRequestSet &, Event, int);
745
746 template <int N, typename T>
749 };
750
751}; // namespace Realm
752
753#include "realm/transfer/transfer.inl"
754
755#endif // ifndef REALM_TRANSFER_H
Definition address_list.h:56
Definition bgwork.h:129
Definition channel.h:712
Definition transfer.h:518
void analyze_copy(TransferOperation *op)
virtual bool do_work(TimeLimit work_until) override
std::deque< TransferOperation * > pending_copies
Definition transfer.h:532
void requeue_front(TransferOperation *op)
Mutex mutex
Definition transfer.h:531
Definition indexspace.h:252
Definition indexspace.h:250
unsigned gen_t
Definition event_impl.h:87
Definition event_impl.h:49
Definition event.h:50
Definition event_impl.h:198
Definition transfer.h:232
size_t rect_idx
Definition transfer.h:282
SparsityMapImpl< N, T > * sparsity_impl
Definition transfer.h:273
size_t step_custom(size_t max_bytes, TransferIterator::AddressInfoCustom &info, bool tentative=false) override
ReplicatedHeap * repl_heap
Definition transfer.h:284
static Serialization::PolymorphicSerdezSubclass< TransferIterator, IDIndexedFieldsIterator< N, T > > serdez_subclass
Definition transfer.h:251
std::vector< FieldID > fields
Definition transfer.h:276
bool iter_init_deferred
Definition transfer.h:275
IndexSpaceIterator< N, T > iter
Definition transfer.h:274
bool serialize(S &serializer) const
FieldBlock * field_block
Definition transfer.h:285
IndexSpace< N, T > is
Definition transfer.h:272
bool get_addresses(AddressList &addrlist, const InstanceLayoutPieceBase *&nonaffine) override
void confirm_step(void) override
const InstanceLayout< N, T > * inst_layout
Definition transfer.h:279
size_t field_size
Definition transfer.h:281
static TransferIterator * deserialize_new(S &deserializer)
virtual ~IDIndexedFieldsIterator(void)
bool get_next_rect(Rect< N, T > &r, FieldID &fid, size_t &offset, size_t &fsize) override
size_t step(size_t max_bytes, TransferIterator::AddressInfo &info, unsigned flags, bool tentative=false) override
Event request_metadata(void) override
void cancel_step(void) override
IDIndexedFieldsIterator(const int _dim_order[N], const std::vector< FieldID > &_fields, size_t _field_size, RegionInstanceImpl *_inst_impl, const IndexSpace< N, T > &_is, ReplicatedHeap *_repl_heap)
void reset(void) override
Definition transfer.h:574
bool structured
Definition transfer.h:611
virtual XferDesFactory * create_addrsplit_factory(size_t bytes_per_element) const =0
virtual void generate_scatter_paths(Memory src_mem, TransferGraph::XDTemplate::IO src_edge, unsigned indirect_idx, unsigned dst_fld_start, unsigned dst_fld_count, size_t bytes_per_element, CustomSerdezID serdez_id, std::vector< TransferGraph::XDTemplate > &xd_nodes, std::vector< TransferGraph::IBInfo > &ib_edges, std::vector< TransferDesc::FieldInfo > &src_fields)
virtual void generate_gather_paths(const Node *nodes_info, Memory dst_mem, TransferGraph::XDTemplate::IO dst_edge, unsigned indirect_idx, unsigned src_fld_start, unsigned src_fld_count, size_t bytes_per_element, CustomSerdezID serdez_id, std::vector< TransferGraph::XDTemplate > &xd_nodes, std::vector< TransferGraph::IBInfo > &ib_edges, std::vector< TransferDesc::FieldInfo > &src_fields)
std::vector< RegionInstance > insts
Definition transfer.h:618
size_t subfield_offset
Definition transfer.h:617
FieldID field_id
Definition transfer.h:612
IndirectionInfoBase(bool _structured, FieldID _field_id, RegionInstance _inst, bool _is_ranges, bool _oor_possible, bool _aliasing_possible, size_t _subfield_offset, const std::vector< RegionInstance > _insts, Channel *_addrsplit_channel)
RegionInstance inst
Definition transfer.h:613
bool oor_possible
Definition transfer.h:615
bool aliasing_possible
Definition transfer.h:616
Channel * addrsplit_channel
Definition transfer.h:619
virtual size_t num_spaces() const =0
bool is_ranges
Definition transfer.h:614
virtual size_t address_size() const =0
virtual void populate_copy_info(ChannelCopyInfo &info) const =0
virtual size_t domain_size() const =0
Definition transfer.h:628
virtual RegionInstance get_pointer_instance(void) const
virtual void populate_copy_info(ChannelCopyInfo &info) const
IndexSpace< N, T > domain
Definition transfer.h:660
virtual void print(std::ostream &os) const
IndirectionInfoTyped(const IndexSpace< N, T > &is, const typename CopyIndirection< N, T >::template Unstructured< N2, T2 > &ind, Channel *_addr_split_channel)
std::optional< size_t > cached_domain_size
Definition transfer.h:663
virtual const std::vector< RegionInstance > * get_instances(void) const
virtual size_t domain_size() const
virtual Event request_metadata(void)
virtual TransferIterator * create_indirect_iterator(Memory addrs_mem, RegionInstance inst, const std::vector< FieldID > &fields, const std::vector< size_t > &fld_offsets, const std::vector< size_t > &fld_sizes, Channel *channel=nullptr) const
Channel * addr_split_channel
Definition transfer.h:662
virtual TransferIterator * create_address_iterator(RegionInstance peer) const
virtual size_t address_size() const
virtual XferDesFactory * create_addrsplit_factory(size_t bytes_per_element) const
std::vector< IndexSpace< N2, T2 > > spaces
Definition transfer.h:661
virtual size_t num_spaces() const
virtual FieldID get_field(void) const
Definition transfer.h:535
virtual FieldID get_field(void) const =0
virtual void generate_gather_paths(const Node *node_info, Memory dst_mem, TransferGraph::XDTemplate::IO dst_edge, unsigned indirect_idx, unsigned src_fld_start, unsigned src_fld_count, size_t bytes_per_element, CustomSerdezID serdez_id, std::vector< TransferGraph::XDTemplate > &xd_nodes, std::vector< TransferGraph::IBInfo > &ib_edges, std::vector< TransferDesc::FieldInfo > &src_fields)=0
virtual void generate_scatter_paths(Memory src_mem, TransferGraph::XDTemplate::IO src_edge, unsigned indirect_idx, unsigned dst_fld_start, unsigned dst_fld_count, size_t bytes_per_element, CustomSerdezID serdez_id, std::vector< TransferGraph::XDTemplate > &xd_nodes, std::vector< TransferGraph::IBInfo > &ib_edges, std::vector< TransferDesc::FieldInfo > &src_fields)=0
virtual Event request_metadata(void)=0
virtual const std::vector< RegionInstance > * get_instances(void) const =0
virtual RegionInstance get_pointer_instance(void) const =0
virtual TransferIterator * create_indirect_iterator(Memory addrs_mem, RegionInstance inst, const std::vector< FieldID > &fields, const std::vector< size_t > &fld_offsets, const std::vector< size_t > &fld_sizes, Channel *channel=nullptr) const =0
virtual TransferIterator * create_address_iterator(RegionInstance peer) const =0
virtual void print(std::ostream &os) const =0
virtual ~IndirectionInfo(void)
Definition transfer.h:537
Definition inst_layout.h:267
Definition inst_layout.h:391
Definition memory.h:33
static const Memory NO_MEMORY
Definition memory.h:49
Definition operation.h:75
Definition operation.h:32
Definition profiling.h:363
Definition inst_impl.h:54
Definition instance.h:66
Definition repl_heap.h:30
Definition sparsity_impl.h:105
Definition timers.h:129
Definition transfer.h:449
size_t analysis_fld_start
Definition transfer.h:511
TransferDomain * domain
Definition transfer.h:497
void check_analysis_preconditions(std::vector< Event > &preconditions) const
ProfilingMeasurements::OperationMemoryUsage prof_usage
Definition transfer.h:514
size_t fill_size
Definition transfer.h:507
std::vector< FieldInfo > src_fields
Definition transfer.h:505
size_t analysis_fill_ofs
Definition transfer.h:512
TransferGraph graph
Definition transfer.h:503
std::vector< IndirectionInfo * > indirects
Definition transfer.h:499
Mutex mutex
Definition transfer.h:502
std::vector< CopySrcDstField > dsts
Definition transfer.h:498
size_t analysis_domain_size
Definition transfer.h:509
std::vector< CopySrcDstField > srcs
Definition transfer.h:498
ProfilingMeasurements::OperationCopyInfo prof_cpinfo
Definition transfer.h:515
bool analysis_init_done
Definition transfer.h:508
std::vector< int > dim_order
Definition transfer.h:504
std::vector< FieldInfo > dst_fields
Definition transfer.h:505
bool perform_analysis(TransferOperation *op, TimeLimit work_until)
std::vector< bool > analysis_field_done
Definition transfer.h:513
atomic< int > refcount
Definition transfer.h:490
void * fill_data
Definition transfer.h:506
TransferDesc(IndexSpace< N, T > _is, std::vector< CopySrcDstField > &&_srcs, std::vector< CopySrcDstField > &&_dsts, const std::vector< const typename CopyIndirection< N, T >::Base * > &_indirects, const ProfilingRequestSet &requests)
ProfilingRequestSet prs
Definition transfer.h:500
TransferDesc(IndexSpace< N, T > _is, const std::vector< CopySrcDstField > &_srcs, const std::vector< CopySrcDstField > &_dsts, const std::vector< const typename CopyIndirection< N, T >::Base * > &_indirects, const ProfilingRequestSet &requests)
size_t analysis_field_idx
Definition transfer.h:510
Definition transfer.h:334
virtual TransferIterator * create_iterator(RegionInstance inst, RegionInstance peer, const std::vector< FieldID > &fields, const std::vector< size_t > &fld_offsets, const std::vector< size_t > &fld_sizes) const =0
virtual ~TransferDomain(void)
virtual size_t volume(void) const =0
virtual TransferDomain * clone(void) const =0
virtual Event request_metadata(void)=0
virtual void choose_dim_order(std::vector< int > &dim_order, const std::vector< CopySrcDstField > &srcs, const std::vector< CopySrcDstField > &dsts, const std::vector< IndirectionInfo * > &indirects, bool force_fortran_order, size_t max_stride) const =0
virtual TransferIterator * create_iterator(RegionInstance inst, const std::vector< int > &dim_order, const std::vector< FieldID > &fields, const std::vector< size_t > &fld_offsets, const std::vector< size_t > &fld_sizes, bool idindexed_fields=false) const =0
virtual void count_fragments(RegionInstance inst, const std::vector< int > &dim_order, const std::vector< FieldID > &fields, const std::vector< size_t > &fld_sizes, std::vector< size_t > &fragments) const =0
virtual bool empty(void) const =0
static TransferDomain * deserialize_new(S &deserializer)
static TransferDomain * construct(const IndexSpace< N, T > &is)
virtual void print(std::ostream &os) const =0
Definition transfer.h:131
Rect< N, T > cur_rect
Definition transfer.h:159
virtual Event request_metadata(void)
size_t cur_field_offset
Definition transfer.h:161
bool have_rect
Definition transfer.h:158
virtual void cancel_step(void)
Point< N, T > cur_point
Definition transfer.h:162
virtual void confirm_step(void)
virtual bool done(void)
bool carry
Definition transfer.h:163
virtual size_t step(size_t max_bytes, AddressInfo &info, unsigned flags, bool tentative=false)
bool tentative_valid
Definition transfer.h:168
Point< N, T > next_point
Definition transfer.h:162
TransferIteratorBase(RegionInstanceImpl *_inst_impl, const int _dim_order[N])
FieldID cur_field_id
Definition transfer.h:160
virtual bool get_addresses(AddressList &addrlist, const InstanceLayoutPieceBase *&nonaffine)
bool is_done
Definition transfer.h:158
virtual size_t get_base_offset(void) const
size_t inst_offset
Definition transfer.h:167
size_t cur_field_size
Definition transfer.h:161
virtual size_t step_custom(size_t max_bytes, AddressInfoCustom &info, bool tentative=false)
int dim_order[N]
Definition transfer.h:169
virtual bool get_next_rect(Rect< N, T > &r, FieldID &fid, size_t &offset, size_t &fsize)=0
RegionInstanceImpl * inst_impl
Definition transfer.h:165
virtual void reset(void)
Definition transfer.h:178
virtual bool get_next_rect(Rect< N, T > &r, FieldID &fid, size_t &offset, size_t &fsize)
size_t field_idx
Definition transfer.h:223
IndexSpace< N, T > is
Definition transfer.h:217
TransferIteratorIndexSpace(const int _dim_order[N], const std::vector< FieldID > &_fields, const std::vector< size_t > &_fld_offsets, const std::vector< size_t > &_fld_sizes, RegionInstanceImpl *_inst_impl, const IndexSpace< N, T > &_is)
std::vector< FieldID > fields
Definition transfer.h:221
static Serialization::PolymorphicSerdezSubclass< TransferIterator, TransferIteratorIndexSpace< N, T > > serdez_subclass
Definition transfer.h:207
std::vector< size_t > fld_sizes
Definition transfer.h:222
static TransferIterator * deserialize_new(S &deserializer)
TransferIteratorIndexSpace(const int _dim_order[N], const std::vector< FieldID > &_fields, const std::vector< size_t > &_fld_offsets, const std::vector< size_t > &_fld_sizes, RegionInstanceImpl *_inst_impl, const Rect< N, T > &_bounds, SparsityMapImpl< N, T > *_sparsity_impl)
SparsityMapImpl< N, T > * sparsity_impl
Definition transfer.h:218
bool iter_init_deferred
Definition transfer.h:220
std::vector< size_t > fld_offsets
Definition transfer.h:222
IndexSpaceIterator< N, T > iter
Definition transfer.h:219
bool serialize(S &serializer) const
virtual Event request_metadata(void)
Definition transfer.h:289
Memory addrs_mem
Definition transfer.h:322
int indirect_port_idx
Definition transfer.h:331
virtual bool get_next_rect(Rect< N, T > &r, FieldID &fid, size_t &offset, size_t &fsize)
bool can_merge
Definition transfer.h:324
std::vector< size_t > fld_offsets
Definition transfer.h:329
intptr_t addrs_mem_base
Definition transfer.h:323
TransferIteratorIndirect(Memory _addrs_mem, RegionInstanceImpl *_inst_impl, const std::vector< FieldID > &_fields, const std::vector< size_t > &_fld_offsets, const std::vector< size_t > &_fld_sizes)
virtual void set_indirect_input_port(XferDes *xd, int port_idx, TransferIterator *inner_iter)
bool serialize(S &serializer) const
XferDes * indirect_xd
Definition transfer.h:330
static constexpr size_t MAX_POINTS
Definition transfer.h:325
std::vector< size_t > fld_sizes
Definition transfer.h:329
virtual Event request_metadata(void)
size_t num_points
Definition transfer.h:327
Point< N, T > points[MAX_POINTS]
Definition transfer.h:326
size_t point_pos
Definition transfer.h:327
virtual ~TransferIteratorIndirect(void)
TransferIterator * addrs_in
Definition transfer.h:321
static TransferIterator * deserialize_new(S &deserializer)
static Serialization::PolymorphicSerdezSubclass< TransferIterator, TransferIteratorIndirect< N, T > > serdez_subclass
Definition transfer.h:312
std::vector< FieldID > fields
Definition transfer.h:328
virtual ~AddressInfoCustom()
Definition transfer.h:97
virtual int set_rect(const RegionInstanceImpl *inst, const InstanceLayoutPieceBase *piece, size_t field_size, size_t field_offset, int ndims, const int64_t lo[], const int64_t hi[], const int order[])=0
Definition transfer.h:47
virtual size_t get_address_size(void) const
virtual void reset(void)=0
virtual ~TransferIterator(void)
virtual bool done(void)=0
virtual size_t step_custom(size_t max_bytes, AddressInfoCustom &info, bool tentative=false)=0
virtual size_t get_base_offset(void) const
virtual size_t step(size_t max_bytes, AddressInfo &info, unsigned flags, bool tentative=false)=0
virtual Event request_metadata(void)
virtual bool get_addresses(AddressList &addrlist, const InstanceLayoutPieceBase *&nonaffine)=0
static TransferIterator * deserialize_new(S &deserializer)
virtual void cancel_step(void)=0
@ SRC_LINES_OK
Definition transfer.h:70
@ SRC_PARTIAL_OK
Definition transfer.h:69
@ SRC_PLANES_OK
Definition transfer.h:71
@ SRC_FLAGMASK
Definition transfer.h:72
@ PARTIAL_OK
Definition transfer.h:79
@ LINES_OK
Definition transfer.h:80
@ PLANES_OK
Definition transfer.h:81
@ DST_FLAGMASK
Definition transfer.h:77
@ DST_LINES_OK
Definition transfer.h:75
@ DST_PARTIAL_OK
Definition transfer.h:74
@ DST_PLANES_OK
Definition transfer.h:76
virtual void confirm_step(void)=0
virtual void set_indirect_input_port(XferDes *xd, int port_idx, TransferIterator *inner_iter)
TransferOperation * op
Definition transfer.h:716
Event precondition
Definition transfer.h:717
virtual Event get_finish_event(void) const
virtual void event_triggered(bool poisoned, TimeLimit work_until)
virtual void print(std::ostream &os) const
DeferredStart(TransferOperation *_op)
XDLifetimeTracker(TransferOperation *_op, XferDesID _xd_id)
XferDesID xd_id
Definition transfer.h:703
virtual void print(std::ostream &os) const
Definition transfer.h:667
std::vector< off_t > ib_offsets
Definition transfer.h:725
bool allocate_ibs_requests_sent
Definition transfer.h:731
Event precondition
Definition transfer.h:722
bool create_xds(TimeLimit work_until)
TransferOperation(TransferDesc &_desc, Event _precondition, GenEventImpl *_finish_event, EventImpl::gen_t _finish_gen, int priority)
atomic< unsigned > ib_responses_needed
Definition transfer.h:726
DeferredStart deferred_start
Definition transfer.h:719
TransferDesc & desc
Definition transfer.h:721
std::vector< XDLifetimeTracker * > xd_trackers
Definition transfer.h:724
int get_priority(void) const
Definition transfer.h:675
unsigned allocate_ibs_immed_count
Definition transfer.h:732
void notify_ib_allocation(unsigned ib_index, off_t ib_offset, TimeLimit work_until)
virtual bool mark_ready(void)
bool allocate_ibs_init_done
Definition transfer.h:730
bool create_xds_init_done
Definition transfer.h:733
std::vector< std::pair< XferDesID, int > > ib_pre_ids
Definition transfer.h:735
void notify_xd_completion(XferDesID xd_id)
bool allocate_ibs(TimeLimit work_until)
virtual void mark_completed(void)
bool analyze(TimeLimit work_until)
Definition transfer.h:676
virtual void print(std::ostream &os) const
virtual bool mark_started(void)
size_t create_xds_i
Definition transfer.h:734
std::vector< std::pair< XferDesID, int > > ib_next_ids
Definition transfer.h:736
std::vector< XferDesID > xd_ids
Definition transfer.h:723
void notify_ib_allocations(unsigned count, unsigned first_index, const off_t *offsets, TimeLimit work_until)
int priority
Definition transfer.h:727
Definition mutex.h:223
Definition channel.h:632
Definition channel.h:285
Definition atomics.h:31
Definition activemsg.h:42
Event(*)(const IndexSpace< N, T > &, const std::vector< CopySrcDstField > &, const std::vector< CopySrcDstField > &, const std::vector< const typename CopyIndirection< N, T >::Base * > &, const Realm::ProfilingRequestSet &, Event, int) CopyImplFn
Definition transfer.h:744
realm_field_id_t FieldID
Definition instance.h:45
int NodeID
Definition nodeset.h:40
int CustomSerdezID
Definition custom_serdez.h:148
unsigned long long XferDesID
Definition channel.h:56
std::ostream & operator<<(std::ostream &os, const DenseRectangleList< N, T > &drl)
Definition channel.h:683
Definition transfer.h:747
static CopyImplFn< N, T > impl
Definition transfer.h:748
Definition address_list.h:33
Definition indexspace.h:1249
Definition indexspace.h:323
Definition runtime_impl.h:90
Definition point.h:55
Definition point.h:143
Definition transfer.h:483
size_t size
Definition transfer.h:485
size_t offset
Definition transfer.h:485
CustomSerdezID serdez_id
Definition transfer.h:486
FieldID id
Definition transfer.h:484
Definition transfer.h:440
size_t size
Definition transfer.h:442
Memory memory
Definition transfer.h:441
Definition transfer.h:405
unsigned fill_size
Definition transfer.h:423
RegionInstance inst
Definition transfer.h:409
unsigned fld_start
Definition transfer.h:410
unsigned port
Definition transfer.h:415
unsigned ind_idx
Definition transfer.h:414
unsigned fill_start
Definition transfer.h:422
IOType iotype
Definition transfer.h:406
unsigned fld_count
Definition transfer.h:411
struct Realm::TransferGraph::XDTemplate::IO::@37::@40 indirect
struct Realm::TransferGraph::XDTemplate::IO::@37::@41 fill
unsigned edge
Definition transfer.h:420
size_t fill_total
Definition transfer.h:424
Definition transfer.h:387
Channel * channel
Definition transfer.h:395
static IO mk_fill(unsigned _fill_start, unsigned _fill_size, size_t _fill_total)
void set_simple(Channel *channel, int in_edge, int out_edge)
bool idindexed_fields
Definition transfer.h:396
int scatter_control_input
Definition transfer.h:393
static IO mk_edge(unsigned _edge)
int gather_control_input
Definition transfer.h:392
XferDesRedopInfo redop
Definition transfer.h:394
XferDesFactory * factory
Definition transfer.h:391
static IO mk_inst(RegionInstance _inst, unsigned _fld_start, unsigned _fld_count)
std::vector< IO > inputs
Definition transfer.h:434
std::vector< IO > outputs
Definition transfer.h:435
static IO mk_indirect(unsigned _ind_idx, unsigned _port, RegionInstance _inst, unsigned _fld_start, unsigned _fld_count)
NodeID target_node
Definition transfer.h:389
IOType
Definition transfer.h:399
@ IO_INDIRECT_INST
Definition transfer.h:401
@ IO_FILL_DATA
Definition transfer.h:403
@ IO_EDGE
Definition transfer.h:402
@ IO_INST
Definition transfer.h:400
Definition transfer.h:386
std::vector< IBInfo > ib_edges
Definition transfer.h:445
std::vector< XDTemplate > xd_nodes
Definition transfer.h:444
std::vector< unsigned > ib_alloc_order
Definition transfer.h:446
Definition transfer.h:84
size_t num_planes
Definition transfer.h:89
size_t line_stride
Definition transfer.h:88
size_t bytes_per_chunk
Definition transfer.h:86
size_t base_offset
Definition transfer.h:85
size_t num_lines
Definition transfer.h:87
size_t plane_stride
Definition transfer.h:90
Definition channel.h:209