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 static_assert(std::is_trivially_copyable<
368 Realm::IndexSpaceIterator<MAX_RECT_DIM,coord_t> >::value);
369 static_assert(std::is_trivially_copyable<
370 Realm::PointInRectIterator<MAX_RECT_DIM,coord_t> >::value);
372 sizeof(Realm::IndexSpaceIterator<MAX_RECT_DIM,coord_t>)];
373 uint8_t rect_iterator[
374 sizeof(Realm::PointInRectIterator<MAX_RECT_DIM,coord_t>)];
376 bool is_valid, rect_valid;
390 #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)
395 coord_t rect_data[2 * MAX_RECT_DIM];
400 template<
typename T> __CUDA_HD__
401 static inline coord_t check_for_overflow(
const T &value);
402 struct ContainsFunctor {
405 : domain(d), point(p), result(res) { }
406 template<
typename N,
typename T>
407 static inline void demux(ContainsFunctor *functor)
409 DomainT<N::N,T> is = functor->domain;
410 Point<N::N,T> p = functor->point;
411 functor->result = is.contains(p);
414 const Domain &domain;
415 const DomainPoint &point;
418 struct VolumeFunctor {
420 VolumeFunctor(
const Domain &d,
size_t &r)
421 : domain(d), result(r) { }
422 template<
typename N,
typename T>
423 static inline void demux(VolumeFunctor *functor)
425 DomainT<N::N,T> is = functor->domain;
426 functor->result = is.volume();
429 const Domain &domain;
432 struct IntersectionFunctor {
434 IntersectionFunctor(
const Domain &l,
const Domain &r, Domain &res)
435 : lhs(l), rhs(r), result(res) { }
437 template<
typename N,
typename T>
438 static inline void demux(IntersectionFunctor *functor)
440 DomainT<N::N,T> is1 = functor->lhs;
441 DomainT<N::N,T> is2 = functor->rhs;
442 Realm::ProfilingRequestSet dummy_requests;
443 DomainT<N::N,T> temp;
444 Internal::LgEvent wait_on(
445 DomainT<N::N,T>::compute_intersection(is1, is2,
446 temp, dummy_requests));
447 if (wait_on.exists())
449 functor->result = Domain(temp.tighten());
457 struct IteratorInitFunctor {
459 IteratorInitFunctor(
const Domain &d, DomainPointIterator &i)
460 : domain(d), iterator(i) { }
462 template<
typename N,
typename T>
463 static inline void demux(IteratorInitFunctor *functor)
465 DomainT<N::N,T> is = functor->domain;
466 Realm::IndexSpaceIterator<N::N,T> is_itr(is);
467 static_assert(
sizeof(is_itr) <=
468 sizeof(functor->iterator.is_iterator));
469 functor->iterator.is_valid = is_itr.valid;
473 Realm::Rect<N::N,coord_t> rect = is_itr.rect;
474 Realm::PointInRectIterator<N::N,coord_t> rect_itr(rect);
475 static_assert(
sizeof(rect_itr) <=
476 sizeof(functor->iterator.rect_iterator));
477 assert(rect_itr.valid);
478 functor->iterator.rect_valid =
true;
479 functor->iterator.p = rect_itr.p;
480 memcpy(functor->iterator.rect_iterator, &rect_itr,
sizeof(rect_itr));
481 memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
484 functor->iterator.rect_valid =
false;
487 const Domain &domain;
488 DomainPointIterator &iterator;
490 struct IteratorStepFunctor {
492 IteratorStepFunctor(DomainPointIterator &i)
495 template<
typename N,
typename T>
496 static inline void demux(IteratorStepFunctor *functor)
500 assert(!functor->iterator.rect_valid);
502 Realm::IndexSpaceIterator<N::N,T> is_itr;
503 memcpy(&is_itr, functor->iterator.is_iterator,
sizeof(is_itr));
505 functor->iterator.is_valid = is_itr.valid;
509 Realm::Rect<N::N,coord_t> rect = is_itr.rect;
510 Realm::PointInRectIterator<N::N,coord_t> new_rectitr(rect);
512 assert(new_rectitr.valid);
514 functor->iterator.rect_valid =
true;
515 functor->iterator.p = new_rectitr.p;
516 memcpy(functor->iterator.rect_iterator, &new_rectitr,
517 sizeof(new_rectitr));
518 memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
522 DomainPointIterator &iterator;
526 template<
int DIM,
typename COORD_T = coord_t>
529 static_assert(DIM > 0,
"DIM must be positive");
530 static_assert(std::is_integral<COORD_T>::value,
"must be integral type");
536 bool column_major_order =
true);
539 inline bool valid(
void)
const;
541 inline bool step(
void);
544 inline bool operator()(
void)
const;
546 inline Point<DIM,COORD_T> operator*(
void)
const;
548 inline COORD_T operator[](
unsigned index)
const;
550 inline const Point<DIM,COORD_T>* operator->(
void)
const;
556 Realm::PointInRectIterator<DIM,COORD_T> itr;
559 template<
int DIM,
typename COORD_T = coord_t>
562 static_assert(DIM > 0,
"DIM must be positive");
563 static_assert(std::is_integral<COORD_T>::value,
"must be integral type");
568 inline bool valid(
void)
const;
569 inline bool step(
void);
571 inline bool operator()(
void)
const;
572 inline Rect<DIM,COORD_T> operator*(
void)
const;
573 inline const Rect<DIM,COORD_T>* operator->(
void)
const;
577 Realm::IndexSpaceIterator<DIM,COORD_T> itr;
580 template<
int DIM,
typename COORD_T = coord_t>
583 static_assert(DIM > 0,
"DIM must be positive");
584 static_assert(std::is_integral<COORD_T>::value,
"must be integral type");
588 bool column_major_order =
true);
590 inline bool valid(
void)
const;
591 inline bool step(
void);
593 inline bool operator()(
void)
const;
594 inline Point<DIM,COORD_T> operator*(
void)
const;
595 inline COORD_T operator[](
unsigned index)
const;
596 inline const Point<DIM,COORD_T>* operator->(
void)
const;
616 template<
int M,
int N,
typename T> __CUDA_HD__
621 template<
int M,
int N,
typename T> __CUDA_HD__
628 template<
int M,
int N,
typename T> __CUDA_HD__
629 operator Transform<M,N,T>(
void)
const;
639 bool is_identity(
void)
const;
642 coord_t matrix[LEGION_MAX_DIM * LEGION_MAX_DIM];
658 template<
int M,
int N,
typename T> __CUDA_HD__
663 template<
int M,
int N,
typename T> __CUDA_HD__
670 template<
int M,
int N,
typename T> __CUDA_HD__
678 bool is_identity(
void)
const;
698 template<
int M,
int N,
typename T> __CUDA_HD__
703 template<
int M,
int N,
typename T> __CUDA_HD__
710 template<
int M,
int N,
typename T> __CUDA_HD__
718 bool is_identity(
void)
const;
733 template<
typename FT, PrivilegeMode PM = LEGION_READ_WRITE>
739 typedef std::random_access_iterator_tag iterator_category;
740 typedef FT value_type;
741 typedef std::ptrdiff_t difference_type;
743 typedef FT& reference;
745 iterator(
void) : ptr(NULL), stride(0) { }
747 iterator(uint8_t *p,
size_t s) : ptr(p), stride(s) { }
750 { ptr = rhs.ptr; stride = rhs.stride;
return *
this; }
751 inline iterator& operator+=(
int rhs) { ptr += stride;
return *
this; }
752 inline iterator& operator-=(
int rhs) { ptr -= stride;
return *
this; }
753 inline FT& operator*(
void)
const
756 static_assert(
sizeof(result) ==
sizeof(ptr));
757 memcpy(&result, &ptr,
sizeof(result));
760 inline FT* operator->(
void)
const
763 static_assert(
sizeof(result) ==
sizeof(ptr));
764 memcpy(&result, &ptr,
sizeof(result));
767 inline FT& operator[](
int rhs)
const
770 uint8_t *ptr2 = ptr + rhs * stride;
771 static_assert(
sizeof(result) ==
sizeof(ptr2));
772 memcpy(&result, &ptr2,
sizeof(result));
776 inline iterator& operator++(
void) { ptr += stride;
return *
this; }
777 inline iterator& operator--(
void) { ptr -= stride;
return *
this; }
779 {
iterator it(ptr, stride); ptr += stride;
return it; }
781 {
iterator it(ptr, stride); ptr -= stride;
return it; }
782 inline iterator operator+(
int rhs)
const
783 {
return iterator(ptr + stride * rhs, stride); }
784 inline iterator operator-(
int rhs)
const
785 {
return iterator(ptr - stride * rhs, stride); }
787 inline bool operator==(
const iterator &rhs)
const
788 {
return (ptr == rhs.ptr); }
789 inline bool operator!=(
const iterator &rhs)
const
790 {
return (ptr != rhs.ptr); }
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); }
806 typedef std::random_access_iterator_tag iterator_category;
807 typedef FT value_type;
808 typedef std::ptrdiff_t difference_type;
810 typedef FT& reference;
817 { ptr = rhs.ptr; stride = rhs.stride;
return *
this; }
819 { ptr -= stride;
return *
this; }
821 { ptr += stride;
return *
this; }
822 inline FT& operator*(
void)
const
825 static_assert(
sizeof(result) ==
sizeof(ptr));
826 memcpy(&result, &ptr,
sizeof(result));
829 inline FT* operator->(
void)
const
832 static_assert(
sizeof(result) ==
sizeof(ptr));
833 memcpy(&result, &ptr,
sizeof(result));
836 inline FT& operator[](
int rhs)
const
839 uint8_t *ptr2 = ptr - rhs * stride;
840 static_assert(
sizeof(result) ==
sizeof(ptr2));
841 memcpy(&result, &ptr2,
sizeof(result));
846 { ptr -= stride;
return *
this; }
848 { ptr += stride;
return *
this; }
859 {
return (ptr == rhs.ptr); }
861 {
return (ptr != rhs.ptr); }
863 {
return (ptr > rhs.ptr); }
865 {
return (ptr < rhs.ptr); }
867 {
return (ptr >= rhs.ptr); }
869 {
return (ptr <= rhs.ptr); }
875 Span(
void) : base(NULL), extent(0), stride(0) { }
876 Span(FT *b,
size_t e,
size_t s =
sizeof(FT))
877 : base(NULL), extent(e), stride(s)
879 static_assert(
sizeof(base) ==
sizeof(b));
880 memcpy(&base, &b,
sizeof(base));
883 inline iterator begin(
void)
const {
return iterator(base, stride); }
884 inline iterator end(
void)
const
885 {
return iterator(base + extent*stride, stride); }
886 inline reverse_iterator rbegin(
void)
const
887 {
return reverse_iterator(base + (extent-1) * stride, stride); }
888 inline reverse_iterator rend(
void)
const
889 {
return reverse_iterator(base - stride, stride); }
891 inline FT& front(
void)
const
894 static_assert(
sizeof(result) ==
sizeof(base));
895 memcpy(&result, &base,
sizeof(result));
898 inline FT& back(
void)
const
901 uint8_t *ptr = base + (extent-1)*stride;
902 static_assert(
sizeof(result) ==
sizeof(ptr));
903 memcpy(&result, &ptr,
sizeof(result));
906 inline FT& operator[](
int index)
const
909 uint8_t *ptr = base + index * stride;
910 static_assert(
sizeof(result) ==
sizeof(ptr));
911 memcpy(&result, &ptr,
sizeof(result));
914 inline FT* data(
void)
const
917 static_assert(
sizeof(result) ==
sizeof(base));
918 memcpy(&result, &base,
sizeof(result));
921 inline uintptr_t get_base(
void)
const {
return uintptr_t(base); }
923 inline size_t size(
void)
const {
return extent; }
924 inline size_t step(
void)
const {
return stride; }
925 inline bool empty(
void)
const {
return (extent == 0); }
934 #include "legion/legion_domain.inl"
Definition: legion_domain.h:351
Definition: legion_domain.h:650
Definition: legion_domain.h:253
Definition: legion_domain.h:132
Definition: legion_domain.h:689
Definition: legion_domain.h:610
Definition: legion_domain.h:581
Definition: legion_domain.h:527
Definition: legion_domain.h:560
Definition: legion_domain.h:736
Definition: legion_domain.h:803
Definition: legion_domain.h:734
Definition: legion_domain.h:209