Realm
A distributed, event-based tasking library
Loading...
Searching...
No Matches
instance.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// instances for Realm
19
20#ifndef REALM_INSTANCE_H
21#define REALM_INSTANCE_H
22
23#include "realm/realm_config.h"
24
25#include "realm/realm_c.h"
26
27#include "realm/event.h"
28#include "realm/memory.h"
29#include "realm/processor.h"
30#include "realm/point.h"
31
32#include "realm/custom_serdez.h"
33
34#include <vector>
35
36#include <stdint.h>
37
43namespace Realm {
44
46
47 template <int N, typename T>
48 struct Rect;
49 template <int N, typename T>
50 struct IndexSpace;
56
57 namespace PieceLookup {
58 struct Instruction;
59 };
60
67 public:
70
71 RegionInstance() = default;
72 constexpr explicit RegionInstance(id_t id)
73 : id(id)
74 {}
75
76 constexpr operator id_t() const { return id; }
77
78 bool operator<(const RegionInstance &rhs) const;
79 bool operator==(const RegionInstance &rhs) const;
80 bool operator!=(const RegionInstance &rhs) const;
81
82 static const RegionInstance NO_INST;
83
85 bool exists(void) const;
86
87 Memory get_location(void) const;
88 // const LinearizedIndexSpaceIntfc& get_lis(void) const;
90
92
99 template <int N, typename T>
101 get_lookup_program(FieldID field_id, unsigned allowed_mask, uintptr_t &field_offset);
102 template <int N, typename T>
104 get_lookup_program(FieldID field_id, const Rect<N, T> &subrect, unsigned allowed_mask,
105 uintptr_t &field_offset);
107
116 void read_untyped(size_t offset, void *data, size_t datalen) const;
117
118 void write_untyped(size_t offset, const void *data, size_t datalen) const;
119
120 void reduce_apply_untyped(size_t offset, ReductionOpID redop_id, const void *data,
121 size_t datalen, bool exclusive = false) const;
122 void reduce_fold_untyped(size_t offset, ReductionOpID redop_id, const void *data,
123 size_t datalen, bool exclusive = false) const;
124
133 void *pointer_untyped(size_t offset, size_t datalen) const;
134
135 // typed template helpers of the above
136 template <typename T>
137 T read(size_t offset) const;
138 template <typename T>
139 void write(size_t offset, T val) const;
140 template <typename T>
141 void reduce_apply(size_t offset, ReductionOpID redop_id, T val,
142 bool exclusive = false) const;
143 template <typename T>
144 void reduce_fold(size_t offset, ReductionOpID redop_id, T val,
145 bool exclusive = false) const;
146 template <typename T>
147 T *pointer(size_t offset) const;
148
161 const ProfilingRequestSet &prs, Event wait_on = Event::NO_EVENT);
162
178 size_t num_layouts, const ProfilingRequestSet *prs,
179 Event wait_on = Event::NO_EVENT);
180
193 const InstanceLayoutGeneric &ilg,
194 const ProfilingRequestSet &prs,
195 Event wait_on = Event::NO_EVENT);
197 "use RegionInstance::create_instance with layout reference instead",
198 static Event create_instance(RegionInstance &inst, Memory memory,
200 const ProfilingRequestSet &prs,
201 Event wait_on = Event::NO_EVENT));
202
216 const InstanceLayoutGeneric &ilg,
217 const ExternalInstanceResource &resource,
218 const ProfilingRequestSet &prs,
219 Event wait_on = Event::NO_EVENT);
221 "use RegionInstance::create_external_instance with layout reference instead",
222 static Event create_external_instance(RegionInstance &inst, Memory memory,
224 const ExternalInstanceResource &resource,
225 const ProfilingRequestSet &prs,
226 Event wait_on = Event::NO_EVENT));
227
229
242 template <int N, typename T>
243 static Event
245 const std::vector<size_t> &field_sizes, size_t block_size,
246 const ProfilingRequestSet &prs, Event wait_on = Event::NO_EVENT);
247
248 template <int N, typename T>
249 static Event
251 const std::map<FieldID, size_t> &field_sizes, size_t block_size,
252 const ProfilingRequestSet &prs, Event wait_on = Event::NO_EVENT);
254
255 // we'd like the methods above to accept a Rect<N,T> in place of the
256 // IndexSpace<N,T>, but that doesn't work unless the method template
257 // parameters are specified explicitly, so provide an overload that
258 // takes a Rect directly
259 template <int N, typename T>
260 static Event
262 const std::vector<size_t> &field_sizes,
263 size_t block_size, // 0=SOA, 1=AOS, 2+=hybrid
264 const ProfilingRequestSet &prs, Event wait_on = Event::NO_EVENT);
265
266 template <int N, typename T>
267 static Event
269 const std::map<FieldID, size_t> &field_sizes,
270 size_t block_size, // 0=SOA, 1=AOS, 2+=hybrid
271 const ProfilingRequestSet &prs, Event wait_on = Event::NO_EVENT);
272
273 template <int N, typename T>
274 REALM_ATTR_DEPRECATED("use RegionInstance::create_external_instance instead",
275 static Event create_file_instance(
276 RegionInstance &inst, const char *file_name,
277 const IndexSpace<N, T> &space,
278 const std::vector<FieldID> &field_ids,
279 const std::vector<size_t> &field_sizes,
280 realm_file_mode_t file_mode, const ProfilingRequestSet &prs,
281 Event wait_on = Event::NO_EVENT));
282
283#ifdef REALM_USE_HDF5
284 template <int N, typename T>
285 struct HDF5FieldInfo {
286 FieldID field_id;
287 size_t field_size;
288 std::string dataset_name;
289 Point<N, T> offset;
290 int dim_order[N];
291 };
292
293 REALM_ATTR_DEPRECATED2("use RegionInstance::create_external_instance instead",
294 template <int N, typename T> static Event create_hdf5_instance(
295 RegionInstance &inst, const char *file_name,
296 const IndexSpace<N, T> &space,
297 const std::vector<HDF5FieldInfo<N, T>> &field_infos,
298 bool read_only, const ProfilingRequestSet &prs,
299 Event wait_on = Event::NO_EVENT));
300#endif
301
302 REALM_ATTR_DEPRECATED("use RegionInstance::create_external_instance instead",
303 static Event create_external(RegionInstance &inst,
304 Memory memory, uintptr_t base,
306 const ProfilingRequestSet &prs,
307 Event wait_on = Event::NO_EVENT));
308
309 void destroy(Event wait_on = Event::NO_EVENT) const;
310
312
325
326 // apparently we can't use default template parameters on methods without C++11, but
327 // we
328 // can provide templates of two different arities...
329 template <int N, typename T>
331
332 template <int N>
334
335 // used for accessor construction
340
341 // it is sometimes useful to re-register an existing instance (in whole or
342 // in part) as an "external" instance (e.g. to provide a different view
343 // on the same bits) - this hopefully gives an ExternalInstanceResource *
344 // (which must be deleted by the caller) that corresponds to this instance
345 // but may return a null pointer for instances that do not support
346 // re-registration
347 //
348
350
364
365 // a version of the above that allows limiting the described memory to just
366 // a subset of the original instance (NOTE: this will accept any
367 // IndexSpace<N,T> at compile-time, but N,T must match the instance layout)
369 span<const FieldID> fields,
370 bool read_only) const;
372
374 public:
376 DestroyedField(FieldID fid, unsigned s, CustomSerdezID sid);
377
378 public:
380 unsigned size;
382 };
383
384 // if any fields in the instance need custom destruction, use this version
385 void destroy(const std::vector<DestroyedField> &destroyed_fields,
386 Event wait_on = Event::NO_EVENT) const;
387
388 bool can_get_strided_access_parameters(size_t start, size_t count,
389 ptrdiff_t field_offset, size_t field_size);
390 void get_strided_access_parameters(size_t start, size_t count, ptrdiff_t field_offset,
391 size_t field_size, intptr_t &base,
392 ptrdiff_t &stride);
393
394 void report_instance_fault(int reason, const void *reason_data,
395 size_t reason_size) const;
396 };
397
399 std::ostream &operator<<(std::ostream &os, RegionInstance r);
400
406 protected:
407 // only subclasses can be constructed
408 ExternalInstanceResource(uint64_t _type_id)
409 : type_id(_type_id)
410 {}
411
412 public:
414
415 // check if this external resource can satisfy the instance layout
416 virtual bool satisfies(const InstanceLayoutGeneric &layout) const = 0;
417
418 // returns the suggested memory in which this resource should be created
419 virtual Memory suggested_memory() const = 0;
420
421 virtual ExternalInstanceResource *clone(void) const = 0;
422
423 template <typename S>
425
426 // pretty-printing
427 friend std::ostream &operator<<(std::ostream &os,
428 const ExternalInstanceResource &res);
429
430 uint64_t get_type_id() const { return type_id; }
431
432 protected:
433 virtual void print(std::ostream &os) const = 0;
434 uint64_t type_id = 0;
435 };
436
437 template <typename S>
438 bool serialize(S &serializer, const ExternalInstanceResource &res);
439
444 public:
445 ExternalMemoryResource(uintptr_t _base, size_t _size_in_bytes, bool _read_only);
446 ExternalMemoryResource(void *_base, size_t _size_in_bytes);
447 ExternalMemoryResource(const void *_base, size_t _size_in_bytes);
448
449 virtual bool satisfies(const InstanceLayoutGeneric &layout) const;
450
451 // returns the suggested memory in which this resource should be created
453
454 virtual ExternalInstanceResource *clone(void) const;
455
456 template <typename S>
457 bool serialize(S &serializer) const;
458
459 template <typename S>
461
462 protected:
464
468
469 virtual void print(std::ostream &os) const;
470
471 public:
472 uintptr_t base;
475 };
476
481 public:
482 ExternalFileResource(const std::string &_filename, realm_file_mode_t _mode,
483 size_t _offset = 0);
484
485 virtual bool satisfies(const InstanceLayoutGeneric &layout) const;
486
487 // returns the suggested memory in which this resource should be created
489
490 virtual ExternalInstanceResource *clone(void) const;
491
492 template <typename S>
493 bool serialize(S &serializer) const;
494
495 template <typename S>
497
498 protected:
500
504
505 virtual void print(std::ostream &os) const;
506
507 public:
508 std::string filename;
509 size_t offset;
511 };
512
513}; // namespace Realm
514#endif // ifndef REALM_INSTANCE_H
515
516#ifndef REALM_SKIP_INLINES
517#include "realm/instance.inl"
518#endif
Definition event.h:50
Definition instance.h:480
size_t offset
Definition instance.h:509
static ExternalInstanceResource * deserialize_new(S &deserializer)
realm_file_mode_t mode
Definition instance.h:510
static Serialization::PolymorphicSerdezSubclass< ExternalInstanceResource, ExternalFileResource > serdez_subclass
Definition instance.h:503
bool serialize(S &serializer) const
virtual ExternalInstanceResource * clone(void) const
std::string filename
Definition instance.h:508
virtual bool satisfies(const InstanceLayoutGeneric &layout) const
Memory suggested_memory() const
ExternalFileResource(const std::string &_filename, realm_file_mode_t _mode, size_t _offset=0)
virtual void print(std::ostream &os) const
Definition instance.h:405
virtual ~ExternalInstanceResource()
Definition instance.h:413
uint64_t get_type_id() const
Definition instance.h:430
ExternalInstanceResource(uint64_t _type_id)
Definition instance.h:408
virtual Memory suggested_memory() const =0
virtual ExternalInstanceResource * clone(void) const =0
virtual void print(std::ostream &os) const =0
virtual bool satisfies(const InstanceLayoutGeneric &layout) const =0
friend std::ostream & operator<<(std::ostream &os, const ExternalInstanceResource &res)
static ExternalInstanceResource * deserialize_new(S &deserializer)
Definition instance.h:443
virtual bool satisfies(const InstanceLayoutGeneric &layout) const
static Serialization::PolymorphicSerdezSubclass< ExternalInstanceResource, ExternalMemoryResource > serdez_subclass
Definition instance.h:467
ExternalMemoryResource(uintptr_t _base, size_t _size_in_bytes, bool _read_only)
size_t size_in_bytes
Definition instance.h:473
uintptr_t base
Definition instance.h:472
static ExternalInstanceResource * deserialize_new(S &deserializer)
virtual ExternalInstanceResource * clone(void) const
bool read_only
Definition instance.h:474
bool serialize(S &serializer) const
ExternalMemoryResource(const void *_base, size_t _size_in_bytes)
virtual void print(std::ostream &os) const
ExternalMemoryResource(void *_base, size_t _size_in_bytes)
Definition indexspace.h:1115
Definition inst_layout.h:164
Definition indexspace.h:1179
Definition memory.h:33
Definition processor.h:37
Definition profiling.h:363
Definition instance.h:66
T read(size_t offset) const
void reduce_fold_untyped(size_t offset, ReductionOpID redop_id, const void *data, size_t datalen, bool exclusive=false) const
REALM_CUDA_HD bool exists(void) const
static Event create_instance(RegionInstance &inst, Memory memory, const Rect< N, T > &rect, const std::vector< size_t > &field_sizes, size_t block_size, const ProfilingRequestSet &prs, Event wait_on=Event::NO_EVENT)
static const RegionInstance NO_INST
Definition instance.h:82
static Event create_external_instance(RegionInstance &inst, Memory memory, const InstanceLayoutGeneric &ilg, const ExternalInstanceResource &resource, const ProfilingRequestSet &prs, Event wait_on=Event::NO_EVENT)
REALM_ATTR_DEPRECATED("use RegionInstance::create_external_instance with layout reference instead", static Event create_external_instance(RegionInstance &inst, Memory memory, InstanceLayoutGeneric *ilg, const ExternalInstanceResource &resource, const ProfilingRequestSet &prs, Event wait_on=Event::NO_EVENT))
ExternalInstanceResource * generate_resource_info(bool read_only) const
Memory get_location(void) const
REALM_ATTR_DEPRECATED("use RegionInstance::create_external_instance instead", static Event create_file_instance(RegionInstance &inst, const char *file_name, const IndexSpace< N, T > &space, const std::vector< FieldID > &field_ids, const std::vector< size_t > &field_sizes, realm_file_mode_t file_mode, const ProfilingRequestSet &prs, Event wait_on=Event::NO_EVENT))
void write(size_t offset, T val) const
Event redistrict(RegionInstance &instance, const InstanceLayoutGeneric *layout, const ProfilingRequestSet &prs, Event wait_on=Event::NO_EVENT)
void read_untyped(size_t offset, void *data, size_t datalen) const
void destroy(Event wait_on=Event::NO_EVENT) const
void reduce_apply_untyped(size_t offset, ReductionOpID redop_id, const void *data, size_t datalen, bool exclusive=false) const
::realm_id_t id_t
Definition instance.h:68
REALM_INTERNAL_API_EXTERNAL_LINKAGE const PieceLookup::Instruction * get_lookup_program(FieldID field_id, unsigned allowed_mask, uintptr_t &field_offset)
bool operator<(const RegionInstance &rhs) const
static Event create_instance(RegionInstance &inst, Memory memory, const Rect< N, T > &rect, const std::map< FieldID, size_t > &field_sizes, size_t block_size, const ProfilingRequestSet &prs, Event wait_on=Event::NO_EVENT)
void write_untyped(size_t offset, const void *data, size_t datalen) const
void destroy(const std::vector< DestroyedField > &destroyed_fields, Event wait_on=Event::NO_EVENT) const
REALM_INTERNAL_API_EXTERNAL_LINKAGE bool increment_accessor_count(void)
void report_instance_fault(int reason, const void *reason_data, size_t reason_size) const
static Event create_instance(RegionInstance &inst, Memory memory, const IndexSpace< N, T > &space, const std::map< FieldID, size_t > &field_sizes, size_t block_size, const ProfilingRequestSet &prs, Event wait_on=Event::NO_EVENT)
AddressSpace address_space(void) const
bool operator==(const RegionInstance &rhs) const
REALM_ATTR_DEPRECATED("use RegionInstance::create_instance with layout reference instead", static Event create_instance(RegionInstance &inst, Memory memory, InstanceLayoutGeneric *ilg, const ProfilingRequestSet &prs, Event wait_on=Event::NO_EVENT))
void get_strided_access_parameters(size_t start, size_t count, ptrdiff_t field_offset, size_t field_size, intptr_t &base, ptrdiff_t &stride)
bool can_get_strided_access_parameters(size_t start, size_t count, ptrdiff_t field_offset, size_t field_size)
REALM_INTERNAL_API_EXTERNAL_LINKAGE bool decrement_accessor_count(void)
IndexSpace< N, T > get_indexspace(void) const
Event redistrict(RegionInstance *instances, const InstanceLayoutGeneric **layouts, size_t num_layouts, const ProfilingRequestSet *prs, Event wait_on=Event::NO_EVENT)
bool operator!=(const RegionInstance &rhs) const
ExternalInstanceResource * generate_resource_info(const IndexSpaceGeneric &space, span< const FieldID > fields, bool read_only) const
T * pointer(size_t offset) const
void reduce_apply(size_t offset, ReductionOpID redop_id, T val, bool exclusive=false) const
const InstanceLayoutGeneric * get_layout(void) const
id_t id
Definition instance.h:69
static Event create_instance(RegionInstance &inst, Memory memory, const IndexSpace< N, T > &space, const std::vector< size_t > &field_sizes, size_t block_size, const ProfilingRequestSet &prs, Event wait_on=Event::NO_EVENT)
void reduce_fold(size_t offset, ReductionOpID redop_id, T val, bool exclusive=false) const
IndexSpace< N, int > get_indexspace(void) const
constexpr RegionInstance(id_t id)
Definition instance.h:72
REALM_ATTR_DEPRECATED("use RegionInstance::create_external_instance instead", static Event create_external(RegionInstance &inst, Memory memory, uintptr_t base, InstanceLayoutGeneric *ilg, const ProfilingRequestSet &prs, Event wait_on=Event::NO_EVENT))
static Event create_instance(RegionInstance &inst, Memory memory, const InstanceLayoutGeneric &ilg, const ProfilingRequestSet &prs, Event wait_on=Event::NO_EVENT)
void * pointer_untyped(size_t offset, size_t datalen) const
Event fetch_metadata(Processor target) const
REALM_INTERNAL_API_EXTERNAL_LINKAGE const PieceLookup::Instruction * get_lookup_program(FieldID field_id, const Rect< N, T > &subrect, unsigned allowed_mask, uintptr_t &field_offset)
Definition utils.h:84
#define REALM_INTERNAL_API_EXTERNAL_LINKAGE
Definition compiler_support.h:218
#define REALM_CUDA_HD
Definition compiler_support.h:95
#define REALM_ATTR_DEPRECATED2(msg, thing1, thing2)
Definition compiler_support.h:153
#define REALM_PUBLIC_API
Definition compiler_support.h:217
Definition activemsg.h:38
::realm_address_space_t AddressSpace
Definition memory.h:31
realm_field_id_t FieldID
Definition instance.h:45
int CustomSerdezID
Definition custom_serdez.h:148
bool serialize(S &serdez, const ByteArrayRef &a)
::realm_reduction_op_id_t ReductionOpID
Definition event.h:38
std::ostream & operator<<(std::ostream &os, const DenseRectangleList< N, T > &drl)
int realm_field_id_t
Definition realm_c.h:77
unsigned long long realm_id_t
Definition realm_c.h:64
realm_file_mode_t
Definition realm_c.h:275
Definition indexspace.h:323
Definition inst_layout.h:131
Definition point.h:55
Definition point.h:143
Definition instance.h:373
CustomSerdezID serdez_id
Definition instance.h:381
unsigned size
Definition instance.h:380
FieldID field_id
Definition instance.h:379
DestroyedField(FieldID fid, unsigned s, CustomSerdezID sid)