20#ifndef REALM_INST_LAYOUT_H
21#define REALM_INST_LAYOUT_H
26#if defined(REALM_USE_KOKKOS)
33 template <
class,
class...>
38 template <
class,
size_t,
class>
40 namespace Experimental {
41 template <
class,
class...>
49 Kokkos_Unmanaged = 0x01
52#define REALM_PROVIDE_ACCESSOR_TO_KOKKOS_VIEW_CONVERSION
79 const std::vector<size_t> &field_sizes,
size_t block_size);
81 size_t num_fields,
size_t block_size);
95 namespace PieceLookup {
123 static const Opcode OP_INVALID = 0;
124 static const Opcode OP_SPLIT1 = 1;
129 static const unsigned ALLOW_SPLIT1 = 1U << Opcodes::OP_SPLIT1;
170 template <
typename S>
183 virtual void print(std::ostream &os)
const = 0;
194 template <
int N,
typename T>
197 const int dim_order[N]);
209 template <
int N,
typename T>
249 virtual void print(std::ostream &os)
const;
255 namespace PieceLayoutTypes {
258 static const LayoutType InvalidLayoutType = 0;
274 virtual void print(std::ostream &os)
const = 0;
279 unsigned next_delta)
const = 0;
288 template <
int N,
typename T =
int>
296 template <
typename S>
306 template <
int N,
typename T>
315 template <
int N,
typename T =
int>
320 template <
typename S>
335 virtual void print(std::ostream &os)
const;
340 unsigned next_delta)
const;
346 template <
typename S>
357 template <
int N,
typename T =
int>
370 void relocate(
size_t base_offset);
372 template <typename S>
373 bool serialize(S &serializer) const;
374 template <typename S>
375 bool deserialize(S &deserializer);
381 template <
int N, typename T>
389 template <
int N, typename T =
int>
394 template <
typename S>
407 virtual void print(std::ostream &os)
const;
428 template <
typename S>
435 namespace PieceLookup {
438 static const Opcode OP_AFFINE_PIECE = 2;
441 static const unsigned ALLOW_AFFINE_PIECE = 1U << Opcodes::OP_AFFINE_PIECE;
443 template <
int N,
typename T>
460 template <
int N,
typename T>
463 SplitPlane(
int _split_dim, T _split_plane,
unsigned _next_delta);
484 template <
typename FT>
490 operator FT(
void)
const;
499 template <typename T>
514 template <typename FT,
int N, typename T =
int>
537 size_t subfield_offset = 0);
545 template <
typename INST>
547 template <
typename INST>
578 template <
typename FT,
int N,
typename T>
590 template <
typename FT,
int N,
typename T =
int>
623 size_t subfield_offset = 0);
635 template <
int N2,
typename T2>
638 size_t subfield_offset = 0);
643 template <
int N2,
typename T2>
646 const Rect<N, T> &subrect,
size_t subfield_offset = 0);
659 const
Rect<N, T> &subrect);
660 template <
int N2, typename T2>
663 template <
int N2, typename T2>
666 const
Rect<N, T> &subrect);
673 size_t subfield_offset = 0);
674 template <
int N2, typename T2>
676 const
Point<N2, T2> &offset,
FieldID field_id,
size_t subfield_offset = 0);
677 template <
int N2, typename T2>
680 size_t subfield_offset = 0);
683 FT *ptr(const
Point<N, T> &p) const;
685 FT read(const
Point<N, T> &p) const;
687 void write(const
Point<N, T> &p, FT newval) const;
690 FT &operator[](const
Point<N, T> &p) const;
693 bool is_dense_arbitrary(const
Rect<N, T> &bounds) const;
695 bool is_dense_col_major(const
Rect<N, T> &bounds) const;
697 bool is_dense_row_major(const
Rect<N, T> &bounds) const;
699#ifdef REALM_PROVIDE_ACCESSOR_TO_KOKKOS_VIEW_CONVERSION
705 template <
typename... Args>
706 operator Kokkos::View<Args...>()
const;
711 template <
typename... Args>
712 operator Kokkos::Experimental::OffsetView<Args...>()
const;
719#if defined(REALM_ACCESSOR_DEBUG) || defined(REALM_USE_KOKKOS)
722#ifdef REALM_USE_KOKKOS
723 bool bounds_specified;
725#ifdef REALM_ACCESSOR_DEBUG
727#if defined(__CUDACC__) || defined(__HIPCC__)
728#error "REALM_ACCESSOR_DEBUG macro for AffineAccessor not supported for GPU code"
739 template <
typename FT,
int N,
typename T>
745 template <
typename FT,
int N,
typename T =
int>
748 template <
typename FT,
int N,
typename T>
759 template <
typename FT,
int N,
typename T>
775 size_t subfield_offset = 0);
788 size_t subfield_offset = 0);
800 const
Rect<N, T> &subrect);
807 size_t subfield_offset = 0);
817 FT *ptr(const
Point<N, T> &p) const;
819 FT *ptr(const
Rect<N, T> &r,
size_t strides[N]) const;
821 FT read(const
Point<N, T> &p) const;
823 void write(const
Point<N, T> &p, FT newval) const;
827 FT &operator[](const
Point<N, T> &p) const;
832 FT *ptr(const
Rect<N, T> &r,
size_t strides[N]);
836 void write(const
Point<N, T> &p, FT newval);
839 FT &operator[](const
Point<N, T> &p);
842 friend
std::ostream &operator<< <FT, N, T>(
std::ostream &os,
849 uintptr_t piece_base;
852 const PieceLookup::Instruction *start_inst;
858#include "realm/inst_layout.inl"
Definition inst_layout.h:485
AccessorRefHelper(const AccessorRefHelper &)=default
AccessorRefHelper(AccessorRefHelper &&) noexcept=default
AccessorRefHelper(RegionInstance _inst, size_t _offset)
Definition inst_layout.h:591
AffineAccessor(RegionInstance inst, const Matrix< N2, N, T2 > &transform, const Point< N2, T2 > &offset, FieldID field_id, const Rect< N, T > &subrect, size_t subfield_offset=0)
AffineAccessor & operator=(const AffineAccessor &)=default
AffineAccessor(RegionInstance inst, const Matrix< N2, N, T2 > &transform, const Point< N2, T2 > &offset, FieldID field_id, size_t subfield_offset=0)
AffineAccessor(const AffineAccessor &)=default
Point< N, size_t > strides
Definition inst_layout.h:732
AffineAccessor(AffineAccessor &&) noexcept=default
AffineAccessor(RegionInstance inst, FieldID field_id, size_t subfield_offset=0)
REALM_CUDA_HD AffineAccessor(void)
REALM_CUDA_HD FT * get_ptr(const Point< N, T > &p) const
uintptr_t base
Definition inst_layout.h:731
AffineAccessor(RegionInstance inst, FieldID field_id, const Rect< N, T > &subrect, size_t subfield_offset=0)
REALM_CUDA_HD ~AffineAccessor(void)
Definition inst_layout.h:316
static Serialization::PolymorphicSerdezSubclass< InstanceLayoutPiece< N, T >, AffineLayoutPiece< N, T > > serdez_subclass
Definition inst_layout.h:344
static InstanceLayoutPiece< N, T > * deserialize_new(S &deserializer)
size_t offset
Definition inst_layout.h:350
virtual size_t calculate_offset(const Point< N, T > &p) const
virtual PieceLookup::Instruction * create_lookup_inst(void *ptr, unsigned next_delta) const
virtual void print(std::ostream &os) const
Point< N, size_t > strides
Definition inst_layout.h:349
virtual size_t lookup_inst_size() const
virtual InstanceLayoutPiece< N, T > * clone(void) const
bool serialize(S &serializer) const
virtual void relocate(size_t base_offset)
Definition inst_layout.h:515
const InstanceLayoutPiece< N, T > * prev_piece
Definition inst_layout.h:571
void write(const Point< N, T > &p, FT newval)
GenericAccessor(RegionInstance inst, FieldID field_id, const Rect< N, T > &subrect, size_t subfield_offset=0)
GenericAccessor(RegionInstance inst, FieldID field_id, size_t subfield_offset=0)
AccessorRefHelper< FT > operator[](const Point< N, T > &p)
FT read(const Point< N, T > &p)
static bool is_compatible(const INST &instance, unsigned field_id)
RegionInstance inst
Definition inst_layout.h:567
size_t rel_offset
Definition inst_layout.h:569
size_t get_offset(const Point< N, T > &p)
static bool is_compatible(const INST &instance, unsigned field_id, const Rect< N, T > &subrect)
static bool is_compatible(RegionInstance inst, size_t field_offset, const Rect< N, T > &subrect)
static bool is_compatible(RegionInstance inst, size_t field_offset)
const InstancePieceList< N, T > * piece_list
Definition inst_layout.h:568
Definition inst_layout.h:72
InstanceLayoutConstraints(const FieldID *field_ids, const size_t *field_sizes, size_t num_fields, size_t block_size)
InstanceLayoutConstraints(const std::map< FieldID, size_t > &field_sizes, size_t block_size)
InstanceLayoutConstraints(void)
Definition inst_layout.h:74
std::vector< FieldGroup > field_groups
Definition inst_layout.h:92
InstanceLayoutConstraints(const std::vector< FieldID > &field_ids, const std::vector< size_t > &field_sizes, size_t block_size)
std::vector< FieldInfo > FieldGroup
Definition inst_layout.h:90
InstanceLayoutConstraints(const std::vector< size_t > &field_sizes, size_t block_size)
Definition inst_layout.h:164
std::map< FieldID, FieldLayout > FieldMap
Definition inst_layout.h:228
static InstanceLayoutGeneric * deserialize_new(S &deserializer)
static InstanceLayoutGeneric * choose_instance_layout(IndexSpace< N, T > is, const std::vector< Rect< N, T > > &covering, const InstanceLayoutConstraints &ilc, const int dim_order[N])
virtual void relocate(size_t adjust_amt)=0
FieldMap fields
Definition inst_layout.h:229
virtual ~InstanceLayoutGeneric(void)
virtual void print(std::ostream &os) const =0
virtual REALM_INTERNAL_API_EXTERNAL_LINKAGE void compile_lookup_program(PieceLookup::CompiledProgram &p) const =0
size_t bytes_used
Definition inst_layout.h:217
static InstanceLayoutGeneric * choose_instance_layout(IndexSpace< N, T > is, const InstanceLayoutConstraints &ilc, const int dim_order[N])
virtual InstanceLayoutGeneric * clone(void) const =0
InstanceLayoutGeneric(void)
size_t alignment_reqd
Definition inst_layout.h:218
Definition inst_layout.h:241
virtual InstanceLayoutGeneric * clone(void) const
virtual void print(std::ostream &os) const
virtual REALM_INTERNAL_API_EXTERNAL_LINKAGE void compile_lookup_program(PieceLookup::CompiledProgram &p) const
virtual void relocate(size_t adjust_amt)
InstanceLayoutOpaque(size_t _bytes_used, size_t _alignment_reqd)
Definition inst_layout.h:266
PieceLayoutTypes::LayoutType layout_type
Definition inst_layout.h:281
virtual PieceLookup::Instruction * create_lookup_inst(void *ptr, unsigned next_delta) const =0
InstanceLayoutPieceBase(PieceLayoutTypes::LayoutType _layout_type)
virtual ~InstanceLayoutPieceBase(void)
virtual void relocate(size_t base_offset)=0
virtual size_t lookup_inst_size() const =0
virtual void print(std::ostream &os) const =0
Definition inst_layout.h:289
InstanceLayoutPiece(PieceLayoutTypes::LayoutType _layout_type)
virtual size_t calculate_offset(const Point< N, T > &p) const =0
InstanceLayoutPiece(PieceLayoutTypes::LayoutType _layout_type, const Rect< N, T > &_bounds)
InstanceLayoutPiece(void)
static InstanceLayoutPiece< N, T > * deserialize_new(S &deserializer)
virtual InstanceLayoutPiece< N, T > * clone(void) const =0
Rect< N, T > bounds
Definition inst_layout.h:303
Definition inst_layout.h:390
IndexSpace< N, T > space
Definition inst_layout.h:421
static InstanceLayoutGeneric * deserialize_new(S &deserializer)
size_t calculate_offset(Point< N, T > p, FieldID fid) const
virtual REALM_INTERNAL_API_EXTERNAL_LINKAGE void compile_lookup_program(PieceLookup::CompiledProgram &p) const
std::vector< InstancePieceList< N, T > > piece_lists
Definition inst_layout.h:422
virtual InstanceLayoutGeneric * clone(void) const
virtual void relocate(size_t base_offset)
static Serialization::PolymorphicSerdezSubclass< InstanceLayoutGeneric, InstanceLayout< N, T > > serdez_subclass
Definition inst_layout.h:426
virtual ~InstanceLayout(void)
virtual void print(std::ostream &os) const
bool serialize(S &serializer) const
Definition inst_layout.h:358
InstancePieceList(InstancePieceList &&) noexcept=default
InstancePieceList & operator=(const InstancePieceList &)=default
InstancePieceList(const InstancePieceList &)=default
Definition inst_layout.h:760
REALM_CUDA_HD ~MultiAffineAccessor(void)
MultiAffineAccessor(RegionInstance inst, FieldID field_id, const Rect< N, T > &subrect, size_t subfield_offset=0)
MultiAffineAccessor & operator=(const MultiAffineAccessor &)=default
MultiAffineAccessor(MultiAffineAccessor &&) noexcept=default
MultiAffineAccessor(RegionInstance inst, FieldID field_id, size_t subfield_offset=0)
MultiAffineAccessor(const MultiAffineAccessor &)=default
REALM_CUDA_HD MultiAffineAccessor(void)
Definition inst_layout.h:97
virtual ~CompiledProgram()
Definition inst_layout.h:99
virtual void commit_updates()=0
std::map< FieldID, PerField > fields
Definition inst_layout.h:115
virtual void * allocate_memory(size_t bytes)=0
Definition serialize.h:363
#define REALM_INTERNAL_API_EXTERNAL_LINKAGE
Definition compiler_support.h:218
#define REALM_CUDA_HD
Definition compiler_support.h:95
#define REALM_PUBLIC_API
Definition compiler_support.h:217
unsigned char LayoutType
Definition inst_layout.h:256
unsigned char Opcode
Definition inst_layout.h:121
Definition activemsg.h:38
realm_field_id_t FieldID
Definition instance.h:45
std::ostream & operator<<(std::ostream &os, const DenseRectangleList< N, T > &drl)
Definition indexspace.h:1279
Definition indexspace.h:323
Definition inst_layout.h:83
size_t size
Definition inst_layout.h:87
bool fixed_offset
Definition inst_layout.h:85
FieldID field_id
Definition inst_layout.h:84
size_t offset
Definition inst_layout.h:86
size_t alignment
Definition inst_layout.h:88
Definition inst_layout.h:222
int list_idx
Definition inst_layout.h:223
int size_in_bytes
Definition inst_layout.h:225
size_t rel_offset
Definition inst_layout.h:224
Definition inst_layout.h:444
uintptr_t base
Definition inst_layout.h:453
Rect< N, T > bounds
Definition inst_layout.h:452
AffinePiece(unsigned next_delta)
Point< N, size_t > strides
Definition inst_layout.h:454
REALM_CUDA_HD const Instruction * next() const
REALM_CUDA_HD unsigned delta() const
Definition inst_layout.h:109
uintptr_t field_offset
Definition inst_layout.h:112
unsigned inst_usage_mask
Definition inst_layout.h:111
const PieceLookup::Instruction * start_inst
Definition inst_layout.h:110
Definition inst_layout.h:131
Instruction(uint32_t _data)
REALM_ALIGNED_TYPE_CONST(uint32_aligned_16, uint32_t, 16)
REALM_CUDA_HD const Instruction * jump(unsigned delta) const
REALM_CUDA_HD const Instruction * skip(size_t bytes) const
REALM_CUDA_HD Opcodes::Opcode opcode() const
uint32_aligned_16 data
Definition inst_layout.h:136
Definition inst_layout.h:461
T split_plane
Definition inst_layout.h:473
REALM_CUDA_HD int split_dim() const
SplitPlane(int _split_dim, T _split_plane, unsigned _next_delta)
void set_delta(unsigned _next_delta)
REALM_CUDA_HD bool splits_rect(const Rect< N, T > &r) const
REALM_CUDA_HD const Instruction * next(const Point< N, T > &p) const
REALM_CUDA_HD unsigned delta() const