Legion Runtime
Loading...
Searching...
No Matches
physical_region.h
1/* Copyright 2026 Stanford University, NVIDIA Corporation
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef __LEGION_PHYSICAL_REGION_H__
17#define __LEGION_PHYSICAL_REGION_H__
18
19#include "legion/api/types.h"
20#include "legion/api/geometry.h"
21#include "legion/api/buffers.h"
22
23namespace Legion {
24
34 public:
35 PhysicalRegion(void);
37 PhysicalRegion(PhysicalRegion&& rhs) noexcept;
38 ~PhysicalRegion(void);
39 private:
40 Internal::PhysicalRegionImpl* impl;
41 protected:
42 FRIEND_ALL_RUNTIME_CLASSES
43 explicit PhysicalRegion(Internal::PhysicalRegionImpl* impl);
44 public:
45 PhysicalRegion& operator=(const PhysicalRegion& rhs);
46 PhysicalRegion& operator=(PhysicalRegion&& rhs) noexcept;
47 inline bool exists(void) const { return (impl != nullptr); }
48 inline bool operator==(const PhysicalRegion& reg) const
49 {
50 return (impl == reg.impl);
51 }
52 inline bool operator!=(const PhysicalRegion& reg) const
53 {
54 return (impl != reg.impl);
55 }
56 inline bool operator<(const PhysicalRegion& reg) const
57 {
58 return (impl < reg.impl);
59 }
60 std::size_t hash(void) const;
61 public:
65 bool is_mapped(void) const;
74 bool silence_warnings = false, const char* warning_string = nullptr);
81 bool is_valid(void) const;
89 PrivilegeMode get_privilege(void) const;
94 std::set<Memory>& memories, bool silence_warnings = false,
95 const char* warning_string = nullptr) const;
99 void get_fields(std::vector<FieldID>& fields) const;
100 public:
101 template<int DIM, typename COORD_T>
102 DomainT<DIM, COORD_T> get_bounds(void) const;
103 // We'll also allow this to implicitly cast to a realm index space
104 // so that users can easily iterate over the points
105 template<int DIM, typename COORD_T>
106 operator DomainT<DIM, COORD_T>(void) const;
107 // They can implicitly cast to a rectangle if there is no
108 // sparsity map, runtime will check for this
109 template<int DIM, typename COORD_T>
110 operator Rect<DIM, COORD_T>(void) const;
111 protected:
112 // These methods can only be accessed by accessor classes
113 template<PrivilegeMode, typename, int, typename, typename, bool>
114 friend class FieldAccessor;
115 template<typename, bool, int, typename, typename, bool>
116 friend class ReductionAccessor;
117 template<typename, int, typename, typename, bool, bool, int>
118 friend class MultiRegionAccessor;
119 template<typename, int, typename, typename, bool>
120 friend class PaddingAccessor;
121 template<typename, int, typename, typename>
122 friend class UnsafeFieldAccessor;
123 template<typename, PrivilegeMode>
125 template<typename>
126 friend class ArraySyntax::AffineRefHelper;
127 friend class PieceIterator;
128 template<PrivilegeMode, typename, int, typename>
129 friend class SpanIterator;
130 template<typename, int, typename>
131 friend class UnsafeSpanIterator;
132 Realm::RegionInstance get_instance_info(
133 PrivilegeMode mode, FieldID fid, size_t field_size, void* realm_is,
134 TypeTag type_tag, const char* warning_string, bool silence_warnings,
135 bool generic_accessor, bool check_field_size,
136 ReductionOpID redop = 0) const;
137 Realm::RegionInstance get_instance_info(
138 PrivilegeMode mode, const std::vector<PhysicalRegion>& other_regions,
139 FieldID fid, size_t field_size, void* realm_is, TypeTag type_tag,
140 const char* warning_string, bool silence_warnings,
141 bool generic_accessor, bool check_field_size, bool need_bounds,
142 ReductionOpID redop = 0) const;
143 Realm::RegionInstance get_padding_info(
144 FieldID fid, size_t field_size, Domain* inner, Domain& outer,
145 const char* warning_string, bool silence_warnings,
146 bool generic_accessor, bool check_field_size) const;
147 void report_incompatible_accessor(
148 const char* accessor_kind, Realm::RegionInstance instance,
149 FieldID fid) const;
150 void report_incompatible_multi_accessor(
151 unsigned index, FieldID fid, Realm::RegionInstance inst1,
152 Realm::RegionInstance inst2) const;
153 void report_colocation_violation(
154 const char* accessor_kind, FieldID fid, Realm::RegionInstance inst1,
155 Realm::RegionInstance inst2, const PhysicalRegion& other,
156 bool reduction = false) const;
157 static void empty_colocation_regions(
158 const char* accessor_kind, FieldID fid, bool reduction = false);
159 static void fail_bounds_check(
160 DomainPoint p, FieldID fid, PrivilegeMode mode, bool multi = false);
161 static void fail_bounds_check(
162 Domain d, FieldID fid, PrivilegeMode mode, bool multi = false);
163 static void fail_privilege_check(
164 DomainPoint p, FieldID fid, PrivilegeMode mode);
165 static void fail_privilege_check(Domain d, FieldID fid, PrivilegeMode mode);
166 static void fail_padding_check(DomainPoint p, FieldID fid);
167 static void fail_nondense_rect(void);
168 static void fail_rect_piece(void);
169 protected:
170 void get_bounds(void* realm_is, TypeTag type_tag) const;
171 };
172
181 public:
182 ExternalResources(void);
184 ExternalResources(ExternalResources&& rhs) noexcept;
185 ~ExternalResources(void);
186 private:
187 Internal::ExternalResourcesImpl* impl;
188 protected:
189 FRIEND_ALL_RUNTIME_CLASSES
190 explicit ExternalResources(Internal::ExternalResourcesImpl* impl);
191 public:
192 ExternalResources& operator=(const ExternalResources& rhs);
193 ExternalResources& operator=(ExternalResources&& rhs) noexcept;
194 inline bool exists(void) const { return (impl != nullptr); }
195 inline bool operator==(const ExternalResources& reg) const
196 {
197 return (impl == reg.impl);
198 }
199 inline bool operator<(const ExternalResources& reg) const
200 {
201 return (impl < reg.impl);
202 }
203 public:
204 size_t size(void) const;
205 PhysicalRegion operator[](unsigned index) const;
206 };
207
232 public:
233 PieceIterator(void);
234 PieceIterator(const PieceIterator& rhs);
235 PieceIterator(PieceIterator&& rhs) noexcept;
237 const PhysicalRegion& region, FieldID fid, bool privilege_only = true,
238 bool silence_warnings = false, const char* warning_string = nullptr);
239 ~PieceIterator(void);
240 public:
241 PieceIterator& operator=(const PieceIterator& rhs);
242 PieceIterator& operator=(PieceIterator&& rhs) noexcept;
243 public:
244 inline bool valid(void) const;
245 bool step(void);
246 public:
247 inline operator bool(void) const;
248 inline bool operator()(void) const;
249 inline const Domain& operator*(void) const;
250 inline const Domain* operator->(void) const;
251 inline PieceIterator& operator++(void);
252 inline PieceIterator operator++(int /*postfix*/);
253 public:
254 bool operator<(const PieceIterator& rhs) const;
255 bool operator==(const PieceIterator& rhs) const;
256 bool operator!=(const PieceIterator& rhs) const;
257 private:
258 Internal::PieceIteratorImpl* impl;
259 int index;
260 protected:
261 Domain current_piece;
262 };
263
269 template<int DIM, typename COORD_T = coord_t>
271 private:
272 static_assert(DIM > 0, "DIM must be positive");
273 static_assert(DIM <= LEGION_MAX_DIM, "DIM must be <= LEGION_MAX_DIM");
274 static_assert(std::is_integral<COORD_T>::value, "must be integral type");
275 public:
276 PieceIteratorT(void);
277 PieceIteratorT(const PieceIteratorT& rhs);
278 PieceIteratorT(PieceIteratorT&& rhs) noexcept;
280 const PhysicalRegion& region, FieldID fid, bool privilege_only,
281 bool silence_warnings = false, const char* warning_string = nullptr);
282 public:
283 PieceIteratorT<DIM, COORD_T>& operator=(const PieceIteratorT& rhs);
284 PieceIteratorT<DIM, COORD_T>& operator=(PieceIteratorT&& rhs) noexcept;
285 public:
286 inline bool step(void);
287 inline const Rect<DIM, COORD_T>& operator*(void) const;
288 inline const Rect<DIM, COORD_T>* operator->(void) const;
289 inline PieceIteratorT<DIM, COORD_T>& operator++(void);
290 inline PieceIteratorT<DIM, COORD_T> operator++(int /*postfix*/);
291 protected:
292 Rect<DIM, COORD_T> current_rect;
293 };
294
303 template<typename FT, PrivilegeMode PM = LEGION_READ_WRITE>
304 class Span {
305 public:
306 class iterator {
307 public:
308 // explicitly set iterator traits
309 typedef std::random_access_iterator_tag iterator_category;
310 typedef FT value_type;
311 typedef std::ptrdiff_t difference_type;
312 typedef FT* pointer;
313 typedef FT& reference;
314
315 iterator(void) : ptr(nullptr), stride(0) { }
316 private:
317 iterator(uint8_t* p, size_t s) : ptr(p), stride(s) { }
318 public:
319 inline iterator& operator=(const iterator& rhs)
320 {
321 ptr = rhs.ptr;
322 stride = rhs.stride;
323 return *this;
324 }
325 inline iterator& operator+=(int rhs)
326 {
327 ptr += stride;
328 return *this;
329 }
330 inline iterator& operator-=(int rhs)
331 {
332 ptr -= stride;
333 return *this;
334 }
335 inline FT& operator*(void) const
336 {
337 FT* result = nullptr;
338 static_assert(sizeof(result) == sizeof(ptr));
339 memcpy(&result, &ptr, sizeof(result));
340 return *result;
341 }
342 inline FT* operator->(void) const
343 {
344 FT* result = nullptr;
345 static_assert(sizeof(result) == sizeof(ptr));
346 memcpy(&result, &ptr, sizeof(result));
347 return result;
348 }
349 inline FT& operator[](int rhs) const
350 {
351 FT* result = nullptr;
352 uint8_t* ptr2 = ptr + rhs * stride;
353 static_assert(sizeof(result) == sizeof(ptr2));
354 memcpy(&result, &ptr2, sizeof(result));
355 return *result;
356 }
357 public:
358 inline iterator& operator++(void)
359 {
360 ptr += stride;
361 return *this;
362 }
363 inline iterator& operator--(void)
364 {
365 ptr -= stride;
366 return *this;
367 }
368 inline iterator operator++(int)
369 {
370 iterator it(ptr, stride);
371 ptr += stride;
372 return it;
373 }
374 inline iterator operator--(int)
375 {
376 iterator it(ptr, stride);
377 ptr -= stride;
378 return it;
379 }
380 inline iterator operator+(int rhs) const
381 {
382 return iterator(ptr + stride * rhs, stride);
383 }
384 inline iterator operator-(int rhs) const
385 {
386 return iterator(ptr - stride * rhs, stride);
387 }
388 public:
389 inline bool operator==(const iterator& rhs) const
390 {
391 return (ptr == rhs.ptr);
392 }
393 inline bool operator!=(const iterator& rhs) const
394 {
395 return (ptr != rhs.ptr);
396 }
397 inline bool operator<(const iterator& rhs) const
398 {
399 return (ptr < rhs.ptr);
400 }
401 inline bool operator>(const iterator& rhs) const
402 {
403 return (ptr > rhs.ptr);
404 }
405 inline bool operator<=(const iterator& rhs) const
406 {
407 return (ptr <= rhs.ptr);
408 }
409 inline bool operator>=(const iterator& rhs) const
410 {
411 return (ptr >= rhs.ptr);
412 }
413 private:
414 uint8_t* ptr;
415 size_t stride;
416 };
418 public:
419 // explicitly set iterator traits
420 typedef std::random_access_iterator_tag iterator_category;
421 typedef FT value_type;
422 typedef std::ptrdiff_t difference_type;
423 typedef FT* pointer;
424 typedef FT& reference;
425
426 reverse_iterator(void) : ptr(nullptr), stride(0) { }
427 private:
428 reverse_iterator(uint8_t* p, size_t s) : ptr(p), stride(s) { }
429 public:
430 inline reverse_iterator& operator=(const reverse_iterator& rhs)
431 {
432 ptr = rhs.ptr;
433 stride = rhs.stride;
434 return *this;
435 }
436 inline reverse_iterator& operator+=(int rhs)
437 {
438 ptr -= stride;
439 return *this;
440 }
441 inline reverse_iterator& operator-=(int rhs)
442 {
443 ptr += stride;
444 return *this;
445 }
446 inline FT& operator*(void) const
447 {
448 FT* result = nullptr;
449 static_assert(sizeof(result) == sizeof(ptr));
450 memcpy(&result, &ptr, sizeof(result));
451 return *result;
452 }
453 inline FT* operator->(void) const
454 {
455 FT* result = nullptr;
456 static_assert(sizeof(result) == sizeof(ptr));
457 memcpy(&result, &ptr, sizeof(result));
458 return result;
459 }
460 inline FT& operator[](int rhs) const
461 {
462 FT* result = nullptr;
463 uint8_t* ptr2 = ptr - rhs * stride;
464 static_assert(sizeof(result) == sizeof(ptr2));
465 memcpy(&result, &ptr2, sizeof(result));
466 return *result;
467 }
468 public:
469 inline reverse_iterator& operator++(void)
470 {
471 ptr -= stride;
472 return *this;
473 }
474 inline reverse_iterator& operator--(void)
475 {
476 ptr += stride;
477 return *this;
478 }
479 inline reverse_iterator operator++(int)
480 {
481 reverse_iterator it(ptr, stride);
482 ptr -= stride;
483 return it;
484 }
485 inline reverse_iterator operator--(int)
486 {
487 reverse_iterator it(ptr, stride);
488 ptr += stride;
489 return it;
490 }
491 inline reverse_iterator operator+(int rhs) const
492 {
493 return reverse_iterator(ptr - stride * rhs, stride);
494 }
495 inline reverse_iterator operator-(int rhs) const
496 {
497 return reverse_iterator(ptr + stride * rhs, stride);
498 }
499 public:
500 inline bool operator==(const reverse_iterator& rhs) const
501 {
502 return (ptr == rhs.ptr);
503 }
504 inline bool operator!=(const reverse_iterator& rhs) const
505 {
506 return (ptr != rhs.ptr);
507 }
508 inline bool operator<(const reverse_iterator& rhs) const
509 {
510 return (ptr > rhs.ptr);
511 }
512 inline bool operator>(const reverse_iterator& rhs) const
513 {
514 return (ptr < rhs.ptr);
515 }
516 inline bool operator<=(const reverse_iterator& rhs) const
517 {
518 return (ptr >= rhs.ptr);
519 }
520 inline bool operator>=(const reverse_iterator& rhs) const
521 {
522 return (ptr <= rhs.ptr);
523 }
524 private:
525 uint8_t* ptr;
526 size_t stride;
527 };
528 public:
529 Span(void) : base(nullptr), extent(0), stride(0) { }
530 Span(FT* b, size_t e, size_t s = sizeof(FT))
531 : base(nullptr), extent(e), stride(s)
532 {
533 static_assert(sizeof(base) == sizeof(b));
534 memcpy(&base, &b, sizeof(base));
535 }
536 public:
537 inline iterator begin(void) const { return iterator(base, stride); }
538 inline iterator end(void) const
539 {
540 return iterator(base + extent * stride, stride);
541 }
542 inline reverse_iterator rbegin(void) const
543 {
544 return reverse_iterator(base + (extent - 1) * stride, stride);
545 }
546 inline reverse_iterator rend(void) const
547 {
548 return reverse_iterator(base - stride, stride);
549 }
550 public:
551 inline FT& front(void) const
552 {
553 FT* result = nullptr;
554 static_assert(sizeof(result) == sizeof(base));
555 memcpy(&result, &base, sizeof(result));
556 return *result;
557 }
558 inline FT& back(void) const
559 {
560 FT* result = nullptr;
561 uint8_t* ptr = base + (extent - 1) * stride;
562 static_assert(sizeof(result) == sizeof(ptr));
563 memcpy(&result, &ptr, sizeof(result));
564 return *result;
565 }
566 inline FT& operator[](int index) const
567 {
568 FT* result = nullptr;
569 uint8_t* ptr = base + index * stride;
570 static_assert(sizeof(result) == sizeof(ptr));
571 memcpy(&result, &ptr, sizeof(result));
572 return *result;
573 }
574 inline FT* data(void) const
575 {
576 FT* result = nullptr;
577 static_assert(sizeof(result) == sizeof(base));
578 memcpy(&result, &base, sizeof(result));
579 return result;
580 }
581 inline uintptr_t get_base(void) const { return uintptr_t(base); }
582 public:
583 inline size_t size(void) const { return extent; }
584 inline size_t step(void) const { return stride; }
585 inline bool empty(void) const { return (extent == 0); }
586 private:
587 uint8_t* base;
588 size_t extent; // number of elements
589 size_t stride; // byte stride
590 };
591
601 template<PrivilegeMode PM, typename FT, int DIM, typename COORD_T = coord_t>
603 private:
604 static_assert(DIM > 0, "DIM must be positive");
605 static_assert(DIM <= LEGION_MAX_DIM, "DIM must be <= LEGION_MAX_DIM");
606 static_assert(std::is_integral<COORD_T>::value, "must be integral type");
607 public:
608 SpanIterator(void) { }
610 const PhysicalRegion& region, FieldID fid,
611 // The actual field size in case it is different from the
612 // one being used in FT and we still want to check it
613 size_t actual_field_size = sizeof(FT),
614#ifdef LEGION_DEBUG
615 bool check_field_size = true,
616#else
617 bool check_field_size = false,
618#endif
619 // Iterate only the spans that we have privileges on
620 bool privileges_only = true, bool silence_warnings = false,
621 const char* warning_string = nullptr);
622 public:
623 inline bool valid(void) const;
624 inline bool step(void);
625 public:
626 inline operator bool(void) const;
627 inline bool operator()(void) const;
628 inline const Span<FT, PM>& operator*(void) const;
629 inline const Span<FT, PM>* operator->(void) const;
630 inline SpanIterator<PM, FT, DIM, COORD_T>& operator++(void);
631 inline SpanIterator<PM, FT, DIM, COORD_T> operator++(int);
632 private:
633 PieceIteratorT<DIM, COORD_T> piece_iterator;
634 Realm::MultiAffineAccessor<FT, DIM, COORD_T> accessor;
635 Span<FT, PM> current;
636 Point<DIM, COORD_T> partial_step_point;
637 int dim_order[DIM];
638 int partial_step_dim;
639 bool partial_piece;
640 };
641
642} // namespace Legion
643
644#include "legion/api/physical_region.inl"
645
646#endif // __LEGION_PHYSICAL_REGION_H__
Definition geometry.h:154
Definition geometry.h:29
Definition physical_region.h:180
Definition accessors.h:71
Definition data.h:184
Definition accessors.h:646
Definition physical_region.h:33
void get_memories(std::set< Memory > &memories, bool silence_warnings=false, const char *warning_string=nullptr) const
LogicalRegion get_logical_region(void) const
PrivilegeMode get_privilege(void) const
bool is_valid(void) const
bool is_mapped(void) const
void wait_until_valid(bool silence_warnings=false, const char *warning_string=nullptr)
void get_fields(std::vector< FieldID > &fields) const
Definition physical_region.h:231
Definition physical_region.h:270
Definition accessors.h:379
Definition physical_region.h:306
Definition physical_region.h:417
Definition physical_region.h:304
Definition physical_region.h:602
Definition types.h:259
Definition types.h:334