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