Skip to content

Commit 94033b6

Browse files
Support for control replication.
1 parent bbbcc02 commit 94033b6

File tree

3 files changed

+43
-7
lines changed

3 files changed

+43
-7
lines changed

src/fuzzer.cc

+10-2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ enum ProjectionIDs {
5151
static Logger log_fuzz("fuzz");
5252

5353
static RngSeed root_seed;
54+
static uint64_t replicate_levels = 0;
5455

5556
static long long parse_long_long(const std::string &flag, const std::string &arg) {
5657
long long result;
@@ -80,6 +81,7 @@ struct FuzzerConfig {
8081
uint64_t region_tree_branch_factor = 4;
8182
uint64_t region_tree_size_factor = 4;
8283
uint64_t region_tree_num_fields = 4;
84+
uint64_t replicate_levels = 0;
8385
uint64_t num_ops = 1;
8486
uint64_t skip_ops = 0;
8587

@@ -105,6 +107,9 @@ struct FuzzerConfig {
105107
} else if (flag == "-fuzz:fields") {
106108
std::string arg(argv[++i]);
107109
config.region_tree_num_fields = parse_uint64_t(flag, arg);
110+
} else if (flag == "-fuzz:replicate") {
111+
std::string arg(argv[++i]);
112+
config.replicate_levels = parse_uint64_t(flag, arg);
108113
} else if (flag == "-fuzz:ops") {
109114
std::string arg(argv[++i]);
110115
config.num_ops = parse_uint64_t(flag, arg);
@@ -127,6 +132,7 @@ struct FuzzerConfig {
127132
<< region_tree_size_factor);
128133
LOG_ONCE(log_fuzz.print() << " config.region_tree_num_fields = "
129134
<< region_tree_num_fields);
135+
LOG_ONCE(log_fuzz.print() << " config.replicate_levels = " << replicate_levels);
130136
LOG_ONCE(log_fuzz.print() << " config.num_ops = " << num_ops);
131137
LOG_ONCE(log_fuzz.print() << " config.skip_ops = " << skip_ops);
132138
}
@@ -1205,8 +1211,9 @@ void top_level(const Task *task, const std::vector<PhysicalRegion> &regions, Con
12051211
static void create_mappers(Machine machine, Runtime *runtime,
12061212
const std::set<Processor> &local_procs) {
12071213
for (Processor proc : local_procs) {
1208-
FuzzMapper::FuzzMapper *mapper = new FuzzMapper::FuzzMapper(
1209-
runtime->get_mapper_runtime(), machine, proc, root_seed.make_stream());
1214+
FuzzMapper::FuzzMapper *mapper =
1215+
new FuzzMapper::FuzzMapper(runtime->get_mapper_runtime(), machine, proc,
1216+
root_seed.make_stream(), replicate_levels);
12101217
runtime->replace_default_mapper(mapper, proc);
12111218
}
12121219
}
@@ -1219,6 +1226,7 @@ int main(int argc, char **argv) {
12191226
Runtime::initialize(&argc, &argv, true /* filter */);
12201227
FuzzerConfig config = FuzzerConfig::parse_args(argc, argv);
12211228
root_seed = RngSeed(config.initial_seed);
1229+
replicate_levels = config.replicate_levels;
12221230

12231231
Runtime::preregister_projection_functor(PROJECTION_OFFSET_1_ID,
12241232
new OffsetProjection(1));

src/mapper.cc

+29-4
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ enum MapperCallIDs {
3131

3232
static Logger log_map("fuzz_mapper");
3333

34-
FuzzMapper::FuzzMapper(MapperRuntime *rt, Machine machine, Processor local, RngStream st)
34+
FuzzMapper::FuzzMapper(MapperRuntime *rt, Machine machine, Processor local, RngStream st,
35+
uint64_t replicate)
3536
: NullMapper(rt, machine),
3637
stream(st),
3738
select_tasks_to_map_channel(st.make_channel(int32_t(SELECT_TASKS_TO_MAP))),
3839
map_inline_channel(st.make_channel(int32_t(MAP_INLINE))),
3940
select_inline_sources_channel(st.make_channel(int32_t(SELECT_INLINE_SOURCES))),
40-
local_proc(local) {
41+
local_proc(local),
42+
replicate_levels(replicate) {
4143
// TODO: something other than CPU processor
4244
{
4345
Machine::ProcessorQuery query(machine);
@@ -85,7 +87,7 @@ void FuzzMapper::select_task_options(const MapperContext ctx, const Task &task,
8587
output.map_locally = false; // TODO
8688
output.valid_instances = false;
8789
output.memoize = true;
88-
output.replicate = task.get_depth() == 0; // TODO: replicate other tasks
90+
output.replicate = task.get_depth() < static_cast<int64_t>(replicate_levels);
8991
// output.parent_priority = ...; // Leave parent at current priority.
9092
// output.check_collective_regions.insert(...); // TODO
9193
}
@@ -149,6 +151,8 @@ void FuzzMapper::map_task(const MapperContext ctx, const Task &task,
149151
void FuzzMapper::replicate_task(MapperContext ctx, const Task &task,
150152
const ReplicateTaskInput &input,
151153
ReplicateTaskOutput &output) {
154+
if (task.get_depth() > static_cast<int64_t>(replicate_levels)) return;
155+
152156
// TODO: cache this?
153157
std::vector<VariantID> variants;
154158
runtime->find_valid_variants(ctx, task.task_id, variants);
@@ -158,7 +162,28 @@ void FuzzMapper::replicate_task(MapperContext ctx, const Task &task,
158162
abort();
159163
}
160164
output.chosen_variant = variants.at(0);
161-
// TODO: actually replicate
165+
166+
bool is_replicable =
167+
runtime->is_replicable_variant(ctx, task.task_id, output.chosen_variant);
168+
// For now assume we always have replicable variants at this level.
169+
if (!is_replicable) {
170+
log_map.fatal() << "Bad variants in replicate_task: variant is not replicable";
171+
abort();
172+
}
173+
174+
std::map<AddressSpace, Processor> targets;
175+
for (Processor proc : global_procs) {
176+
AddressSpace space = proc.address_space();
177+
if (!targets.count(space)) {
178+
targets[space] = proc;
179+
}
180+
}
181+
182+
if (targets.size() > 1) {
183+
for (auto &target : targets) {
184+
output.target_processors.push_back(target.second);
185+
}
186+
}
162187
}
163188

164189
void FuzzMapper::select_task_sources(const MapperContext ctx, const Task &task,

src/mapper.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ using namespace Legion::Mapping;
2828

2929
class FuzzMapper : public NullMapper {
3030
public:
31-
FuzzMapper(MapperRuntime *runtime, Machine machine, Processor local, RngStream stream);
31+
FuzzMapper(MapperRuntime *runtime, Machine machine, Processor local, RngStream stream,
32+
uint64_t replicate);
3233

3334
public:
3435
const char *get_mapper_name(void) const override;
@@ -97,6 +98,8 @@ class FuzzMapper : public NullMapper {
9798
Processor local_proc;
9899
std::vector<Processor> local_procs;
99100
std::vector<Processor> global_procs;
101+
102+
uint64_t replicate_levels;
100103
};
101104

102105
} // namespace FuzzMapper

0 commit comments

Comments
 (0)