Skip to content

Commit bba01ba

Browse files
committed
Merge bitcoin#30285: cluster mempool: merging & postprocessing of linearizations
bbcee5a clusterlin: improve rechunking in LinearizationChunking (optimization) (Pieter Wuille) 04d7a04 clusterlin: add MergeLinearizations function + fuzz test + benchmark (Pieter Wuille) 4f8958d clusterlin: add PostLinearize + benchmarks + fuzz tests (Pieter Wuille) 0e2812d clusterlin: add algorithms for connectedness/connected components (Pieter Wuille) 0e52728 clusterlin: rename Intersect -> IntersectPrefixes (Pieter Wuille) Pull request description: Part of cluster mempool: bitcoin#30289 Depends on bitcoin#30126, and was split off from it. bitcoin#28676 depends on this. This adds the algorithms for merging & postprocessing linearizations. The `PostLinearize(depgraph, linearization)` function performs an in-place improvement of `linearization`, using two iterations of the [Linearization post-processing](https://delvingbitcoin.org/t/linearization-post-processing-o-n-2-fancy-chunking/201/8) algorithm. The first running from back to front, the second from front to back. The `MergeLinearizations(depgraph, linearization1, linearization2)` function computes a new linearization for the provided cluster, given two existing linearizations for that cluster, which is at least as good as both inputs. The algorithm is described at a high level in [merging incomparable linearizations](https://delvingbitcoin.org/t/merging-incomparable-linearizations/209). For background and references, see [Introduction to cluster linearization](https://delvingbitcoin.org/t/introduction-to-cluster-linearization/1032). ACKs for top commit: sdaftuar: ACK bbcee5a glozow: code review ACK bbcee5a instagibbs: ACK bitcoin@bbcee5a Tree-SHA512: d2b5a3f132d1ef22ddf9c56421ab8b397efe45b3c4c705548dda56f5b39fe4b8f57a0d2a4c65b338462d80bb5b9b84a9a39efa1b4f390420a8005ce31817774e
2 parents 1a7d205 + bbcee5a commit bba01ba

File tree

3 files changed

+653
-16
lines changed

3 files changed

+653
-16
lines changed

src/bench/cluster_linearize.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,38 @@ void BenchLinearizeNoItersWorstCaseLIMO(ClusterIndex ntx, benchmark::Bench& benc
169169
});
170170
}
171171

172+
template<typename SetType>
173+
void BenchPostLinearizeWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
174+
{
175+
DepGraph<SetType> depgraph = MakeWideGraph<SetType>(ntx);
176+
std::vector<ClusterIndex> lin(ntx);
177+
bench.run([&] {
178+
for (ClusterIndex i = 0; i < ntx; ++i) lin[i] = i;
179+
PostLinearize(depgraph, lin);
180+
});
181+
}
182+
183+
template<typename SetType>
184+
void BenchMergeLinearizationsWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
185+
{
186+
DepGraph<SetType> depgraph;
187+
for (ClusterIndex i = 0; i < ntx; ++i) {
188+
depgraph.AddTransaction({i, 1});
189+
if (i) depgraph.AddDependency(0, i);
190+
}
191+
std::vector<ClusterIndex> lin1;
192+
std::vector<ClusterIndex> lin2;
193+
lin1.push_back(0);
194+
lin2.push_back(0);
195+
for (ClusterIndex i = 1; i < ntx; ++i) {
196+
lin1.push_back(i);
197+
lin2.push_back(ntx - i);
198+
}
199+
bench.run([&] {
200+
MergeLinearizations(depgraph, lin1, lin2);
201+
});
202+
}
203+
172204
} // namespace
173205

174206
static void LinearizePerIter16TxWorstCase(benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<16>>(16, bench); }
@@ -192,6 +224,20 @@ static void LinearizeNoIters64TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLi
192224
static void LinearizeNoIters75TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<75>>(75, bench); }
193225
static void LinearizeNoIters99TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<99>>(99, bench); }
194226

227+
static void PostLinearize16TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<16>>(16, bench); }
228+
static void PostLinearize32TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<32>>(32, bench); }
229+
static void PostLinearize48TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<48>>(48, bench); }
230+
static void PostLinearize64TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<64>>(64, bench); }
231+
static void PostLinearize75TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<75>>(75, bench); }
232+
static void PostLinearize99TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<99>>(99, bench); }
233+
234+
static void MergeLinearizations16TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<16>>(16, bench); }
235+
static void MergeLinearizations32TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<32>>(32, bench); }
236+
static void MergeLinearizations48TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<48>>(48, bench); }
237+
static void MergeLinearizations64TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<64>>(64, bench); }
238+
static void MergeLinearizations75TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<75>>(75, bench); }
239+
static void MergeLinearizations99TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<99>>(99, bench); }
240+
195241
BENCHMARK(LinearizePerIter16TxWorstCase, benchmark::PriorityLevel::HIGH);
196242
BENCHMARK(LinearizePerIter32TxWorstCase, benchmark::PriorityLevel::HIGH);
197243
BENCHMARK(LinearizePerIter48TxWorstCase, benchmark::PriorityLevel::HIGH);
@@ -212,3 +258,17 @@ BENCHMARK(LinearizeNoIters48TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
212258
BENCHMARK(LinearizeNoIters64TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
213259
BENCHMARK(LinearizeNoIters75TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
214260
BENCHMARK(LinearizeNoIters99TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
261+
262+
BENCHMARK(PostLinearize16TxWorstCase, benchmark::PriorityLevel::HIGH);
263+
BENCHMARK(PostLinearize32TxWorstCase, benchmark::PriorityLevel::HIGH);
264+
BENCHMARK(PostLinearize48TxWorstCase, benchmark::PriorityLevel::HIGH);
265+
BENCHMARK(PostLinearize64TxWorstCase, benchmark::PriorityLevel::HIGH);
266+
BENCHMARK(PostLinearize75TxWorstCase, benchmark::PriorityLevel::HIGH);
267+
BENCHMARK(PostLinearize99TxWorstCase, benchmark::PriorityLevel::HIGH);
268+
269+
BENCHMARK(MergeLinearizations16TxWorstCase, benchmark::PriorityLevel::HIGH);
270+
BENCHMARK(MergeLinearizations32TxWorstCase, benchmark::PriorityLevel::HIGH);
271+
BENCHMARK(MergeLinearizations48TxWorstCase, benchmark::PriorityLevel::HIGH);
272+
BENCHMARK(MergeLinearizations64TxWorstCase, benchmark::PriorityLevel::HIGH);
273+
BENCHMARK(MergeLinearizations75TxWorstCase, benchmark::PriorityLevel::HIGH);
274+
BENCHMARK(MergeLinearizations99TxWorstCase, benchmark::PriorityLevel::HIGH);

0 commit comments

Comments
 (0)