17 #ifndef __LEGION_C_UTIL_H__
18 #define __LEGION_C_UTIL_H__
27 #include "legion/legion_mapping.h"
28 #include "mappers/mapping_utilities.h"
41 #define ARRAY_ACCESSOR(DIM) \
42 typedef Legion::UnsafeFieldAccessor<char,DIM,coord_t, \
43 Realm::AffineAccessor<char,DIM,coord_t> > ArrayAccessor##DIM##D;
44 LEGION_FOREACH_N(ARRAY_ACCESSOR)
47 #define RECT_ITERATOR(DIM) \
48 typedef RectInDomainIterator<DIM,coord_t> RectInDomainIterator##DIM##D;
49 LEGION_FOREACH_N(RECT_ITERATOR)
52 #define BUFFER_CHAR(DIM) \
53 typedef DeferredBuffer<char,DIM> DeferredBufferChar##DIM##D;
54 LEGION_FOREACH_N(BUFFER_CHAR)
60 #pragma warning (push)
61 #pragma warning (disable: 858)
64 #pragma warning (push)
65 #pragma diag_suppress 191
66 #pragma diag_suppress 816
68 #define NEW_OPAQUE_WRAPPER(T_, T) \
69 static T_ wrap(T t) { \
71 t_.impl = static_cast<void *>(t); \
74 static const T_ wrap_const(const T t) { \
76 t_.impl = const_cast<void *>(static_cast<const void *>(t)); \
79 static T unwrap(T_ t_) { \
80 return static_cast<T>(t_.impl); \
82 static const T unwrap_const(const T_ t_) { \
83 return static_cast<const T>(t_.impl); \
86 NEW_OPAQUE_WRAPPER(legion_runtime_t,
Runtime *);
87 NEW_OPAQUE_WRAPPER(legion_context_t,
CContext *);
89 #define RECT_ITERATOR(DIM) \
90 NEW_OPAQUE_WRAPPER(legion_rect_in_domain_iterator_##DIM##d_t, RectInDomainIterator##DIM##D *);
91 LEGION_FOREACH_N(RECT_ITERATOR)
93 NEW_OPAQUE_WRAPPER(legion_coloring_t, Coloring *);
94 NEW_OPAQUE_WRAPPER(legion_domain_coloring_t, DomainColoring *);
95 NEW_OPAQUE_WRAPPER(legion_point_coloring_t, PointColoring *);
96 NEW_OPAQUE_WRAPPER(legion_domain_point_coloring_t, DomainPointColoring *);
97 NEW_OPAQUE_WRAPPER(legion_multi_domain_point_coloring_t, MultiDomainPointColoring *);
98 NEW_OPAQUE_WRAPPER(legion_index_space_allocator_t, IndexSpaceAllocator *);
100 NEW_OPAQUE_WRAPPER(legion_argument_map_t,
ArgumentMap *);
101 NEW_OPAQUE_WRAPPER(legion_predicate_t,
Predicate *);
102 NEW_OPAQUE_WRAPPER(legion_future_t,
Future *);
103 NEW_OPAQUE_WRAPPER(legion_future_map_t,
FutureMap *);
104 #define BUFFER_CHAR(DIM) \
105 NEW_OPAQUE_WRAPPER(legion_deferred_buffer_char_##DIM##d_t, DeferredBufferChar##DIM##D *);
106 LEGION_FOREACH_N(BUFFER_CHAR)
108 NEW_OPAQUE_WRAPPER(legion_task_launcher_t,
TaskLauncher *);
111 NEW_OPAQUE_WRAPPER(legion_copy_launcher_t,
CopyLauncher *);
113 NEW_OPAQUE_WRAPPER(legion_fill_launcher_t,
FillLauncher *);
122 #define ACCESSOR_ARRAY(DIM) \
123 NEW_OPAQUE_WRAPPER(legion_accessor_array_##DIM##d_t, ArrayAccessor##DIM##D *);
125 #undef ACCESSOR_ARRAY
126 NEW_OPAQUE_WRAPPER(legion_task_t,
Task *);
127 NEW_OPAQUE_WRAPPER(legion_task_mut_t,
TaskMut *);
128 NEW_OPAQUE_WRAPPER(legion_copy_t,
Copy *);
129 NEW_OPAQUE_WRAPPER(legion_fill_t,
Fill *);
131 NEW_OPAQUE_WRAPPER(legion_mappable_t,
Mappable *);
133 NEW_OPAQUE_WRAPPER(legion_machine_t, Machine *);
134 NEW_OPAQUE_WRAPPER(legion_mapper_t, Mapping::Mapper *);
135 NEW_OPAQUE_WRAPPER(legion_processor_query_t, Machine::ProcessorQuery *);
136 NEW_OPAQUE_WRAPPER(legion_memory_query_t, Machine::MemoryQuery *);
137 NEW_OPAQUE_WRAPPER(legion_machine_query_interface_t,
138 Mapping::Utilities::MachineQueryInterface *);
139 NEW_OPAQUE_WRAPPER(legion_default_mapper_t, Mapping::DefaultMapper *);
140 NEW_OPAQUE_WRAPPER(legion_execution_constraint_set_t, ExecutionConstraintSet *);
141 NEW_OPAQUE_WRAPPER(legion_layout_constraint_set_t, LayoutConstraintSet *);
142 NEW_OPAQUE_WRAPPER(legion_task_layout_constraint_set_t, TaskLayoutConstraintSet *);
143 NEW_OPAQUE_WRAPPER(legion_map_task_input_t, Mapping::Mapper::MapTaskInput *);
144 NEW_OPAQUE_WRAPPER(legion_map_task_output_t, Mapping::Mapper::MapTaskOutput *);
145 NEW_OPAQUE_WRAPPER(legion_slice_task_output_t, Mapping::Mapper::SliceTaskOutput *);
146 NEW_OPAQUE_WRAPPER(legion_physical_instance_t, Mapping::PhysicalInstance *);
147 NEW_OPAQUE_WRAPPER(legion_mapper_runtime_t, Mapping::MapperRuntime *);
148 NEW_OPAQUE_WRAPPER(legion_mapper_context_t, Mapping::MapperContext);
149 typedef std::map<FieldID, const char *> FieldMap;
150 NEW_OPAQUE_WRAPPER(legion_field_map_t, FieldMap *);
151 #undef NEW_OPAQUE_WRAPPER
155 #pragma warning (pop)
158 #pragma warning (pop)
165 ptr_.value = ptr.value;
173 ptr.value = ptr_.value;
177 #define NEW_POINT_WRAPPER(DIM) \
178 typedef Point<DIM,coord_t> Point##DIM##D; \
179 static legion_point_##DIM##d_t wrap(Point##DIM##D t) { \
180 legion_point_##DIM##d_t t_; \
181 for (int i = 0; i < DIM; i++) \
185 static Point##DIM##D unwrap(legion_point_##DIM##d_t t_) { \
187 for (int i = 0; i < DIM; i++) \
191 LEGION_FOREACH_N(NEW_POINT_WRAPPER)
192 #undef NEW_POINT_WRAPPER
194 #define NEW_RECT_WRAPPER(DIM) \
195 typedef Rect<DIM,coord_t> Rect##DIM##D; \
196 static legion_rect_##DIM##d_t wrap(Rect##DIM##D t) { \
197 legion_rect_##DIM##d_t t_; \
198 t_.lo = wrap(Point##DIM##D(t.lo)); \
199 t_.hi = wrap(Point##DIM##D(t.hi)); \
202 static Rect##DIM##D unwrap(legion_rect_##DIM##d_t t_) { \
203 Rect##DIM##D t(unwrap(t_.lo), unwrap(t_.hi)); \
206 LEGION_FOREACH_N(NEW_RECT_WRAPPER)
207 #undef NEW_RECT_WRAPPER
209 #define NEW_BLOCKIFY_WRAPPER(DIM) \
210 static Blockify<DIM> unwrap(legion_blockify_##DIM##d_t t_) { \
211 Blockify<DIM> t(unwrap(t_.block_size), unwrap(t_.offset)); \
218 Point<DIM,coord_t> o)
219 : block_size(b), offset(o) { }
221 Point<DIM,coord_t> block_size, offset;
223 LEGION_FOREACH_N(NEW_BLOCKIFY_WRAPPER)
224 #undef NEW_BLOCKIFY_WRAPPER
226 #define NEW_TRANSFORM_WRAPPER(D1,D2) \
227 typedef Transform<D1,D2,coord_t> Transform##D1##x##D2; \
228 static legion_transform_##D1##x##D2##_t wrap(Transform##D1##x##D2 t) { \
229 legion_transform_##D1##x##D2##_t t_; \
230 for (int i = 0; i < D1; i++) \
231 for (int j = 0; j < D2; j++) \
232 t_.trans[i][j] = t[i][j]; \
235 static Transform##D1##x##D2 unwrap(legion_transform_##D1##x##D2##_t t_) { \
236 Transform##D1##x##D2 t; \
237 for (int i = 0; i < D1; i++) \
238 for (int j = 0; j < D2; j++) \
239 t[i][j] = t_.trans[i][j]; \
242 LEGION_FOREACH_NN(NEW_TRANSFORM_WRAPPER)
243 #undef NEW_TRANSFORM_WRAPPER
245 #define NEW_AFFINE_TRANSFORM_WRAPPER(D1,D2) \
246 typedef AffineTransform<D1,D2,coord_t> AffineTransform##D1##x##D2; \
247 static legion_affine_transform_##D1##x##D2##_t wrap(AffineTransform##D1##x##D2 t) { \
248 legion_affine_transform_##D1##x##D2##_t t_; \
249 t_.transform = wrap(t.transform); \
250 t_.offset = wrap(t.offset); \
253 static AffineTransform##D1##x##D2 unwrap(legion_affine_transform_##D1##x##D2##_t t_) { \
254 AffineTransform##D1##x##D2 t; \
255 t.transform = unwrap(t_.transform); \
256 t.offset = unwrap(t_.offset); \
259 LEGION_FOREACH_NN(NEW_AFFINE_TRANSFORM_WRAPPER)
260 #undef NEW_AFFINE_TRANSFORM_WRAPPER
265 domain_.is_id = domain.is_id;
266 domain_.is_type = domain.is_type;
267 domain_.dim = domain.dim;
268 std::copy(domain.rect_data, domain.rect_data + 2 * LEGION_MAX_DIM, domain_.rect_data);
275 domain.is_id = domain_.is_id;
276 domain.is_type = domain_.is_type;
277 domain.dim = domain_.dim;
278 std::copy(domain_.rect_data, domain_.rect_data + 2 * LEGION_MAX_DIM, domain.rect_data);
283 wrap(DomainPoint dp) {
286 std::copy(dp.point_data, dp.point_data + LEGION_MAX_DIM, dp_.point_data);
294 std::copy(dp_.point_data, dp_.point_data + LEGION_MAX_DIM, dp.point_data);
299 wrap(DomainTransform transform) {
301 transform_.m = transform.m;
302 transform_.n = transform.n;
303 std::copy(transform.matrix, transform.matrix + LEGION_MAX_DIM * LEGION_MAX_DIM, transform_.matrix);
307 static DomainTransform
309 DomainTransform transform;
310 transform.m = transform_.m;
311 transform.n = transform_.n;
312 std::copy(transform_.matrix, transform_.matrix + LEGION_MAX_DIM * LEGION_MAX_DIM, transform.matrix);
317 wrap(DomainAffineTransform transform) {
319 transform_.transform = wrap(transform.transform);
320 transform_.offset = wrap(transform.offset);
324 static DomainAffineTransform
326 DomainAffineTransform transform;
327 transform.transform = unwrap(transform_.transform);
328 transform.offset = unwrap(transform_.offset);
338 is_.type_tag = is.type_tag;
348 is.type_tag = is_.type_tag;
353 wrap(IndexPartition ip)
358 ip_.type_tag = ip.type_tag;
362 static IndexPartition
368 ip.type_tag = ip_.type_tag;
383 FieldSpace fs(fs_.id);
388 wrap(LogicalRegion r)
391 r_.tree_id = r.tree_id;
392 r_.index_space = wrap(r.index_space);
393 r_.field_space = wrap(r.field_space);
400 LogicalRegion r(r_.tree_id,
401 unwrap(r_.index_space),
402 unwrap(r_.field_space));
407 wrap(LogicalPartition r)
410 r_.tree_id = r.tree_id;
411 r_.index_partition = wrap(r.index_partition);
412 r_.field_space = wrap(r.field_space);
416 static LogicalPartition
419 LogicalPartition r(r_.tree_id,
420 unwrap(r_.index_partition),
421 unwrap(r_.field_space));
426 wrap(UntypedBuffer arg)
429 arg_.args = arg.get_ptr();
430 arg_.arglen = arg.get_size();
437 return UntypedBuffer(arg_.args, arg_.arglen);
441 wrap(
const ptrdiff_t offset)
444 offset_.offset = offset;
451 return offset_.offset;
455 wrap_const(
const InputArgs arg)
458 arg_.argv = arg.argv;
459 arg_.argc = arg.argc;
463 static const InputArgs
467 args.argv = args_.argv;
468 args.argc = args_.argc;
473 wrap(TaskConfigOptions options)
476 options_.leaf = options.leaf;
477 options_.inner = options.inner;
478 options_.idempotent = options.idempotent;
482 static TaskConfigOptions
485 TaskConfigOptions options(options_.leaf,
487 options_.idempotent);
507 static legion_processor_kind_t
508 wrap(Processor::Kind options)
510 return static_cast<legion_processor_kind_t
>(options);
513 static Processor::Kind
514 unwrap(legion_processor_kind_t options_)
516 return static_cast<Processor::Kind
>(options_);
535 static legion_memory_kind_t
536 wrap(Memory::Kind options)
538 return static_cast<legion_memory_kind_t
>(options);
542 unwrap(legion_memory_kind_t options_)
544 return static_cast<Memory::Kind
>(options_);
548 wrap(Mapping::Mapper::TaskSlice task_slice) {
550 task_slice_.domain = wrap(task_slice.domain);
551 task_slice_.proc = wrap(task_slice.proc);
552 task_slice_.recurse = task_slice.recurse;
553 task_slice_.stealable = task_slice.stealable;
557 static Mapping::Mapper::TaskSlice
559 Mapping::Mapper::TaskSlice task_slice;
560 task_slice.domain = unwrap(task_slice_.domain);
561 task_slice.proc = unwrap(task_slice_.proc);
562 task_slice.recurse = task_slice_.recurse;
563 task_slice.stealable = task_slice_.stealable;
568 wrap(PhaseBarrier barrier) {
570 barrier_.id = barrier.get_barrier().id;
571 barrier_.timestamp = barrier.get_barrier().timestamp;
577 PhaseBarrier barrier;
578 barrier.phase_barrier.id = barrier_.id;
579 barrier.phase_barrier.timestamp = barrier_.timestamp;
584 wrap(DynamicCollective collective) {
586 collective_.id = collective.get_barrier().id;
587 collective_.timestamp = collective.get_barrier().timestamp;
588 collective_.redop = collective.redop;
592 static DynamicCollective
594 DynamicCollective collective;
595 collective.phase_barrier.id = collective_.id;
596 collective.phase_barrier.timestamp = collective_.timestamp;
597 collective.redop = collective_.redop;
602 wrap(Mapping::Mapper::TaskOptions& options) {
604 options_.initial_proc = CObjectWrapper::wrap(options.initial_proc);
605 options_.inline_task = options.inline_task;
606 options_.stealable = options.stealable;
607 options_.map_locally = options.map_locally;
608 options_.valid_instances = options.valid_instances;
609 options_.memoize = options.memoize;
610 options_.replicate = options.replicate;
611 options_.parent_priority = options.parent_priority;
615 static Mapping::Mapper::TaskOptions
617 Mapping::Mapper::TaskOptions options;
618 options.initial_proc = CObjectWrapper::unwrap(options_.initial_proc);
619 options.inline_task = options_.inline_task;
620 options.stealable = options_.stealable;
621 options.map_locally = options_.map_locally;
622 options.valid_instances = options_.valid_instances;
623 options.memoize = options_.memoize;
624 options.replicate = options_.replicate;
625 options.parent_priority = options_.parent_priority;
630 wrap(Mapping::Mapper::SliceTaskInput& input) {
632 input_.domain = CObjectWrapper::wrap(input.domain);
637 wrap_const(
const Mapping::Mapper::SliceTaskInput& input) {
639 input_.domain = CObjectWrapper::wrap(input.domain);
643 static Mapping::Mapper::SliceTaskInput
645 Mapping::Mapper::SliceTaskInput input;
646 input.domain = CObjectWrapper::unwrap(input_.domain);
657 CContext(Context _ctx,
const std::vector<PhysicalRegion>& _physical_regions)
659 , physical_regions(_physical_regions.size())
661 for (
size_t i = 0; i < _physical_regions.size(); i++) {
662 physical_regions[i] =
669 for (
size_t i = 0; i < physical_regions.size(); i++) {
670 delete CObjectWrapper::unwrap(physical_regions[i]);
674 Context context(
void)
const
679 const legion_physical_region_t *regions(
void)
const
681 if(physical_regions.empty())
684 return &physical_regions[0];
687 size_t num_regions(
void)
const
689 return physical_regions.size();
694 std::vector<legion_physical_region_t> physical_regions;
700 virtual UniqueID get_unique_id(
void)
const {
704 virtual size_t get_context_index(
void)
const {
708 virtual int get_depth(
void)
const {
712 virtual const Task* get_parent_task(
void)
const {
716 virtual const std::string& get_provenance_string(
bool human=
true)
const {
718 return (*
new std::string());
720 virtual bool has_parent_task(
void)
const {
724 virtual const char* get_task_name(
void)
const {
728 virtual Domain get_slice_domain(
void)
const {
730 return Domain::NO_DOMAIN;
735 #endif // __LEGION_C_UTIL_H__
Definition: legion_domain.h:366
Definition: legion.h:1816
Definition: legion_c.h:327
Definition: legion.h:3790
Definition: legion.h:2359
Definition: legion_domain.h:260
Definition: legion.h:1319
Definition: legion.h:1904
Definition: legion_c.h:199
Definition: legion.h:4572
Definition: legion_c.h:244
Definition: legion_c.h:334
Definition: legion.h:4094
Definition: legion_c.h:287
Definition: legion.h:1564
Definition: legion_c.h:278
Definition: legion.h:1461
Definition: legion_c.h:367
Definition: legion.h:2523
Definition: legion_c.h:269
Definition: legion.h:4181
#define ACCESSOR_ARRAY(DIM)
Definition: legion_c.h:4908
Definition: legion_c.h:152
Definition: legion.h:1183
Definition: legion.h:1675
Definition: legion.h:1735
Definition: legion_c_util.h:651
Definition: legion_c.h:191
Definition: legion_c.h:310
Definition: legion.h:3683
Definition: legion_c.h:118
Definition: legion.h:3731
Definition: legion.h:2134
Definition: legion.h:4014
Definition: legion_c.h:236
Definition: legion_c_util.h:39
Definition: legion_c_util.h:697
Definition: legion.h:2075
Definition: legion_c.h:344
Definition: legion_c.h:262
Definition: legion.h:1964
Definition: legion.h:3943
Definition: legion_c.h:320
Definition: legion_c.h:354
Definition: legion_c.h:253
Definition: legion_c_util.h:215
Definition: legion.h:4066
Definition: legion_c.h:295