16 #ifndef __LEGION_DOMAIN_H__
17 #define __LEGION_DOMAIN_H__
31 template<
int DIM,
typename T = coord_t>
32 using Point = Realm::Point<DIM,T>;
33 template<
int DIM,
typename T = coord_t>
34 using Rect = Realm::Rect<DIM,T>;
35 template<
int M,
int N,
typename T = coord_t>
36 using Transform = Realm::Matrix<M,N,T>;
45 template<
int M,
int N,
typename T = coord_t>
48 static_assert(M > 0,
"M must be positive");
49 static_assert(N > 0,
"N must be positive");
50 static_assert(std::is_integral<T>::value,
"must be integral type");
55 template<
typename T2> __CUDA_HD__
57 template<
typename T2,
typename T3> __CUDA_HD__
58 AffineTransform(
const Transform<M,N,T2> transform,
59 const Point<M,T3> offset);
61 template<
typename T2> __CUDA_HD__
65 template<
typename T2> __CUDA_HD__
66 Point<M,T> operator[](
const Point<N,T2> point)
const;
68 template<
int P> __CUDA_HD__
72 bool is_identity(
void)
const;
75 Transform<M,N,T> transform;
91 template<
int M,
int N,
typename T = coord_t>
94 static_assert(M > 0,
"M must be positive");
95 static_assert(M > 0,
"N must be positive");
96 static_assert(std::is_integral<T>::value,
"must be integral type");
101 template<
typename T2> __CUDA_HD__
103 template<
typename T2,
typename T3,
typename T4> __CUDA_HD__
104 ScaleTransform(
const Transform<M,N,T2> transform,
105 const Rect<M,T3> extent,
106 const Point<M,T4> divisor);
108 template<
typename T2> __CUDA_HD__
112 template<
typename T2> __CUDA_HD__
113 Rect<M,T> operator[](
const Point<N,T2> point)
const;
116 bool is_identity(
void)
const;
118 Transform<M,N,T> transform;
124 template<
int DIM,
typename T = coord_t>
125 using DomainT = Realm::IndexSpace<DIM,T>;
134 static constexpr
int MAX_POINT_DIM = LEGION_MAX_DIM;
139 DomainPoint(coord_t index);
141 DomainPoint(
const DomainPoint &rhs);
142 template<
int DIM,
typename T> __CUDA_HD__
143 DomainPoint(
const Point<DIM,T> &rhs);
145 template<
unsigned DIM>
146 operator LegionRuntime::Arrays::Point<DIM>(void)
const;
147 template<
int DIM,
typename T> __CUDA_HD__
148 operator Point<DIM,T>(void)
const;
151 DomainPoint& operator=(
const DomainPoint &rhs);
152 template<
int DIM,
typename T> __CUDA_HD__
153 DomainPoint& operator=(
const Point<DIM,T> &rhs);
155 bool operator==(
const DomainPoint &rhs)
const;
157 bool operator!=(
const DomainPoint &rhs)
const;
159 bool operator<(
const DomainPoint &rhs)
const;
162 DomainPoint operator+(coord_t scalar)
const;
164 DomainPoint operator+(
const DomainPoint &rhs)
const;
166 DomainPoint& operator+=(coord_t scalar);
168 DomainPoint& operator+=(
const DomainPoint &rhs);
171 DomainPoint operator-(coord_t scalar)
const;
173 DomainPoint operator-(
const DomainPoint &rhs)
const;
175 DomainPoint& operator-=(coord_t scalar);
177 DomainPoint& operator-=(
const DomainPoint &rhs);
180 DomainPoint operator*(coord_t scalar)
const;
182 DomainPoint operator*(
const DomainPoint &rhs)
const;
184 DomainPoint& operator*=(coord_t scalar);
186 DomainPoint& operator*=(
const DomainPoint &rhs);
189 DomainPoint operator/(coord_t scalar)
const;
191 DomainPoint operator/(
const DomainPoint &rhs)
const;
193 DomainPoint& operator/=(coord_t scalar);
195 DomainPoint& operator/=(
const DomainPoint &rhs);
198 DomainPoint operator%(coord_t scalar)
const;
200 DomainPoint operator%(
const DomainPoint &rhs)
const;
202 DomainPoint& operator%=(coord_t scalar);
204 DomainPoint& operator%=(
const DomainPoint &rhs);
207 coord_t& operator[](
unsigned index);
209 const coord_t& operator[](
unsigned index)
const;
213 bool operator()(
const DomainPoint& a,
const DomainPoint& b)
const
215 if(a.dim < b.dim)
return true;
216 if(a.dim > b.dim)
return false;
217 for(
int i = 0; (i == 0) || (i < a.dim); i++) {
218 if(a.point_data[i] < b.point_data[i])
return true;
219 if(a.point_data[i] > b.point_data[i])
return false;
226 static DomainPoint from_point(
227 typename LegionRuntime::Arrays::Point<DIM> p);
230 Color get_color(
void)
const;
232 coord_t get_index(
void)
const;
234 int get_dim(
void)
const;
237 LegionRuntime::Arrays::Point<DIM> get_point(
void)
const;
240 bool is_null(
void)
const;
243 static DomainPoint nil(
void);
246 template<
typename T> __CUDA_HD__
247 static inline coord_t check_for_overflow(
const T &value);
250 coord_t point_data[MAX_POINT_DIM];
252 friend std::ostream& operator<<(std::ostream& os,
const DomainPoint& dp);
262 typedef ::realm_id_t IDType;
265 static constexpr
int MAX_RECT_DIM = LEGION_MAX_DIM;
269 Domain(
const Domain& other);
273 template<
int DIM,
typename T> __CUDA_HD__
274 Domain(
const Rect<DIM,T> &other);
276 template<
int DIM,
typename T> __CUDA_HD__
277 Domain(
const DomainT<DIM,T> &other);
280 Domain& operator=(
const Domain& other);
281 template<
int DIM,
typename T> __CUDA_HD__
282 Domain& operator=(
const Rect<DIM,T> &other);
283 template<
int DIM,
typename T> __CUDA_HD__
284 Domain& operator=(
const DomainT<DIM,T> &other);
287 bool operator==(
const Domain &rhs)
const;
289 bool operator!=(
const Domain &rhs)
const;
291 bool operator<(
const Domain &rhs)
const;
303 static const Domain NO_DOMAIN;
306 bool exists(
void)
const;
308 bool dense(
void)
const;
310 template<
int DIM,
typename T> __CUDA_HD__
311 Rect<DIM,T> bounds(
void)
const;
314 static Domain from_rect(
typename LegionRuntime::Arrays::Rect<DIM> r);
317 static Domain from_point(
typename LegionRuntime::Arrays::Point<DIM> p);
320 operator LegionRuntime::Arrays::Rect<DIM>(void)
const;
322 template<
int DIM,
typename T> __CUDA_HD__
323 operator Rect<DIM,T>(void)
const;
325 template<
int DIM,
typename T>
326 operator DomainT<DIM,T>(void)
const;
329 static Domain from_domain_point(
const DomainPoint &p);
335 bool is_valid(
void)
const;
341 bool contains_bounds_only(
const DomainPoint &point)
const;
344 int get_dim(
void)
const;
346 bool empty(
void)
const;
348 size_t get_volume(
void)
const;
357 Domain intersection(
const Domain &other)
const;
364 LegionRuntime::Arrays::Rect<DIM> get_rect(
void)
const;
373 operator bool(
void)
const;
382 #if __cplusplus >= 201402L
385 static_assert(std::is_trivially_copyable<
386 Realm::IndexSpaceIterator<MAX_RECT_DIM,coord_t> >::value,
"very bad");
387 static_assert(std::is_trivially_copyable<
388 Realm::PointInRectIterator<MAX_RECT_DIM,coord_t> >::value,
"very bad");
391 sizeof(Realm::IndexSpaceIterator<MAX_RECT_DIM,coord_t>)];
392 uint8_t rect_iterator[
393 sizeof(Realm::PointInRectIterator<MAX_RECT_DIM,coord_t>)];
395 bool is_valid, rect_valid;
409 #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)
414 coord_t rect_data[2 * MAX_RECT_DIM];
419 template<
typename T> __CUDA_HD__
420 static inline coord_t check_for_overflow(
const T &value);
421 struct ContainsFunctor {
423 ContainsFunctor(
const Domain &d,
const DomainPoint &p,
bool &res)
424 : domain(d), point(p), result(res) { }
425 template<
typename N,
typename T>
426 static inline void demux(ContainsFunctor *functor)
428 DomainT<N::N,T> is = functor->domain;
429 Point<N::N,T> p = functor->point;
430 functor->result = is.contains(p);
433 const Domain &domain;
434 const DomainPoint &point;
437 struct VolumeFunctor {
439 VolumeFunctor(
const Domain &d,
size_t &r)
440 : domain(d), result(r) { }
441 template<
typename N,
typename T>
442 static inline void demux(VolumeFunctor *functor)
444 DomainT<N::N,T> is = functor->domain;
445 functor->result = is.volume();
448 const Domain &domain;
451 struct IntersectionFunctor {
453 IntersectionFunctor(
const Domain &l,
const Domain &r, Domain &res)
454 : lhs(l), rhs(r), result(res) { }
456 template<
typename N,
typename T>
457 static inline void demux(IntersectionFunctor *functor)
459 DomainT<N::N,T> is1 = functor->lhs;
460 DomainT<N::N,T> is2 = functor->rhs;
461 Realm::ProfilingRequestSet dummy_requests;
462 DomainT<N::N,T> temp;
463 Internal::LgEvent wait_on(
464 DomainT<N::N,T>::compute_intersection(is1, is2,
465 temp, dummy_requests));
466 if (wait_on.exists())
468 functor->result = Domain(temp.tighten());
476 struct IteratorInitFunctor {
478 IteratorInitFunctor(
const Domain &d, DomainPointIterator &i)
479 : domain(d), iterator(i) { }
481 template<
typename N,
typename T>
482 static inline void demux(IteratorInitFunctor *functor)
484 DomainT<N::N,T> is = functor->domain;
485 Realm::IndexSpaceIterator<N::N,T> is_itr(is);
486 static_assert(
sizeof(is_itr) <=
487 sizeof(functor->iterator.is_iterator),
"very bad");
488 functor->iterator.is_valid = is_itr.valid;
492 Realm::Rect<N::N,coord_t> rect = is_itr.rect;
493 Realm::PointInRectIterator<N::N,coord_t> rect_itr(rect);
494 static_assert(
sizeof(rect_itr) <=
495 sizeof(functor->iterator.rect_iterator),
"very bad");
496 assert(rect_itr.valid);
497 functor->iterator.rect_valid =
true;
498 functor->iterator.p = rect_itr.p;
499 memcpy(functor->iterator.rect_iterator, &rect_itr,
sizeof(rect_itr));
500 memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
503 functor->iterator.rect_valid =
false; \
506 const Domain &domain;
507 DomainPointIterator &iterator;
509 struct IteratorStepFunctor {
511 IteratorStepFunctor(DomainPointIterator &i)
514 template<
typename N,
typename T>
515 static inline void demux(IteratorStepFunctor *functor)
519 assert(!functor->iterator.rect_valid);
521 Realm::IndexSpaceIterator<N::N,T> is_itr;
522 memcpy(&is_itr, functor->iterator.is_iterator,
sizeof(is_itr));
524 functor->iterator.is_valid = is_itr.valid;
528 Realm::Rect<N::N,coord_t> rect = is_itr.rect;
529 Realm::PointInRectIterator<N::N,coord_t> new_rectitr(rect);
531 assert(new_rectitr.valid);
533 functor->iterator.rect_valid =
true;
534 functor->iterator.p = new_rectitr.p;
535 memcpy(functor->iterator.rect_iterator, &new_rectitr,
536 sizeof(new_rectitr));
537 memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
541 DomainPointIterator &iterator;
545 template<
int DIM,
typename COORD_T = coord_t>
548 static_assert(DIM > 0,
"DIM must be positive");
549 static_assert(std::is_integral<COORD_T>::value,
"must be integral type");
554 PointInRectIterator(
const Rect<DIM,COORD_T> &r,
555 bool column_major_order =
true);
558 inline bool valid(
void)
const;
560 inline bool step(
void);
563 inline bool operator()(
void)
const;
565 inline Point<DIM,COORD_T> operator*(
void)
const;
567 inline COORD_T operator[](
unsigned index)
const;
569 inline const Point<DIM,COORD_T>* operator->(
void)
const;
575 Realm::PointInRectIterator<DIM,COORD_T> itr;
578 template<
int DIM,
typename COORD_T = coord_t>
581 static_assert(DIM > 0,
"DIM must be positive");
582 static_assert(std::is_integral<COORD_T>::value,
"must be integral type");
587 inline bool valid(
void)
const;
588 inline bool step(
void);
590 inline bool operator()(
void)
const;
591 inline Rect<DIM,COORD_T> operator*(
void)
const;
592 inline const Rect<DIM,COORD_T>* operator->(
void)
const;
596 Realm::IndexSpaceIterator<DIM,COORD_T> itr;
599 template<
int DIM,
typename COORD_T = coord_t>
602 static_assert(DIM > 0,
"DIM must be positive");
603 static_assert(std::is_integral<COORD_T>::value,
"must be integral type");
607 bool column_major_order =
true);
609 inline bool valid(
void)
const;
610 inline bool step(
void);
612 inline bool operator()(
void)
const;
613 inline Point<DIM,COORD_T> operator*(
void)
const;
614 inline COORD_T operator[](
unsigned index)
const;
615 inline const Point<DIM,COORD_T>* operator->(
void)
const;
634 DomainTransform(
const DomainTransform &rhs);
635 template<
int M,
int N,
typename T> __CUDA_HD__
636 DomainTransform(
const Transform<M,N,T> &rhs);
639 DomainTransform& operator=(
const DomainTransform &rhs);
640 template<
int M,
int N,
typename T> __CUDA_HD__
641 DomainTransform& operator=(
const Transform<M,N,T> &rhs);
643 bool operator==(
const DomainTransform &rhs)
const;
645 bool operator!=(
const DomainTransform &rhs)
const;
647 template<
int M,
int N,
typename T> __CUDA_HD__
648 operator Transform<M,N,T>(void)
const;
653 Domain operator*(
const Domain &domain)
const;
655 DomainTransform operator*(
const DomainTransform &transform)
const;
658 bool is_identity(
void)
const;
661 coord_t matrix[LEGION_MAX_DIM * LEGION_MAX_DIM];
674 DomainAffineTransform(
const DomainAffineTransform &rhs);
677 template<
int M,
int N,
typename T> __CUDA_HD__
681 DomainAffineTransform& operator=(
const DomainAffineTransform &rhs);
682 template<
int M,
int N,
typename T> __CUDA_HD__
685 bool operator==(
const DomainAffineTransform &rhs)
const;
687 bool operator!=(
const DomainAffineTransform &rhs)
const;
689 template<
int M,
int N,
typename T> __CUDA_HD__
697 bool is_identity(
void)
const;
713 DomainScaleTransform(
const DomainScaleTransform &rhs);
717 template<
int M,
int N,
typename T> __CUDA_HD__
721 DomainScaleTransform& operator=(
const DomainScaleTransform &rhs);
722 template<
int M,
int N,
typename T> __CUDA_HD__
725 bool operator==(
const DomainScaleTransform &rhs)
const;
727 bool operator!=(
const DomainScaleTransform &rhs)
const;
729 template<
int M,
int N,
typename T> __CUDA_HD__
737 bool is_identity(
void)
const;
752 template<
typename FT, PrivilegeMode PM = LEGION_READ_WRITE>
758 typedef std::random_access_iterator_tag iterator_category;
759 typedef FT value_type;
760 typedef std::ptrdiff_t difference_type;
762 typedef FT& reference;
764 iterator(
void) : ptr(NULL), stride(0) { }
766 iterator(uint8_t *p,
size_t s) : ptr(p), stride(s) { }
769 { ptr = rhs.ptr; stride = rhs.stride;
return *
this; }
770 inline iterator& operator+=(
int rhs) { ptr += stride;
return *
this; }
771 inline iterator& operator-=(
int rhs) { ptr -= stride;
return *
this; }
772 inline FT& operator*(
void)
const
775 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
776 memcpy(&result, &ptr,
sizeof(result));
779 inline FT* operator->(
void)
const
782 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
783 memcpy(&result, &ptr,
sizeof(result));
786 inline FT& operator[](
int rhs)
const
789 uint8_t *ptr2 = ptr + rhs * stride;
790 static_assert(
sizeof(result) ==
sizeof(ptr2),
"C++ is dumb");
791 memcpy(&result, &ptr2,
sizeof(result));
795 inline iterator& operator++(
void) { ptr += stride;
return *
this; }
796 inline iterator& operator--(
void) { ptr -= stride;
return *
this; }
798 {
iterator it(ptr, stride); ptr += stride;
return it; }
800 {
iterator it(ptr, stride); ptr -= stride;
return it; }
801 inline iterator operator+(
int rhs)
const
802 {
return iterator(ptr + stride * rhs, stride); }
803 inline iterator operator-(
int rhs)
const
804 {
return iterator(ptr - stride * rhs, stride); }
806 inline bool operator==(
const iterator &rhs)
const
807 {
return (ptr == rhs.ptr); }
808 inline bool operator!=(
const iterator &rhs)
const
809 {
return (ptr != rhs.ptr); }
810 inline bool operator<(
const iterator &rhs)
const
811 {
return (ptr < rhs.ptr); }
812 inline bool operator>(
const iterator &rhs)
const
813 {
return (ptr > rhs.ptr); }
814 inline bool operator<=(
const iterator &rhs)
const
815 {
return (ptr <= rhs.ptr); }
816 inline bool operator>=(
const iterator &rhs)
const
817 {
return (ptr >= rhs.ptr); }
825 typedef std::random_access_iterator_tag iterator_category;
826 typedef FT value_type;
827 typedef std::ptrdiff_t difference_type;
829 typedef FT& reference;
836 { ptr = rhs.ptr; stride = rhs.stride;
return *
this; }
838 { ptr -= stride;
return *
this; }
840 { ptr += stride;
return *
this; }
841 inline FT& operator*(
void)
const
844 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
845 memcpy(&result, &ptr,
sizeof(result));
848 inline FT* operator->(
void)
const
851 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
852 memcpy(&result, &ptr,
sizeof(result));
855 inline FT& operator[](
int rhs)
const
858 uint8_t *ptr2 = ptr - rhs * stride;
859 static_assert(
sizeof(result) ==
sizeof(ptr2),
"C++ is dumb");
860 memcpy(&result, &ptr2,
sizeof(result));
865 { ptr -= stride;
return *
this; }
867 { ptr += stride;
return *
this; }
878 {
return (ptr == rhs.ptr); }
880 {
return (ptr != rhs.ptr); }
882 {
return (ptr > rhs.ptr); }
884 {
return (ptr < rhs.ptr); }
886 {
return (ptr >= rhs.ptr); }
888 {
return (ptr <= rhs.ptr); }
894 Span(
void) : base(NULL), extent(0), stride(0) { }
895 Span(FT *b,
size_t e,
size_t s =
sizeof(FT))
896 : base(NULL), extent(e), stride(s)
898 static_assert(
sizeof(base) ==
sizeof(b),
"C++ is dumb");
899 memcpy(&base, &b,
sizeof(base));
902 inline iterator begin(
void)
const {
return iterator(base, stride); }
903 inline iterator end(
void)
const
904 {
return iterator(base + extent*stride, stride); }
905 inline reverse_iterator rbegin(
void)
const
906 {
return reverse_iterator(base + (extent-1) * stride, stride); }
907 inline reverse_iterator rend(
void)
const
908 {
return reverse_iterator(base - stride, stride); }
910 inline FT& front(
void)
const
913 static_assert(
sizeof(result) ==
sizeof(base),
"C++ is dumb");
914 memcpy(&result, &base,
sizeof(result));
917 inline FT& back(
void)
const
920 uint8_t *ptr = base + (extent-1)*stride;
921 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
922 memcpy(&result, &ptr,
sizeof(result));
925 inline FT& operator[](
int index)
const
928 uint8_t *ptr = base + index * stride;
929 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
930 memcpy(&result, &ptr,
sizeof(result));
933 inline FT* data(
void)
const
936 static_assert(
sizeof(result) ==
sizeof(base),
"C++ is dumb");
937 memcpy(&result, &base,
sizeof(result));
940 inline uintptr_t get_base(
void)
const {
return uintptr_t(base); }
942 inline size_t size(
void)
const {
return extent; }
943 inline size_t step(
void)
const {
return stride; }
944 inline bool empty(
void)
const {
return (extent == 0); }
953 #include "legion/legion_domain.inl"
955 #endif // __LEGION_DOMAIN_H__
Definition: legion_domain.h:366
Definition: legion_domain.h:822
Definition: legion_domain.h:211
Definition: legion_domain.h:579
Definition: legion_domain.h:629
Definition: legion_domain.h:260
Definition: legion_domain.h:708
Definition: legion_domain.h:753
Definition: legion_domain.h:132
Definition: legion_domain.h:600
Definition: legion_domain.h:546
Definition: legion_domain.h:669
Definition: legion_domain.h:755