Skip to content

Commit ad648b4

Browse files
authored
[BENCHMARK TEST] Tune max iterations/hyper parameters to get more consistent runtimes (-2% on benchmark, 10% -> 3% timeout) (#639)
* add support for single sample profiling * wip * Tune max iterations to avoid timing out * format
1 parent a8c02dc commit ad648b4

File tree

5 files changed

+44
-13
lines changed

5 files changed

+44
-13
lines changed

lib/autorouter-pipelines/AutoroutingPipeline2_PortPointPathing/AutoroutingPipelineSolver2_PortPointPathing.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ export class AutoroutingPipelineSolver2_PortPointPathing extends BaseSolver {
338338
connMap: cms.connMap,
339339
viaDiameter: cms.viaDiameter,
340340
traceWidth: cms.minTraceWidth,
341+
effort: cms.effort,
341342
},
342343
]),
343344
definePipelineStep(

lib/solvers/HighDensitySolver/HighDensitySolver.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export class HighDensitySolver extends BaseSolver {
2626
readonly defaultTraceThickness = 0.15
2727
viaDiameter: number
2828
traceWidth: number
29+
effort: number
2930

3031
failedSolvers: (IntraNodeRouteSolver | HyperSingleIntraNodeSolver)[]
3132
activeSubSolver: IntraNodeRouteSolver | HyperSingleIntraNodeSolver | null =
@@ -38,20 +39,23 @@ export class HighDensitySolver extends BaseSolver {
3839
connMap,
3940
viaDiameter,
4041
traceWidth,
42+
effort,
4143
}: {
4244
nodePortPoints: NodeWithPortPoints[]
4345
colorMap?: Record<string, string>
4446
connMap?: ConnectivityMap
4547
viaDiameter?: number
4648
traceWidth?: number
49+
effort?: number
4750
}) {
4851
super()
4952
this.unsolvedNodePortPoints = nodePortPoints
5053
this.colorMap = colorMap ?? {}
5154
this.connMap = connMap
5255
this.routes = []
5356
this.failedSolvers = []
54-
this.MAX_ITERATIONS = 50e6
57+
this.effort = effort ?? 1
58+
this.MAX_ITERATIONS = 10e6 * this.effort
5559
this.viaDiameter = viaDiameter ?? this.defaultViaDiameter
5660
this.traceWidth = traceWidth ?? this.defaultTraceThickness
5761
}
@@ -96,6 +100,7 @@ export class HighDensitySolver extends BaseSolver {
96100
connMap: this.connMap,
97101
viaDiameter: this.viaDiameter,
98102
traceWidth: this.traceWidth,
103+
effort: this.effort,
99104
})
100105
this.updateCacheStats()
101106
}

lib/solvers/HyperHighDensitySolver/HyperSingleIntraNodeSolver.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,19 @@ export class HyperSingleIntraNodeSolver extends HyperParameterSupervisorSolver<
3232
solvedRoutes: HighDensityIntraNodeRoute[] = []
3333
nodeWithPortPoints: NodeWithPortPoints
3434
connMap?: ConnectivityMap
35+
effort: number
3536

