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>
230 bool idindexed_fields{
false};
250 virtual void print(std::ostream &os)
const;
256 namespace PieceLayoutTypes {
259 static const LayoutType InvalidLayoutType = 0;
275 virtual void print(std::ostream &os)
const = 0;
280 unsigned next_delta)
const = 0;
289 template <
int N,
typename T =
int>
297 template <
typename S>
307 template <
int N,
typename T>
316 template <
int N,
typename T =
int>
321 template <
typename S>
336 virtual void print(std::ostream &os)
const;
341 unsigned next_delta)
const;
347 template <
typename S>
358 template <
int N,
typename T =
int>
371 void relocate(
size_t base_offset);
373 template <typename S>
374 bool serialize(S &serializer) const;
375 template <typename S>
376 bool deserialize(S &deserializer);
382 template <
int N, typename T>
390 template <
int N, typename T =
int>
395 template <
typename S>
408 virtual void print(std::ostream &os)
const;
432 template <
typename S>
439 namespace PieceLookup {
442 static const Opcode OP_AFFINE_PIECE = 2;
445 static const unsigned ALLOW_AFFINE_PIECE = 1U << Opcodes::OP_AFFINE_PIECE;
447 template <
int N,
typename T>
464 template <
int N,
typename T>
467 SplitPlane(
int _split_dim, T _split_plane,
unsigned _next_delta);
488 template <
typename FT>
494 operator FT(
void)
const;
503 template <typename T>
518 template <typename FT,
int N, typename T =
int>
541 size_t subfield_offset = 0);
549 template <
typename INST>
551 template <
typename INST>
582 template <
typename FT,
int N,
typename T>
594 template <
typename FT,
int N,
typename T =
int>
627 size_t subfield_offset = 0);
639 template <
int N2,
typename T2>
642 size_t subfield_offset = 0);
647 template <
int N2,
typename T2>
650 const Rect<N, T> &subrect,
size_t subfield_offset = 0);
663 const
Rect<N, T> &subrect);
664 template <
int N2, typename T2>
667 template <
int N2, typename T2>
670 const
Rect<N, T> &subrect);
677 size_t subfield_offset = 0);
678 template <
int N2, typename T2>
680 const
Point<N2, T2> &offset,
FieldID field_id,
size_t subfield_offset = 0);
681 template <
int N2, typename T2>
684 size_t subfield_offset = 0);
687 FT *ptr(const
Point<N, T> &p) const;
689 FT read(const
Point<N, T> &p) const;
691 void write(const
Point<N, T> &p, FT newval) const;
694 FT &operator[](const
Point<N, T> &p) const;
697 bool is_dense_arbitrary(const
Rect<N, T> &bounds) const;
699 bool is_dense_col_major(const
Rect<N, T> &bounds) const;
701 bool is_dense_row_major(const
Rect<N, T> &bounds) const;
703#ifdef REALM_PROVIDE_ACCESSOR_TO_KOKKOS_VIEW_CONVERSION
709 template <
typename... Args>
710 operator Kokkos::View<Args...>()
const;
715 template <
typename... Args>
716 operator Kokkos::Experimental::OffsetView<Args...>()
const;
723#if defined(REALM_ACCESSOR_DEBUG) || defined(REALM_USE_KOKKOS)
726#ifdef REALM_USE_KOKKOS
727 bool bounds_specified;
729#ifdef REALM_ACCESSOR_DEBUG
731#if defined(__CUDACC__) || defined(__HIPCC__)
732#error "REALM_ACCESSOR_DEBUG macro for AffineAccessor not supported for GPU code"
743 template <
typename FT,
int N,
typename T>
749 template <
typename FT,
int N,
typename T =
int>
752 template <
typename FT,
int N,
typename T>
763 template <
typename FT,
int N,
typename T>
779 size_t subfield_offset = 0);
792 size_t subfield_offset = 0);
804 const
Rect<N, T> &subrect);
811 size_t subfield_offset = 0);
821 FT *ptr(const
Point<N, T> &p) const;
823 FT *ptr(const
Rect<N, T> &r,
size_t strides[N]) const;
825 FT read(const
Point<N, T> &p) const;
827 void write(const
Point<N, T> &p, FT newval) const;
831 FT &operator[](const
Point<N, T> &p) const;
836 FT *ptr(const
Rect<N, T> &r,
size_t strides[N]);
840 void write(const
Point<N, T> &p, FT newval);
843 FT &operator[](const
Point<N, T> &p);
846 friend
std::ostream &operator<< <FT, N, T>(
std::ostream &os,
853 uintptr_t piece_base;
856 const PieceLookup::Instruction *start_inst;
862#include "realm/inst_layout.inl"
Definition inst_layout.h:489
AccessorRefHelper(const AccessorRefHelper &)=default
AccessorRefHelper(AccessorRefHelper &&) noexcept=default
AccessorRefHelper(RegionInstance _inst, size_t _offset)
Definition inst_layout.h:595
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:736
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:735
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:317
static Serialization::PolymorphicSerdezSubclass< InstanceLayoutPiece< N, T >, AffineLayoutPiece< N, T > > serdez_subclass
Definition inst_layout.h:345
static InstanceLayoutPiece< N, T > * deserialize_new(S &deserializer)
size_t offset
Definition inst_layout.h:351
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:350
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:519
const InstanceLayoutPiece< N, T > * prev_piece
Definition inst_layout.h:575
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:571
size_t rel_offset
Definition inst_layout.h:573
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:572
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:242
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:267
PieceLayoutTypes::LayoutType layout_type
Definition inst_layout.h:282
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:290
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:304
Definition inst_layout.h:391
IndexSpace< N, T > space
Definition inst_layout.h:422
static InstanceLayoutGeneric * deserialize_new(S &deserializer)
std::vector< int > preferred_dim_order
Definition inst_layout.h:426
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:423
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:430
virtual ~InstanceLayout(void)
virtual void print(std::ostream &os) const
bool serialize(S &serializer) const
Definition inst_layout.h:359
InstancePieceList(InstancePieceList &&) noexcept=default
InstancePieceList & operator=(const InstancePieceList &)=default
InstancePieceList(const InstancePieceList &)=default
Definition inst_layout.h:764
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:257
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:448
uintptr_t base
Definition inst_layout.h:457
Rect< N, T > bounds
Definition inst_layout.h:456
AffinePiece(unsigned next_delta)
Point< N, size_t > strides
Definition inst_layout.h:458
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:465
T split_plane
Definition inst_layout.h:477
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