20#ifndef REALM_INST_LAYOUT_H
21#define REALM_INST_LAYOUT_H
26#if defined(REALM_USE_KOKKOS)
33 template <
class,
class...>
38 namespace Experimental {
39 template <
class,
class...>
47 Kokkos_Unmanaged = 0x01
50#define REALM_PROVIDE_ACCESSOR_TO_KOKKOS_VIEW_CONVERSION
77 const std::vector<size_t> &field_sizes,
size_t block_size);
79 size_t num_fields,
size_t block_size);
93 namespace PieceLookup {
121 static const Opcode OP_INVALID = 0;
122 static const Opcode OP_SPLIT1 = 1;
127 static const unsigned ALLOW_SPLIT1 = 1U << Opcodes::OP_SPLIT1;
168 template <
typename S>
181 virtual void print(std::ostream &os)
const = 0;
192 template <
int N,
typename T>
195 const int dim_order[N]);
207 template <
int N,
typename T>
228 bool idindexed_fields{
false};
248 virtual void print(std::ostream &os)
const;
254 namespace PieceLayoutTypes {
257 static const LayoutType InvalidLayoutType = 0;
273 virtual void print(std::ostream &os)
const = 0;
278 unsigned next_delta)
const = 0;
287 template <
int N,
typename T =
int>
295 template <
typename S>
305 template <
int N,
typename T>
314 template <
int N,
typename T =
int>
319 template <
typename S>
334 virtual void print(std::ostream &os)
const;
339 unsigned next_delta)
const;
345 template <
typename S>
356 template <
int N,
typename T =
int>
369 void relocate(
size_t base_offset);
371 template <typename S>
372 bool serialize(S &serializer) const;
373 template <typename S>
374 bool deserialize(S &deserializer);
380 template <
int N, typename T>
388 template <
int N, typename T =
int>
393 template <
typename S>
406 virtual void print(std::ostream &os)
const;
430 template <
typename S>
437 namespace PieceLookup {
440 static const Opcode OP_AFFINE_PIECE = 2;
443 static const unsigned ALLOW_AFFINE_PIECE = 1U << Opcodes::OP_AFFINE_PIECE;
445 template <
int N,
typename T>
462 template <
int N,
typename T>
465 SplitPlane(
int _split_dim, T _split_plane,
unsigned _next_delta);
486 template <
typename FT>
492 operator FT(
void)
const;
501 template <typename T>
516 template <typename FT,
int N, typename T =
int>
539 size_t subfield_offset = 0);
547 template <
typename INST>
549 template <
typename INST>
580 template <
typename FT,
int N,
typename T>
592 template <
typename FT,
int N,
typename T =
int>
625 size_t subfield_offset = 0);
637 template <
int N2,
typename T2>
640 size_t subfield_offset = 0);
645 template <
int N2,
typename T2>
648 const Rect<N, T> &subrect,
size_t subfield_offset = 0);
661 const
Rect<N, T> &subrect);
662 template <
int N2, typename T2>
665 template <
int N2, typename T2>
668 const
Rect<N, T> &subrect);
675 size_t subfield_offset = 0);
676 template <
int N2, typename T2>
678 const
Point<N2, T2> &offset,
FieldID field_id,
size_t subfield_offset = 0);
679 template <
int N2, typename T2>
682 size_t subfield_offset = 0);
685 FT *ptr(const
Point<N, T> &p) const;
687 FT read(const
Point<N, T> &p) const;
689 void write(const
Point<N, T> &p, FT newval) const;
692 FT &operator[](const
Point<N, T> &p) const;
695 bool is_dense_arbitrary(const
Rect<N, T> &bounds) const;
697 bool is_dense_col_major(const
Rect<N, T> &bounds) const;
699 bool is_dense_row_major(const
Rect<N, T> &bounds) const;
701#ifdef REALM_PROVIDE_ACCESSOR_TO_KOKKOS_VIEW_CONVERSION
707 template <
typename... Args>
708 operator Kokkos::View<Args...>()
const;
713 template <
typename... Args>
714 operator Kokkos::Experimental::OffsetView<Args...>()
const;
721#if defined(REALM_ACCESSOR_DEBUG) || defined(REALM_USE_KOKKOS)
724#ifdef REALM_USE_KOKKOS
725 bool bounds_specified;
727#ifdef REALM_ACCESSOR_DEBUG
729#if defined(__CUDACC__) || defined(__HIPCC__)
730#error "REALM_ACCESSOR_DEBUG macro for AffineAccessor not supported for GPU code"
741 template <
typename FT,
int N,
typename T>
747 template <
typename FT,
int N,
typename T =
int>
750 template <
typename FT,
int N,
typename T>
761 template <
typename FT,
int N,
typename T>
777 size_t subfield_offset = 0);
790 size_t subfield_offset = 0);
802 const
Rect<N, T> &subrect);
809 size_t subfield_offset = 0);
819 FT *ptr(const
Point<N, T> &p) const;
821 FT *ptr(const
Rect<N, T> &r,
size_t strides[N]) const;
823 FT read(const
Point<N, T> &p) const;
825 void write(const
Point<N, T> &p, FT newval) const;
829 FT &operator[](const
Point<N, T> &p) const;
834 FT *ptr(const
Rect<N, T> &r,
size_t strides[N]);
838 void write(const
Point<N, T> &p, FT newval);
841 FT &operator[](const
Point<N, T> &p);
844 friend
std::ostream &operator<< <FT, N, T>(
std::ostream &os,
851 uintptr_t piece_base;
854 const PieceLookup::Instruction *start_inst;
860#include "realm/inst_layout.inl"
Definition inst_layout.h:487
AccessorRefHelper(const AccessorRefHelper &)=default
AccessorRefHelper(AccessorRefHelper &&) noexcept=default
AccessorRefHelper(RegionInstance _inst, size_t _offset)
Definition inst_layout.h:593
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:734
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:733
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:315
static Serialization::PolymorphicSerdezSubclass< InstanceLayoutPiece< N, T >, AffineLayoutPiece< N, T > > serdez_subclass
Definition inst_layout.h:343
static InstanceLayoutPiece< N, T > * deserialize_new(S &deserializer)
size_t offset
Definition inst_layout.h:349
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:348
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:517
const InstanceLayoutPiece< N, T > * prev_piece
Definition inst_layout.h:573
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:569
size_t rel_offset
Definition inst_layout.h:571
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:570
Definition inst_layout.h:70
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:72
std::vector< FieldGroup > field_groups
Definition inst_layout.h:90
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:88
InstanceLayoutConstraints(const std::vector< size_t > &field_sizes, size_t block_size)
Definition inst_layout.h:162
std::map< FieldID, FieldLayout > FieldMap
Definition inst_layout.h:226
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:227
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:215
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:216
Definition inst_layout.h:240
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:265
PieceLayoutTypes::LayoutType layout_type
Definition inst_layout.h:280
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:288
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:302
Definition inst_layout.h:389
IndexSpace< N, T > space
Definition inst_layout.h:420
static InstanceLayoutGeneric * deserialize_new(S &deserializer)
std::vector< int > preferred_dim_order
Definition inst_layout.h:424
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:421
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:428
virtual ~InstanceLayout(void)
virtual void print(std::ostream &os) const
bool serialize(S &serializer) const
Definition inst_layout.h:357
InstancePieceList(InstancePieceList &&) noexcept=default
InstancePieceList & operator=(const InstancePieceList &)=default
InstancePieceList(const InstancePieceList &)=default
Definition inst_layout.h:762
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:95
virtual ~CompiledProgram()
Definition inst_layout.h:97
virtual void commit_updates()=0
std::map< FieldID, PerField > fields
Definition inst_layout.h:113
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:255
unsigned char Opcode
Definition inst_layout.h:119
Definition activemsg.h:42
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:81
size_t size
Definition inst_layout.h:85
bool fixed_offset
Definition inst_layout.h:83
FieldID field_id
Definition inst_layout.h:82
size_t offset
Definition inst_layout.h:84
size_t alignment
Definition inst_layout.h:86
Definition inst_layout.h:220
int list_idx
Definition inst_layout.h:221
int size_in_bytes
Definition inst_layout.h:223
size_t rel_offset
Definition inst_layout.h:222
Definition inst_layout.h:446
uintptr_t base
Definition inst_layout.h:455
Rect< N, T > bounds
Definition inst_layout.h:454
AffinePiece(unsigned next_delta)
Point< N, size_t > strides
Definition inst_layout.h:456
REALM_CUDA_HD const Instruction * next() const
REALM_CUDA_HD unsigned delta() const
Definition inst_layout.h:107
uintptr_t field_offset
Definition inst_layout.h:110
unsigned inst_usage_mask
Definition inst_layout.h:109
const PieceLookup::Instruction * start_inst
Definition inst_layout.h:108
Definition inst_layout.h:129
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:134
Definition inst_layout.h:463
T split_plane
Definition inst_layout.h:475
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