force selected pipeline stages in throughput mode
Validate Operations / validate-operations (push) Has been cancelled

increase throughput scheduler budget
add experimental throughput auto mode
This commit is contained in:
NiccoloN
2026-11-02 12:08:33 +01:00
parent 4168b588fa
commit 4a1fe710b2
35 changed files with 2047 additions and 398 deletions
+18 -7
View File
@@ -290,7 +290,8 @@ static void testTransposeCost() {
auto graph = buildCheckedComputeGraph(function, target);
MergeScheduleResult schedule;
std::string error;
assert(succeeded(runPipelineScheduler(graph, schedule, 2, target, error)));
assert(succeeded(packPipelineSchedule(graph, std::vector<size_t>(graph.nodes.size()),
{target.processorCount}, target, schedule, error)));
assert(schedule.costs.totalWorkNs == expected);
assert(schedule.costs.maximumCoreWorkNs == expected);
}
@@ -610,14 +611,15 @@ static void testPipelinePackingCapacity() {
target.interProcessorLatencyNs.assign(16, 0);
MergeScheduleResult schedule;
std::string error;
assert(succeeded(runPipelineScheduler(graph, schedule, 2, target, error)));
assert(succeeded(packPipelineSchedule(graph, std::vector<size_t>(graph.nodes.size()),
{target.processorCount}, target, schedule, error)));
std::vector<Cost> loads(4);
for (const auto &node : graph.nodes) {
size_t core = schedule.computeToCpuMap.lookup(node.instance);
assert(schedule.processorStages[core] == 0);
loads[core] += node.cost;
}
assert(*std::max_element(loads.begin(), loads.end()) == 20);
assert(*std::max_element(loads.begin(), loads.end()) == 10);
}
static void testRepeatedResidentWeightPacking() {
@@ -659,7 +661,10 @@ static void testRepeatedResidentWeightPacking() {
target.interProcessorLatencyNs[core * target.processorCount + core] = 0;
MergeScheduleResult schedule;
std::string error;
assert(succeeded(runPipelineScheduler(graph, schedule, stages, target, error)));
assert(failed(runPipelineScheduler(graph, schedule, stages, target, error)));
assert(error.find("compute operation groups") != std::string::npos);
assert(succeeded(packPipelineSchedule(graph, std::vector<size_t>(graph.nodes.size()),
{target.processorCount}, target, schedule, error)));
assert(schedule.dominanceOrderCompute.size() == graph.nodes.size());
std::vector<ResidentWeightSet> residents(target.processorCount);
for (const auto &node : graph.nodes) {
@@ -1747,7 +1752,9 @@ static void testPipelineSharedMemory() {
graph.publicationTransfers.push_back({0, 3, {}, 0, {}, 4096, 1});
MergeScheduleResult constrained;
std::string error;
assert(mlir::succeeded(runPipelineScheduler(graph, constrained, 4, target, error)));
assert(mlir::failed(runPipelineScheduler(graph, constrained, 4, target, error)));
assert(error.find("requested depth domain") != std::string::npos);
assert(mlir::succeeded(runPipelineScheduler(graph, constrained, 2, target, error)));
auto assignment = stages(constrained);
for (size_t task = 0; task < graph.nodes.size(); ++task)
for (const auto &[predecessor, transfer] : graph.predecessors[task])
@@ -1969,10 +1976,10 @@ int main() {
ComputeGraph emptyGraph;
MergeScheduleResult emptySchedule;
emptySchedule.processorCount = 4;
assert(mlir::succeeded(runPipelineScheduler(
assert(mlir::failed(runPipelineScheduler(
emptyGraph, emptySchedule, 2, physical, pipelineError)));
assert(emptySchedule.processorCount == physical.processorCount);
assert(emptySchedule.processorStages == std::vector<size_t>({0, 0, 1, 1}));
assert(pipelineError.find("compute operation groups") != std::string::npos);
MergeScheduleResult pipelineSchedule = physicalSchedule;
assert(mlir::succeeded(runPipelineScheduler(
@@ -2005,6 +2012,10 @@ int main() {
fourStagePhysical.interProcessorLatencyNs[core * 8 + core] = 0;
MergeScheduleResult fourStageSchedule = physicalSchedule;
fourStageSchedule.processorCount = 8;
assert(mlir::failed(runPipelineScheduler(
graph, fourStageSchedule, 4, fourStagePhysical, pipelineError)));
graph.successors[0].pop_back();
graph.predecessors[5].pop_back();
assert(mlir::succeeded(runPipelineScheduler(
graph, fourStageSchedule, 4, fourStagePhysical, pipelineError)));
for (size_t task = 0; task < graph.nodes.size(); ++task)