3637
constructor(
37-
opts: ConstructorParameters<typeof CachedIntraNodeRouteSolver>[0],
38+
opts: ConstructorParameters<typeof CachedIntraNodeRouteSolver>[0] & {
39+
effort?: number
40+
},
3841
) {
3942
super()
4043
this.nodeWithPortPoints = opts.nodeWithPortPoints
4144
this.connMap = opts.connMap
4245
this.constructorParams = opts
43-
this.MAX_ITERATIONS = 30_000_000
46+
this.effort = opts.effort ?? 1
47+
this.MAX_ITERATIONS = 10_000_000 * this.effort
4448
this.GREEDY_MULTIPLIER = 5
4549
this.MIN_SUBSTEPS = 100
4650
}
@@ -138,7 +142,7 @@ export class HyperSingleIntraNodeSolver extends HyperParameterSupervisorSolver<
138142
},
139143
{
140144
name: "orderings50",
141-
possibleValues: Array.from({ length: 50 }, (_, i) => ({
145+
possibleValues: Array.from({ length: 20 }, (_, i) => ({
142146
SHUFFLE_SEED: 100 + i,
143147
})),
144148
},
@@ -267,6 +271,7 @@ export class HyperSingleIntraNodeSolver extends HyperParameterSupervisorSolver<
267271
colorMap: this.constructorParams.colorMap,
268272
viaDiameter: this.constructorParams.viaDiameter,
269273
traceWidth: this.constructorParams.traceWidth,
274+
effort: this.effort,
270275
}) as any
271276
}
272277
return new CachedIntraNodeRouteSolver({

lib/solvers/MultiSectionPortPointOptimizer/MultiSectionPortPointOptimizer.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ export class MultiSectionPortPointOptimizer extends BaseSolver {
216216
MAX_ATTEMPTS_PER_NODE = 100
217217

218218
/** Maximum total number of section optimization attempts */
219-
MAX_SECTION_ATTEMPTS = 50
219+
MAX_SECTION_ATTEMPTS = 15
220220

221221
/** Acceptable probability of failure threshold */
222222
ACCEPTABLE_PF = 0.05
@@ -275,8 +275,6 @@ export class MultiSectionPortPointOptimizer extends BaseSolver {
275275
params.JUMPER_PF_FN_ENABLED ?? this.JUMPER_PF_FN_ENABLED
276276
this.SHUFFLE_SEEDS_PER_SECTION = params.SHUFFLE_SEEDS_PER_SECTION
277277

278-
this.MAX_SECTION_ATTEMPTS *= this.effort
279-
280278
this.nodeMap = new Map(
281279
params.inputNodes.map((n) => [n.capacityMeshNodeId, n]),
282280
)

scripts/profile-solvers.ts

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ type SolverRecord = {
1616
}
1717

1818
type ProfileOptions = {
19+
scenarioName?: string
1920
scenarioLimit?: number
2021
}
2122

@@ -66,15 +67,27 @@ const parseArgs = (): ProfileOptions => {
6667

6768
for (let i = 0; i < args.length; i++) {
6869
const arg = args[i]
69-
if (arg === "--scenario-limit") {
70-
options.scenarioLimit = Number.parseInt(args[i + 1], 10)
70+
if (arg === "--scenario") {
71+
const scenarioName = args[i + 1]
72+
if (!scenarioName || scenarioName.startsWith("-")) {
73+
throw new Error("--scenario requires a scenario name")
74+
}
75+
options.scenarioName = scenarioName
76+
i += 1
77+
} else if (arg === "--scenario-limit") {
78+
const rawScenarioLimit = args[i + 1]
79+
if (!rawScenarioLimit || rawScenarioLimit.startsWith("-")) {
80+
throw new Error("--scenario-limit requires a value")
81+
}
82+
options.scenarioLimit = Number.parseInt(rawScenarioLimit, 10)
7183
i += 1
7284
} else if (arg === "-h" || arg === "--help") {
7385
console.log(
7486
[
75-
"Usage: bun scripts/profile-solvers.ts [--scenario-limit N]",
87+
"Usage: bun scripts/profile-solvers.ts [--scenario NAME] [--scenario-limit N]",
7688
"",
7789
"Options:",
90+
" --scenario NAME Run only the named scenario",
7891
" --scenario-limit N Run only first N scenarios",
7992
" -h, --help Show this help",
8093
].join("\n"),
@@ -95,12 +108,18 @@ const parseArgs = (): ProfileOptions => {
95108
return options
96109
}
97110

98-
const loadScenarios = (scenarioLimit?: number) => {
111+
const loadScenarios = (scenarioName?: string, scenarioLimit?: number) => {
99112
const allScenarios = Object.entries(dataset)
100113
.filter(([, value]) => Boolean(value) && typeof value === "object")
101114
.sort(([a], [b]) => a.localeCompare(b)) as Array<[string, SimpleRouteJson]>
102115

103-
return scenarioLimit ? allScenarios.slice(0, scenarioLimit) : allScenarios
116+
const filteredScenarios = scenarioName
117+
? allScenarios.filter(([name]) => name === scenarioName)
118+
: allScenarios
119+
120+
return scenarioLimit
121+
? filteredScenarios.slice(0, scenarioLimit)
122+
: filteredScenarios
104123
}
105124

106125
const getPercentile = (values: number[], p: number): number | null => {
@@ -143,9 +162,12 @@ const formatTable = (headers: string[], body: string[][]): string => {
143162
// --- Main ---
144163
const main = () => {
145164
const opts = parseArgs()
146-
const scenarios = loadScenarios(opts.scenarioLimit)
165+
const scenarios = loadScenarios(opts.scenarioName, opts.scenarioLimit)
147166

148167
if (scenarios.length === 0) {
168+
if (opts.scenarioName) {
169+
throw new Error(`Scenario not found: ${opts.scenarioName}`)
170+
}
149171
throw new Error("No scenarios found")
150172
}
151173

0 commit comments

Comments
 (0)