16#ifndef __LEGION_CONSTRAINT_H__
17#define __LEGION_CONSTRAINT_H__
23#include "legion/api/types.h"
24#include "legion/api/geometry.h"
27#define LEGION_EXECUTION_CONSTRAINT_KINDS(__op__) \
28 __op__(LEGION_ISA_CONSTRAINT, "ISA") \
29 __op__(LEGION_PROCESSOR_CONSTRAINT, "Processor") \
30 __op__(LEGION_RESOURCE_CONSTRAINT, "Resource") \
31 __op__(LEGION_LAUNCH_CONSTRAINT, "Launch") \
32 __op__(LEGION_COLOCATION_CONSTRAINT, "Co-Location")
34#define LEGION_LAYOUT_CONSTRAINT_KINDS(__op__) \
35 __op__(LEGION_SPECIALIZED_CONSTRAINT, "Specialized") \
36 __op__(LEGION_MEMORY_CONSTRAINT, "Memory") \
37 __op__(LEGION_FIELD_CONSTRAINT, "Field") \
38 __op__(LEGION_ORDERING_CONSTRAINT, "Ordering") \
39 __op__(LEGION_TILING_CONSTRAINT, "Tiling") \
40 __op__(LEGION_DIMENSION_CONSTRAINT, "Dimension") \
41 __op__(LEGION_ALIGNMENT_CONSTRAINT, "Alignment") \
42 __op__(LEGION_OFFSET_CONSTRAINT, "Offset") \
43 __op__(LEGION_POINTER_CONSTRAINT, "Pointer") \
44 __op__(LEGION_PADDING_CONSTRAINT, "Padding")
63 static const ExecutionConstraintKind constraint_kind =
64 LEGION_ISA_CONSTRAINT;
70 return isa_prop == other.isa_prop;
74 return !(*
this == other);
81 void serialize(Serializer& rez)
const;
82 void deserialize(Deserializer& derez);
97 static const ExecutionConstraintKind constraint_kind =
98 LEGION_PROCESSOR_CONSTRAINT;
104 return valid_kinds == other.valid_kinds;
108 return !(*
this == other);
111 inline bool is_valid(
void)
const {
return !valid_kinds.empty(); }
112 void add_kind(Processor::Kind kind);
113 bool can_use(Processor::Kind kind)
const;
119 void serialize(Serializer& rez)
const;
120 void deserialize(Deserializer& derez);
122 std::vector<Processor::Kind> valid_kinds;
134 static const ExecutionConstraintKind constraint_kind =
135 LEGION_RESOURCE_CONSTRAINT;
139 ResourceKind resource_kind, EqualityKind eq_kind,
size_t value);
144 return !(*
this == other);
151 void serialize(Serializer& rez)
const;
152 void deserialize(Deserializer& derez);
154 ResourceKind resource_kind;
155 EqualityKind equality_kind;
169 static const ExecutionConstraintKind constraint_kind =
170 LEGION_LAUNCH_CONSTRAINT;
179 return !(*
this == other);
186 void serialize(Serializer& rez)
const;
187 void deserialize(Deserializer& derez);
189 LaunchKind launch_kind;
204 static const ExecutionConstraintKind constraint_kind =
205 LEGION_COLOCATION_CONSTRAINT;
211 unsigned index1,
unsigned index2,
const std::set<FieldID>& fields);
213 const std::vector<unsigned>& indexes,
const std::set<FieldID>& fields);
217 return fields == o.fields && indexes == o.indexes;
221 return !(*
this == other);
228 void serialize(Serializer& rez)
const;
229 void deserialize(Deserializer& derez);
231 std::set<FieldID> fields;
232 std::set<unsigned> indexes;
256 return !(*
this == other);
260 void serialize(Serializer& rez)
const;
261 void deserialize(Deserializer& derez);
265 std::vector<ResourceConstraint> resource_constraints;
266 std::vector<LaunchConstraint> launch_constraints;
267 std::vector<ColocationConstraint> colocation_constraints;
279 virtual LayoutConstraintKind get_constraint_kind(
void)
const = 0;
359 static const LayoutConstraintKind constraint_kind =
360 LEGION_SPECIALIZED_CONSTRAINT;
363 SpecializedKind kind = LEGION_AFFINE_SPECIALIZE,
364 ReductionOpID redop = 0,
bool no_access =
false,
bool exact =
false,
365 size_t max_pieces = SIZE_MAX,
int max_overhead = 0);
370 return !(*
this == other);
373 virtual LayoutConstraintKind get_constraint_kind(
void)
const override
375 return constraint_kind;
390 inline SpecializedKind get_kind(
void)
const {
return kind; }
391 inline ReductionOpID get_reduction_op(
void)
const {
return redop; }
394 void serialize(Serializer& rez)
const;
395 void deserialize(Deserializer& derez);
397 bool is_affine(
void)
const;
398 bool is_compact(
void)
const;
399 bool is_virtual(
void)
const;
400 bool is_reduction(
void)
const;
401 bool is_file(
void)
const;
402 inline bool is_no_access(
void)
const {
return no_access; }
403 inline bool is_exact(
void)
const {
return exact; }
405 bool is_normal(
void)
const;
407 SpecializedKind kind;
424 static const LayoutConstraintKind constraint_kind =
425 LEGION_MEMORY_CONSTRAINT;
432 return kind == other.kind && has_kind == other.has_kind;
436 return !(*
this == other);
439 virtual LayoutConstraintKind get_constraint_kind(
void)
const override
441 return constraint_kind;
452 inline bool is_valid(
void)
const {
return has_kind; }
453 inline Memory::Kind get_kind(
void)
const {
return kind; }
459 void serialize(Serializer& rez)
const;
460 void deserialize(Deserializer& derez);
477 static const LayoutConstraintKind constraint_kind = LEGION_FIELD_CONSTRAINT;
481 const std::vector<FieldID>& field_set,
bool contiguous,
482 bool inorder =
true);
484 const std::set<FieldID>& field_set,
bool contiguous,
485 bool inorder =
true);
490 return !(*
this == other);
493 virtual LayoutConstraintKind get_constraint_kind(
void)
const override
495 return constraint_kind;
497 virtual FieldConstraint* as_field_constraint(
void)
override {
return this; }
498 virtual const FieldConstraint* as_field_constraint(
void)
const override
503 inline bool is_contiguous(
void)
const {
return contiguous; }
504 inline bool is_inorder(
void)
const {
return inorder; }
505 inline const std::vector<FieldID>& get_field_set(
void)
const
514 void serialize(Serializer& rez)
const;
515 void deserialize(Deserializer& derez);
517 std::vector<FieldID> field_set;
540 static const LayoutConstraintKind constraint_kind =
541 LEGION_ORDERING_CONSTRAINT;
545 const std::vector<DimensionKind>& ordering,
bool contiguous);
549 return ordering == other.ordering && contiguous == other.contiguous;
553 return !(*
this == other);
556 virtual LayoutConstraintKind get_constraint_kind(
void)
const override
558 return constraint_kind;
574 void serialize(Serializer& rez)
const;
575 void deserialize(Deserializer& derez);
577 static bool is_skip_dimension(DimensionKind dim,
unsigned total_dims);
579 std::vector<DimensionKind> ordering;
594 static const LayoutConstraintKind constraint_kind =
595 LEGION_TILING_CONSTRAINT;
603 return dim == o.dim && value == o.value && tiles == o.tiles;
607 return !(*
this == other);
610 virtual LayoutConstraintKind get_constraint_kind(
void)
const override
612 return constraint_kind;
627 void serialize(Serializer& rez)
const;
628 void deserialize(Deserializer& derez);
642 static const LayoutConstraintKind constraint_kind =
643 LEGION_DIMENSION_CONSTRAINT;
650 return kind == o.kind && eqk == o.eqk && value == o.value;
654 return !(*
this == other);
657 virtual LayoutConstraintKind get_constraint_kind(
void)
const override
659 return constraint_kind;
675 void serialize(Serializer& rez)
const;
676 void deserialize(Deserializer& derez);
691 static const LayoutConstraintKind constraint_kind =
692 LEGION_ALIGNMENT_CONSTRAINT;
699 return fid == o.fid && eqk == o.eqk && alignment == o.alignment;
703 return !(*
this == other);
706 virtual LayoutConstraintKind get_constraint_kind(
void)
const override
708 return constraint_kind;
724 void serialize(Serializer& rez)
const;
725 void deserialize(Deserializer& derez);
739 static const LayoutConstraintKind constraint_kind =
740 LEGION_OFFSET_CONSTRAINT;
747 return fid == o.fid && offset == o.offset;
751 return !(*
this == other);
754 virtual LayoutConstraintKind get_constraint_kind(
void)
const override
756 return constraint_kind;
771 void serialize(Serializer& rez)
const;
772 void deserialize(Deserializer& derez);
785 static const LayoutConstraintKind constraint_kind =
786 LEGION_POINTER_CONSTRAINT;
793 return is_valid == o.is_valid && memory == o.memory && ptr == o.ptr;
797 return !(*
this == other);
800 virtual LayoutConstraintKind get_constraint_kind(
void)
const override
802 return constraint_kind;
817 void serialize(Serializer& rez)
const;
818 void deserialize(Deserializer& derez);
832 static const LayoutConstraintKind constraint_kind =
833 LEGION_PADDING_CONSTRAINT;
841 return (delta == rhs.delta);
845 return !(*
this == other);
848 virtual LayoutConstraintKind get_constraint_kind(
void)
const override
850 return constraint_kind;
865 void serialize(Serializer& rez)
const;
866 void deserialize(Deserializer& derez);
901 LayoutConstraintKind* bad_kind =
nullptr,
902 size_t* bad_index =
nullptr)
const;
908 bool test_pointer =
true)
const;
915 LayoutConstraintKind kind,
unsigned index)
const;
918 void serialize(Serializer& rez)
const;
919 void deserialize(Deserializer& derez);
927 std::vector<TilingConstraint> tiling_constraints;
928 std::vector<DimensionConstraint> dimension_constraints;
929 std::vector<AlignmentConstraint> alignment_constraints;
930 std::vector<OffsetConstraint> offset_constraints;
945 unsigned idx, LayoutConstraintID desc);
948 void serialize(Serializer& rez)
const;
949 void deserialize(Deserializer& derez);
951 std::multimap<unsigned, LayoutConstraintID> layouts;
954 inline std::ostream& operator<<(
955 std::ostream& os, ExecutionConstraintKind kind)
957#define CONSTRAINT_NAMES(name, desc) \
962 LEGION_EXECUTION_CONSTRAINT_KINDS(CONSTRAINT_NAMES)
964#undef CONSTRAINT_NAMES
968 inline std::ostream& operator<<(std::ostream& os, LayoutConstraintKind kind)
970#define CONSTRAINT_NAMES(name, desc) \
975 LEGION_LAYOUT_CONSTRAINT_KINDS(CONSTRAINT_NAMES)
977#undef CONSTRAINT_NAMES
Definition constraints.h:689
Definition constraints.h:202
Definition constraints.h:640
Definition geometry.h:154
Definition constraints.h:240
Definition constraints.h:475
Definition constraints.h:61
Definition constraints.h:167
Definition constraints.h:275
Definition constraints.h:881
Definition constraints.h:422
Definition constraints.h:737
Definition constraints.h:538
Definition constraints.h:830
Definition constraints.h:783
Definition constraints.h:95
Definition constraints.h:132
Definition constraints.h:357
Definition constraints.h:942
Definition constraints.h:592