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__
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__
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;
142 template<
int DIM,
typename T> __CUDA_HD__
145 template<
int DIM,
typename T> __CUDA_HD__
146 operator Point<DIM,T>(
void)
const;
150 template<
int DIM,
typename T> __CUDA_HD__
205 coord_t& operator[](
unsigned index);
207 const coord_t& operator[](
unsigned index)
const;
213 if(a.dim < b.dim)
return true;
214 if(a.dim > b.dim)
return false;
215 for(
int i = 0; (i == 0) || (i < a.dim); i++) {
216 if(a.point_data[i] < b.point_data[i])
return true;
217 if(a.point_data[i] > b.point_data[i])
return false;
224 Color get_color(
void)
const;
226 coord_t get_index(
void)
const;
228 int get_dim(
void)
const;
230 inline bool exists(
void)
const {
return (get_dim() > 0); }
233 bool is_null(
void)
const;
239 template<
typename T> __CUDA_HD__
240 static inline coord_t check_for_overflow(
const T &value);
243 coord_t point_data[MAX_POINT_DIM];
245 friend std::ostream& operator<<(std::ostream& os,
const DomainPoint& dp);
255 typedef ::realm_id_t IDType;
258 static constexpr
int MAX_RECT_DIM = LEGION_MAX_DIM;
268 template<
int DIM,
typename T> __CUDA_HD__
269 Domain(
const Rect<DIM,T> &other);
271 template<
int DIM,
typename T> __CUDA_HD__
272 Domain(
const DomainT<DIM,T> &other);
278 template<
int DIM,
typename T> __CUDA_HD__
279 Domain& operator=(
const Rect<DIM,T> &other);
280 template<
int DIM,
typename T> __CUDA_HD__
281 Domain& operator=(
const DomainT<DIM,T> &other);
284 bool operator==(
const Domain &rhs)
const;
286 bool operator!=(
const Domain &rhs)
const;
288 bool operator<(
const Domain &rhs)
const;
300 static const Domain NO_DOMAIN;
303 bool exists(
void)
const;
305 bool dense(
void)
const;
307 template<
int DIM,
typename T> __CUDA_HD__
308 Rect<DIM,T> bounds(
void)
const;
310 template<
int DIM,
typename T> __CUDA_HD__
311 operator Rect<DIM,T>(
void)
const;
313 template<
int DIM,
typename T>
314 operator DomainT<DIM,T>(
void)
const;
323 bool is_valid(
void)
const;
329 bool contains_bounds_only(
const DomainPoint &point)
const;
332 int get_dim(
void)
const;
334 bool empty(
void)
const;
336 size_t get_volume(
void)
const;
358 operator bool(
void)
const;
367 #if !defined(__GNUC__) || (__GNUC__ >= 5)
370 static_assert(std::is_trivially_copyable<
371 Realm::IndexSpaceIterator<MAX_RECT_DIM,coord_t> >::value,
"very bad");
372 static_assert(std::is_trivially_copyable<
373 Realm::PointInRectIterator<MAX_RECT_DIM,coord_t> >::value,
"very bad");
376 sizeof(Realm::IndexSpaceIterator<MAX_RECT_DIM,coord_t>)];
377 uint8_t rect_iterator[
378 sizeof(Realm::PointInRectIterator<MAX_RECT_DIM,coord_t>)];
380 bool is_valid, rect_valid;
394 #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)
399 coord_t rect_data[2 * MAX_RECT_DIM];
404 template<
typename T> __CUDA_HD__
405 static inline coord_t check_for_overflow(
const T &value);
406 struct ContainsFunctor {
409 : domain(d), point(p), result(res) { }
410 template<
typename N,
typename T>
411 static inline void demux(ContainsFunctor *functor)
413 DomainT<N::N,T> is = functor->domain;
414 Point<N::N,T> p = functor->point;
415 functor->result = is.contains(p);
418 const Domain &domain;
419 const DomainPoint &point;
422 struct VolumeFunctor {
424 VolumeFunctor(
const Domain &d,
size_t &r)
425 : domain(d), result(r) { }
426 template<
typename N,
typename T>
427 static inline void demux(VolumeFunctor *functor)
429 DomainT<N::N,T> is = functor->domain;
430 functor->result = is.volume();
433 const Domain &domain;
436 struct IntersectionFunctor {
438 IntersectionFunctor(
const Domain &l,
const Domain &r, Domain &res)
439 : lhs(l), rhs(r), result(res) { }
441 template<
typename N,
typename T>
442 static inline void demux(IntersectionFunctor *functor)
444 DomainT<N::N,T> is1 = functor->lhs;
445 DomainT<N::N,T> is2 = functor->rhs;
446 Realm::ProfilingRequestSet dummy_requests;
447 DomainT<N::N,T> temp;
448 Internal::LgEvent wait_on(
449 DomainT<N::N,T>::compute_intersection(is1, is2,
450 temp, dummy_requests));
451 if (wait_on.exists())
453 functor->result = Domain(temp.tighten());
461 struct IteratorInitFunctor {
463 IteratorInitFunctor(
const Domain &d, DomainPointIterator &i)
464 : domain(d), iterator(i) { }
466 template<
typename N,
typename T>
467 static inline void demux(IteratorInitFunctor *functor)
469 DomainT<N::N,T> is = functor->domain;
470 Realm::IndexSpaceIterator<N::N,T> is_itr(is);
471 static_assert(
sizeof(is_itr) <=
472 sizeof(functor->iterator.is_iterator),
"very bad");
473 functor->iterator.is_valid = is_itr.valid;
477 Realm::Rect<N::N,coord_t> rect = is_itr.rect;
478 Realm::PointInRectIterator<N::N,coord_t> rect_itr(rect);
479 static_assert(
sizeof(rect_itr) <=
480 sizeof(functor->iterator.rect_iterator),
"very bad");
481 assert(rect_itr.valid);
482 functor->iterator.rect_valid =
true;
483 functor->iterator.p = rect_itr.p;
484 memcpy(functor->iterator.rect_iterator, &rect_itr,
sizeof(rect_itr));
485 memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
488 functor->iterator.rect_valid =
false; \
491 const Domain &domain;
492 DomainPointIterator &iterator;
494 struct IteratorStepFunctor {
496 IteratorStepFunctor(DomainPointIterator &i)
499 template<
typename N,
typename T>
500 static inline void demux(IteratorStepFunctor *functor)
504 assert(!functor->iterator.rect_valid);
506 Realm::IndexSpaceIterator<N::N,T> is_itr;
507 memcpy(&is_itr, functor->iterator.is_iterator,
sizeof(is_itr));
509 functor->iterator.is_valid = is_itr.valid;
513 Realm::Rect<N::N,coord_t> rect = is_itr.rect;
514 Realm::PointInRectIterator<N::N,coord_t> new_rectitr(rect);
516 assert(new_rectitr.valid);
518 functor->iterator.rect_valid =
true;
519 functor->iterator.p = new_rectitr.p;
520 memcpy(functor->iterator.rect_iterator, &new_rectitr,
521 sizeof(new_rectitr));
522 memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
526 DomainPointIterator &iterator;
530 template<
int DIM,
typename COORD_T = coord_t>
533 static_assert(DIM > 0,
"DIM must be positive");
534 static_assert(std::is_integral<COORD_T>::value,
"must be integral type");
540 bool column_major_order =
true);
543 inline bool valid(
void)
const;
545 inline bool step(
void);
548 inline bool operator()(
void)
const;
550 inline Point<DIM,COORD_T> operator*(
void)
const;
552 inline COORD_T operator[](
unsigned index)
const;
554 inline const Point<DIM,COORD_T>* operator->(
void)
const;
560 Realm::PointInRectIterator<DIM,COORD_T> itr;
563 template<
int DIM,
typename COORD_T = coord_t>
566 static_assert(DIM > 0,
"DIM must be positive");
567 static_assert(std::is_integral<COORD_T>::value,
"must be integral type");
572 inline bool valid(
void)
const;
573 inline bool step(
void);
575 inline bool operator()(
void)
const;
576 inline Rect<DIM,COORD_T> operator*(
void)
const;
577 inline const Rect<DIM,COORD_T>* operator->(
void)
const;
581 Realm::IndexSpaceIterator<DIM,COORD_T> itr;
584 template<
int DIM,
typename COORD_T = coord_t>
587 static_assert(DIM > 0,
"DIM must be positive");
588 static_assert(std::is_integral<COORD_T>::value,
"must be integral type");
592 bool column_major_order =
true);
594 inline bool valid(
void)
const;
595 inline bool step(
void);
597 inline bool operator()(
void)
const;
598 inline Point<DIM,COORD_T> operator*(
void)
const;
599 inline COORD_T operator[](
unsigned index)
const;
600 inline const Point<DIM,COORD_T>* operator->(
void)
const;
620 template<
int M,
int N,
typename T> __CUDA_HD__
625 template<
int M,
int N,
typename T> __CUDA_HD__
632 template<
int M,
int N,
typename T> __CUDA_HD__
633 operator Transform<M,N,T>(
void)
const;
643 bool is_identity(
void)
const;
646 coord_t matrix[LEGION_MAX_DIM * LEGION_MAX_DIM];
662 template<
int M,
int N,
typename T> __CUDA_HD__
667 template<
int M,
int N,
typename T> __CUDA_HD__
674 template<
int M,
int N,
typename T> __CUDA_HD__
682 bool is_identity(
void)
const;
702 template<
int M,
int N,
typename T> __CUDA_HD__
707 template<
int M,
int N,
typename T> __CUDA_HD__
714 template<
int M,
int N,
typename T> __CUDA_HD__
722 bool is_identity(
void)
const;
737 template<
typename FT, PrivilegeMode PM = LEGION_READ_WRITE>
743 typedef std::random_access_iterator_tag iterator_category;
744 typedef FT value_type;
745 typedef std::ptrdiff_t difference_type;
747 typedef FT& reference;
749 iterator(
void) : ptr(NULL), stride(0) { }
751 iterator(uint8_t *p,
size_t s) : ptr(p), stride(s) { }
754 { ptr = rhs.ptr; stride = rhs.stride;
return *
this; }
755 inline iterator& operator+=(
int rhs) { ptr += stride;
return *
this; }
756 inline iterator& operator-=(
int rhs) { ptr -= stride;
return *
this; }
757 inline FT& operator*(
void)
const
760 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
761 memcpy(&result, &ptr,
sizeof(result));
764 inline FT* operator->(
void)
const
767 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
768 memcpy(&result, &ptr,
sizeof(result));
771 inline FT& operator[](
int rhs)
const
774 uint8_t *ptr2 = ptr + rhs * stride;
775 static_assert(
sizeof(result) ==
sizeof(ptr2),
"C++ is dumb");
776 memcpy(&result, &ptr2,
sizeof(result));
780 inline iterator& operator++(
void) { ptr += stride;
return *
this; }
781 inline iterator& operator--(
void) { ptr -= stride;
return *
this; }
783 {
iterator it(ptr, stride); ptr += stride;
return it; }
785 {
iterator it(ptr, stride); ptr -= stride;
return it; }
786 inline iterator operator+(
int rhs)
const
787 {
return iterator(ptr + stride * rhs, stride); }
788 inline iterator operator-(
int rhs)
const
789 {
return iterator(ptr - stride * rhs, stride); }
791 inline bool operator==(
const iterator &rhs)
const
792 {
return (ptr == rhs.ptr); }
793 inline bool operator!=(
const iterator &rhs)
const
794 {
return (ptr != rhs.ptr); }
795 inline bool operator<(
const iterator &rhs)
const
796 {
return (ptr < rhs.ptr); }
797 inline bool operator>(
const iterator &rhs)
const
798 {
return (ptr > rhs.ptr); }
799 inline bool operator<=(
const iterator &rhs)
const
800 {
return (ptr <= rhs.ptr); }
801 inline bool operator>=(
const iterator &rhs)
const
802 {
return (ptr >= rhs.ptr); }
810 typedef std::random_access_iterator_tag iterator_category;
811 typedef FT value_type;
812 typedef std::ptrdiff_t difference_type;
814 typedef FT& reference;
821 { ptr = rhs.ptr; stride = rhs.stride;
return *
this; }
823 { ptr -= stride;
return *
this; }
825 { ptr += stride;
return *
this; }
826 inline FT& operator*(
void)
const
829 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
830 memcpy(&result, &ptr,
sizeof(result));
833 inline FT* operator->(
void)
const
836 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
837 memcpy(&result, &ptr,
sizeof(result));
840 inline FT& operator[](
int rhs)
const
843 uint8_t *ptr2 = ptr - rhs * stride;
844 static_assert(
sizeof(result) ==
sizeof(ptr2),
"C++ is dumb");
845 memcpy(&result, &ptr2,
sizeof(result));
850 { ptr -= stride;
return *
this; }
852 { ptr += stride;
return *
this; }
863 {
return (ptr == rhs.ptr); }
865 {
return (ptr != rhs.ptr); }
867 {
return (ptr > rhs.ptr); }
869 {
return (ptr < rhs.ptr); }
871 {
return (ptr >= rhs.ptr); }
873 {
return (ptr <= rhs.ptr); }
879 Span(
void) : base(NULL), extent(0), stride(0) { }
880 Span(FT *b,
size_t e,
size_t s =
sizeof(FT))
881 : base(NULL), extent(e), stride(s)
883 static_assert(
sizeof(base) ==
sizeof(b),
"C++ is dumb");
884 memcpy(&base, &b,
sizeof(base));
887 inline iterator begin(
void)
const {
return iterator(base, stride); }
888 inline iterator end(
void)
const
889 {
return iterator(base + extent*stride, stride); }
890 inline reverse_iterator rbegin(
void)
const
891 {
return reverse_iterator(base + (extent-1) * stride, stride); }
892 inline reverse_iterator rend(
void)
const
893 {
return reverse_iterator(base - stride, stride); }
895 inline FT& front(
void)
const
898 static_assert(
sizeof(result) ==
sizeof(base),
"C++ is dumb");
899 memcpy(&result, &base,
sizeof(result));
902 inline FT& back(
void)
const
905 uint8_t *ptr = base + (extent-1)*stride;
906 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
907 memcpy(&result, &ptr,
sizeof(result));
910 inline FT& operator[](
int index)
const
913 uint8_t *ptr = base + index * stride;
914 static_assert(
sizeof(result) ==
sizeof(ptr),
"C++ is dumb");
915 memcpy(&result, &ptr,
sizeof(result));
918 inline FT* data(
void)
const
921 static_assert(
sizeof(result) ==
sizeof(base),
"C++ is dumb");
922 memcpy(&result, &base,
sizeof(result));
925 inline uintptr_t get_base(
void)
const {
return uintptr_t(base); }
927 inline size_t size(
void)
const {
return extent; }
928 inline size_t step(
void)
const {
return stride; }
929 inline bool empty(
void)
const {
return (extent == 0); }
938 #include "legion/legion_domain.inl"
Definition: legion_domain.h:351
Definition: legion_domain.h:654
Definition: legion_domain.h:253
Definition: legion_domain.h:132
Definition: legion_domain.h:693
Definition: legion_domain.h:614
Definition: legion_domain.h:585
Definition: legion_domain.h:531
Definition: legion_domain.h:564
Definition: legion_domain.h:740
Definition: legion_domain.h:807
Definition: legion_domain.h:738
Definition: legion_domain.h:209