Legion Runtime
Loading...
Searching...
No Matches
shim_mapper.h
Go to the documentation of this file.
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
17#ifndef __SHIM_MAPPER_H__
18#define __SHIM_MAPPER_H__
19
25#include "legion.h"
28#include <stdlib.h>
29#include <assert.h>
30#include <algorithm>
31
32namespace Legion {
33 namespace Mapping {
34
47 class ShimMapper : public DefaultMapper {
48 public:
49 // Our internal classes
50 class Task;
51 class Copy;
52 class Inline;
54 public:
55 // Our extended version of region requirements with the old mapping fields
57 public:
59 public:
60 RegionRequirement& operator=(const Legion::RegionRequirement &rhs);
61 public: // inputs
62 bool restricted;
63 size_t max_blocking_factor;
64 std::map<Memory,bool> current_instances;
65 public: // outputs
66 bool virtual_map;
67 bool early_map;
68 bool enable_WAR_optimization;
69 bool reduction_list;
70 bool make_persistent;
71 size_t blocking_factor;
72 std::vector<Memory> target_ranking;
73 std::set<FieldID> additional_fields;
74 public:
75 bool mapping_failed;
76 Memory selected_memory;
77 };
78 public:
79 // Our version of mappable
80 class Mappable {
81 public:
82 enum MappableKind {
83 TASK_MAPPABLE,
84 INLINE_MAPPABLE,
85 COPY_MAPPABLE,
86 ACQUIRE_MAPPABLE,
87 RELEASE_MAPPABLE,
88 };
89 public:
90 virtual MappableKind get_mappable_kind(void) const = 0;
91 virtual Task* as_mappable_task(void) const = 0;
92 virtual Copy* as_mappable_copy(void) const = 0;
93 virtual Inline* as_mappable_inline(void) const = 0;
94 virtual UniqueID get_unique_mappable_id(void) const = 0;
95 };
96 // Our version of tasks
97 class Task : public Mappable, public Legion::Task {
98 public:
99 Task(const Legion::Task &rhs, TaskVariantCollection *var);
100 public:
101 virtual MappableKind get_mappable_kind(void) const;
102 virtual Task* as_mappable_task(void) const;
103 virtual Copy* as_mappable_copy(void) const;
104 virtual Inline* as_mappable_inline(void) const;
105 virtual UniqueID get_unique_mappable_id(void) const;
106 virtual UniqueID get_unique_id(void) const;
107 virtual uint64_t get_context_index(void) const;
108 virtual int get_depth(void) const;
109 virtual bool has_parent_task(void) const;
110 virtual const Legion::Task* get_parent_task(void) const;
111 virtual const std::string_view& get_provenance_string(
112 bool human=true) const;
113 virtual const char* get_task_name(void) const;
114 virtual Domain get_slice_domain(void) const;
115 virtual ShardID get_shard_id(void) const;
116 virtual size_t get_total_shards(void) const;
117 virtual DomainPoint get_shard_point(void) const;
118 virtual Domain get_shard_domain(void) const;
119 virtual bool has_trace(void) const;
120 public:
121 inline UniqueID get_unique_task_id(void) const { return unique_id; }
122 public:
123 // select task options fields
124 bool inline_task;
125 bool map_locally;
126 bool spawn_task;
127 bool profile_task;
128 public:
129 // select task variants options
130 VariantID selected_variant;
131 TaskVariantCollection* variants;
132 public:
133 // map task options
134 std::set<Processor> additional_procs;
135 TaskPriority task_priority;
136 bool post_map_task;
137 std::vector<RegionRequirement> regions;
138 private:
139 UniqueID unique_id;
140 uint64_t context_index;
141 int depth;
142 const char * const task_name;
143 };
144 // Our version of inline mapping
145 class Inline : public Mappable, public Legion::InlineMapping {
146 public:
147 Inline(const Legion::InlineMapping &rhs);
148 public:
149 virtual MappableKind get_mappable_kind(void) const;
150 virtual Task* as_mappable_task(void) const;
151 virtual Copy* as_mappable_copy(void) const;
152 virtual Inline* as_mappable_inline(void) const;
153 virtual UniqueID get_unique_mappable_id(void) const;
154 virtual UniqueID get_unique_id(void) const;
155 virtual uint64_t get_context_index(void) const;
156 virtual int get_depth(void) const;
157 virtual const Legion::Task* get_parent_task(void) const;
158 virtual const std::string_view& get_provenance_string(
159 bool human=true) const;
160 public:
161 inline UniqueID get_unique_inline_id(void) const { return unique_id; }
162 public:
163 RegionRequirement requirement;
164 private:
165 UniqueID unique_id;
166 uint64_t context_index;
167 int depth;
168 };
169 // Our version of copy operations
170 class Copy : public Mappable, public Legion::Copy {
171 public:
172 Copy(const Legion::Copy &rhs);
173 public:
174 virtual MappableKind get_mappable_kind(void) const;
175 virtual Task* as_mappable_task(void) const;
176 virtual Copy* as_mappable_copy(void) const;
177 virtual Inline* as_mappable_inline(void) const;
178 virtual UniqueID get_unique_mappable_id(void) const;
179 virtual UniqueID get_unique_id(void) const;
180 virtual uint64_t get_context_index(void) const;
181 virtual int get_depth(void) const;
182 virtual const Legion::Task* get_parent_task(void) const;
183 virtual const std::string_view& get_provenance_string(
184 bool human=true) const;
185 public:
186 inline UniqueID get_unique_copy_id(void) const { return unique_id; }
187 public:
188 std::vector<RegionRequirement> src_requirements;
189 std::vector<RegionRequirement> dst_requirements;
190 private:
191 UniqueID unique_id;
192 uint64_t context_index;
193 int depth;
194 };
195 // Task Variant Collection
197 public:
198 class Variant {
199 public:
200 Processor::TaskFuncID low_id;
201 Processor::Kind proc_kind;
204 bool inner;
205 bool leaf;
206 VariantID vid;
207 public:
208 Variant(void)
209 : low_id(0) { }
210 Variant(Processor::TaskFuncID id, Processor::Kind k,
211 bool single, bool index,
212 bool in, bool lf,
213 VariantID v)
214 : low_id(id), proc_kind(k),
215 single_task(single), index_space(index),
216 inner(in), leaf(lf), vid(v) { }
217 };
218 public:
219 TaskVariantCollection(Processor::TaskFuncID uid,
220 const char *n,
221 const bool idem, size_t ret)
222 : user_id(uid), name(n),
223 idempotent(idem), return_size(ret) { }
224 void add_variant(Processor::TaskFuncID low_id,
225 Processor::Kind kind,
226 bool single, bool index,
227 bool inner, bool leaf,
228 VariantID vid);
229 const Variant& select_variant(bool single, bool index,
230 Processor::Kind kind);
231 public:
240 bool has_variant(Processor::Kind kind,
241 bool single, bool index_space);
250 VariantID get_variant(Processor::Kind kind,
251 bool single, bool index_space);
258 bool has_variant(VariantID vid);
264 const Variant& get_variant(VariantID vid);
265
266 const std::map<VariantID,Variant>& get_all_variants(void) const
267 { return variants; }
268 public:
269 const Processor::TaskFuncID user_id;
270 const char *name;
271 const bool idempotent;
272 const size_t return_size;
273 protected:
274 std::map<VariantID,Variant> variants;
275 };
276 public:
277 ShimMapper(Machine machine, Runtime *rt, MapperRuntime *mrt,
278 Processor local, const char *name = NULL);
279 ShimMapper(const ShimMapper &rhs);
280 virtual ~ShimMapper(void);
281 public:
282 ShimMapper& operator=(const ShimMapper &rhs);
283 public:
284 static const char* create_shim_name(Processor p);
285 public:
286 // New mapper calls
287 virtual MapperSyncModel get_mapper_sync_model(void) const;
288 virtual void select_task_options(const MapperContext ctx,
289 const Legion::Task& task,
290 TaskOptions& output);
291 // Overload this to make the compiler happy
292 virtual void select_task_variant(const MapperContext ctx,
293 const Legion::Task& task,
294 const SelectVariantInput& input,
295 SelectVariantOutput& output);
296 virtual void map_task(const MapperContext ctx,
297 const Legion::Task& task,
298 const MapTaskInput& input,
299 MapTaskOutput& output);
300 virtual void map_copy(const MapperContext ctx,
301 const Legion::Copy& copy,
302 const MapCopyInput& input,
303 MapCopyOutput& output);
304 virtual void map_inline(const MapperContext ctx,
305 const InlineMapping& inline_op,
306 const MapInlineInput& input,
307 MapInlineOutput& output);
308 virtual void slice_task(const MapperContext ctx,
309 const Legion::Task& task,
310 const SliceTaskInput& input,
311 SliceTaskOutput& output);
312 typedef TaskSlice DomainSplit;
313 virtual void select_tunable_value(const MapperContext ctx,
314 const Legion::Task& task,
315 const SelectTunableInput& input,
316 SelectTunableOutput& output);
317 virtual void handle_message(const MapperContext ctx,
318 const MapperMessage& message);
319 public:
320 // Old mapper calls
321 virtual void select_task_options(Task *task);
322 virtual void select_task_variant(Task *task);
323 virtual bool map_task(Task *task);
324 virtual bool map_copy(Copy *copy);
325 virtual bool map_inline(Inline *inline_operation);
326 virtual void notify_mapping_result(const Mappable *mappable);
327 virtual void notify_mapping_failed(const Mappable *mappable);
328 virtual void slice_domain(const Task *task, const Domain &domain,
329 std::vector<DomainSplit> &slices);
330 virtual void handle_message(Processor source,
331 const void *message, size_t length);
332 virtual int get_tunable_value(const Task *task,
333 TunableID tid, MappingTagID tag);
334 protected:
335 Color get_logical_region_color(LogicalRegion handle);
336 bool has_parent_logical_partition(LogicalRegion handle);
337 LogicalPartition get_parent_logical_partition(LogicalRegion handle);
338 LogicalRegion get_parent_logical_region(LogicalPartition handle);
339 void get_field_space_fields(FieldSpace handle, std::set<FieldID> &fields);
340 void broadcast_message(const void *message, size_t message_size);
341 protected:
342 TaskVariantCollection* find_task_variant_collection(MapperContext ctx,
343 TaskID task_id, const char *task_name);
344 void initialize_requirement_mapping_fields(RegionRequirement &req,
345 const std::vector<PhysicalInstance> &instances);
346 bool convert_requirement_mapping(MapperContext ctx,RegionRequirement &req,
347 std::vector<PhysicalInstance> &result);
348 void initialize_aos_constraints(LayoutConstraintSet &constraints,
349 const std::set<FieldID> &fields,
350 ReductionOpID redop);
351 void initialize_soa_constraints(LayoutConstraintSet &constraints,
352 const std::set<FieldID> &fields,
353 ReductionOpID redop);
354 public:
355 static void decompose_index_space(const Domain &domain,
356 const std::vector<Processor> &targets,
357 unsigned splitting_factor,
358 std::vector<DomainSplit> &slice);
359 protected:
360 MapperRuntime *const mapper_runtime;
361 const Processor::Kind local_kind;
362 const Machine machine;
363 Runtime *const runtime;
364 // The maximum number of tasks a mapper will allow to be stolen at a time
365 // Controlled by -dm:thefts
366 unsigned max_steals_per_theft;
367 // The maximum number of times that a single task is allowed to be stolen
368 // Controlled by -dm:count
369 unsigned max_steal_count;
370 // The splitting factor for breaking index spaces across the machine
371 // Mapper will try to break the space into split_factor * num_procs
372 // difference pieces
373 // Controlled by -dm:split
374 unsigned splitting_factor;
375 // Do a breadth-first traversal of the task tree, by default we do
376 // a depth-first traversal to improve locality
377 bool breadth_first_traversal;
378 // Whether or not copies can be made to avoid Write-After-Read dependences
379 // Controlled by -dm:war
380 bool war_enabled;
381 // Track whether stealing is enabled
382 bool stealing_enabled;
383 // The maximum number of tasks scheduled per step
384 unsigned max_schedule_count;
385 // Maximum number of failed mappings for a task before error
386 unsigned max_failed_mappings;
387 std::map<UniqueID,unsigned> failed_mappings;
388 // Utilities for use within the default mapper
389 Utilities::MachineQueryInterface machine_interface;
392 protected:
393 std::map<TaskID,TaskVariantCollection*> task_variant_collections;
394 private:
395 MapperContext current_ctx;
396 };
397
398 };
399};
400
401#endif // __SHIM_MAPPER_H__
402
403// EOF
404
Definition mapping.h:185
Definition geometry.h:159
Definition geometry.h:34
Definition data.h:152
Definition mapping.h:216
Definition constraints.h:881
Definition data.h:260
Definition data.h:189
Definition mapping.h:42
Definition default_mapper.h:45
MapperSyncModel
Definition mapping.h:678
Definition mapping.h:2458
Definition shim_mapper.h:170
Definition shim_mapper.h:145
Definition shim_mapper.h:80
Definition shim_mapper.h:97
VariantID get_variant(Processor::Kind kind, bool single, bool index_space)
const Variant & get_variant(VariantID vid)
bool has_variant(Processor::Kind kind, bool single, bool index_space)
Definition shim_mapper.h:47
Definition mapping_utilities.h:42
Definition mapping_utilities.h:132
Definition mapping_utilities.h:189
Definition runtime.h:108
Definition mapping.h:112
Definition accessors.h:29
Definition requirements.h:42