Skip to content

Commit 4c47d86

Browse files
committed
ilp-bootstrap-placement: op grouping, compression, and SISO partitioning
Port Orbit's three ILP-reduction techniques: addition-tree squashing and structural compression (auto_compress) merge equivalent ops into groups that share one set of ILP variables (exact, since op costs are linear in level), and single-input single-output partitioning solves large circuits piecewise under enumerated boundary states with a DP stitch.
1 parent f61e438 commit 4c47d86

11 files changed

Lines changed: 1322 additions & 278 deletions

File tree

lib/Analysis/ILPBootstrapPlacementAnalysis/BUILD

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,14 @@ package(
77

88
cc_library(
99
name = "ILPBootstrapPlacementAnalysis",
10-
srcs = ["ILPBootstrapPlacementAnalysis.cpp"],
11-
hdrs = ["ILPBootstrapPlacementAnalysis.h"],
10+
srcs = [
11+
"ILPBootstrapPlacementAnalysis.cpp",
12+
"OpGrouping.cpp",
13+
],
14+
hdrs = [
15+
"ILPBootstrapPlacementAnalysis.h",
16+
"OpGrouping.h",
17+
],
1218
deps = [
1319
"@com_google_absl//absl/status:statusor",
1420
"@com_google_ortools//ortools/math_opt/cpp:math_opt",

lib/Analysis/ILPBootstrapPlacementAnalysis/ILPBootstrapPlacementAnalysis.cpp

Lines changed: 734 additions & 252 deletions
Large diffs are not rendered by default.

lib/Analysis/ILPBootstrapPlacementAnalysis/ILPBootstrapPlacementAnalysis.h

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,23 @@ class ILPBootstrapPlacementAnalysis {
4343
public:
4444
enum class ScaleMode { kCKKS, kLevelOnly };
4545

46+
struct Options {
47+
int bootstrapWaterline = 0;
48+
int scaleWaterline = 0;
49+
int scaleFactorBits = 0;
50+
int bootstrapLevelLowerBound = 0;
51+
// Group structurally equivalent ops so they share ILP variables (Orbit's
52+
// compression). Grouped and ungrouped models have
53+
// the same optimum restricted to symmetric solutions.
54+
bool compress = true;
55+
// Minimum number of ops per SISO partition (Orbit's delta). Partitions
56+
// are solved independently under enumerated boundary states and stitched
57+
// by dynamic programming.
58+
int partitionMinSize = 100;
59+
OpCostModel costModel;
60+
ScaleMode scaleMode = ScaleMode::kCKKS;
61+
};
62+
4663
struct NodeManagement {
4764
Value value;
4865
int inputLevel;
@@ -62,19 +79,8 @@ class ILPBootstrapPlacementAnalysis {
6279
};
6380

6481
ILPBootstrapPlacementAnalysis(Operation* op, DataFlowSolver* solver,
65-
int bootstrapWaterline, int scaleWaterline,
66-
int scaleFactorBits,
67-
int bootstrapLevelLowerBound,
68-
const OpCostModel& costModel,
69-
ScaleMode scaleMode)
70-
: opToRunOn(op),
71-
solver(solver),
72-
bootstrapWaterline(bootstrapWaterline),
73-
scaleWaterline(scaleWaterline),
74-
scaleFactorBits(scaleFactorBits),
75-
bootstrapLevelLowerBound(bootstrapLevelLowerBound),
76-
costModel(costModel),
77-
scaleMode(scaleMode) {}
82+
const Options& options)
83+
: opToRunOn(op), solver(solver), options(options) {}
7884
~ILPBootstrapPlacementAnalysis() = default;
7985

8086
LogicalResult solve();
@@ -107,12 +113,7 @@ class ILPBootstrapPlacementAnalysis {
107113
private:
108114
Operation* opToRunOn;
109115
DataFlowSolver* solver;
110-
int bootstrapWaterline;
111-
int scaleWaterline;
112-
int scaleFactorBits;
113-
int bootstrapLevelLowerBound;
114-
OpCostModel costModel;
115-
ScaleMode scaleMode;
116+
Options options;
116117
llvm::DenseMap<Operation*, bool> solution;
117118
llvm::DenseMap<Value, int> solutionLevelBeforeBootstrap;
118119
llvm::DenseMap<Value, int> solutionLevelAfterBootstrap;

0 commit comments

Comments
 (0)