Skip to content

[BOLT] Match blocks with pseudo probes #99891

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 65 commits into from
Nov 12, 2024
Merged
Changes from 1 commit
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
5a5991a
[𝘀𝗽𝗿] initial version
shawbyoung Jul 22, 2024
94ffb45
[𝘀𝗽𝗿] changes to main this commit is based on
aaupov Jul 22, 2024
0274f69
Changed assignment of profiles with pseudo probe index
shawbyoung Jul 22, 2024
7e3d8d6
Edit test and assert
shawbyoung Jul 22, 2024
780a07e
Fixed failing asserts, pruned prospective pseudo probes for matching
shawbyoung Jul 23, 2024
1638ac1
Added logging for pseudo probe block matching
shawbyoung Jul 23, 2024
144716b
Changed pseudo probe matching failure logging to v=3
shawbyoung Jul 23, 2024
2934710
More loggin
shawbyoung Jul 23, 2024
b74fc8b
Logging blocks matched with opcodes
shawbyoung Jul 23, 2024
c38fb98
Updated test
shawbyoung Jul 23, 2024
b2a3ca7
Name changes in prep for inlined block pseudo probe block matching
shawbyoung Jul 23, 2024
2eb7bf2
Rm unnecessary Blocks vec in StaleMatcher
shawbyoung Jul 24, 2024
212bd00
Improved matched block counting
shawbyoung Jul 24, 2024
eb6dfb9
Removed comment from test
shawbyoung Jul 24, 2024
16b5cfb
Added comments and check for null YamlBFGUID in StaleMatcher before P…
shawbyoung Jul 24, 2024
799f20c
Omitting braces in one line if
shawbyoung Jul 24, 2024
1e9af7f
[𝘀𝗽𝗿] changes introduced through rebase
aaupov Jul 24, 2024
e3599d4
Pseudo probe matching now is triggered by flag
shawbyoung Jul 24, 2024
33f1b2a
Omit unnecessary braces
shawbyoung Jul 24, 2024
9889f89
Change initialization of index -> probe and probe -> block mappings
shawbyoung Jul 24, 2024
022c517
Formatting
shawbyoung Jul 24, 2024
5109893
Comments
shawbyoung Jul 24, 2024
5bf4220
Changed std ADTs to LLVM
shawbyoung Jul 24, 2024
f1179b1
In matchWithPseudoProbe, hoist BlocksPseudoProbes.size(), added loggi…
shawbyoung Jul 24, 2024
5076bab
A more beautiful helper function for matchWithPseudoProbes
shawbyoung Jul 24, 2024
4f2f642
Added inlined block pseudo probe matching
shawbyoung Jul 25, 2024
327eb81
Added flag to trigger pseudo probe block matching
shawbyoung Jul 25, 2024
37793aa
Added flag for pseudo probe block matching
shawbyoung Jul 25, 2024
ba00b22
Set flag init val, changed std::string to StringRef
shawbyoung Jul 25, 2024
5e47249
[BOLT][NFC] Add timers for MetadataManager invocations
aaupov Aug 1, 2024
3902eff
[MC][NFC] Count pseudo probes and function records
aaupov Aug 26, 2024
d20d4d6
[MC][NFC] Drop unused MCDecodedPseudoProbeInlineTree::ChildrenToProce…
aaupov Jul 25, 2024
a857d32
[profgen][NFC] Pass parameter as const_ref
aaupov Aug 11, 2024
cddea6a
[MC][NFC] Statically allocate storage for decoded pseudo probes and f…
aaupov Aug 26, 2024
9746055
[MC][profgen][NFC] Expand auto for MCDecodedPseudoProbe
aaupov Aug 11, 2024
3dcef48
[MC][NFC] Reduce Address2ProbesMap size
aaupov Aug 26, 2024
ba149d9
[MC][NFC] Use vector for GUIDProbeFunctionMap
aaupov Aug 26, 2024
c35e8ac
buildAddress2ProbeMap timers
aaupov Jul 30, 2024
1c469cf
[BOLT][NFC] Rename profile-use-pseudo-probes
aaupov Aug 27, 2024
97f8101
[BOLT][NFCI] Strip suffix in getLTOCommonName
aaupov Aug 27, 2024
e0a705e
[BOLT] Only parse probes for profiled functions in profile-write-pseu…
aaupov Aug 26, 2024
66fe5d5
[BOLT] Add pseudo probe inline tree to YAML profile
aaupov Aug 31, 2024
36197b1
Reworked block probe matching
aaupov Aug 28, 2024
bfa0afc
[𝘀𝗽𝗿] changes introduced through rebase
aaupov Sep 4, 2024
0f455d0
rebase
aaupov Sep 4, 2024
8fafc04
drop logIf
aaupov Sep 4, 2024
b1be6e6
[𝘀𝗽𝗿] changes introduced through rebase
aaupov Sep 10, 2024
4c5156c
Use new profile probe encoding
aaupov Sep 10, 2024
205c79c
[𝘀𝗽𝗿] changes introduced through rebase
aaupov Sep 10, 2024
544a6ad
Test fix
aaupov Sep 10, 2024
ee214d5
[𝘀𝗽𝗿] changes introduced through rebase
aaupov Sep 11, 2024
0bb4e3a
Memoize top-level GUID->InlineTree mapping, cuts inference time by ~30%
aaupov Sep 11, 2024
880bd37
[𝘀𝗽𝗿] changes introduced through rebase
aaupov Sep 11, 2024
2ba5591
clang-format
aaupov Sep 11, 2024
75d6229
[𝘀𝗽𝗿] changes introduced through rebase
aaupov Sep 12, 2024
3b4e3f4
Update with #107137 changes
aaupov Sep 12, 2024
41e1fa0
[𝘀𝗽𝗿] changes introduced through rebase
aaupov Sep 12, 2024
7ee82b6
Move matchInlineTrees into InlineTreeNodeMapTy
aaupov Sep 12, 2024
648f2bb
[𝘀𝗽𝗿] changes introduced through rebase
aaupov Sep 26, 2024
e8e1cb9
Add test with inline trees, address comments
aaupov Sep 26, 2024
ebd3acf
Allow null block participate in majority vote, improves run-time perf…
aaupov Sep 26, 2024
c84de42
[𝘀𝗽𝗿] changes introduced through rebase
aaupov Nov 8, 2024
e7bce6d
address comments
aaupov Nov 8, 2024
2502434
[𝘀𝗽𝗿] changes introduced through rebase
aaupov Nov 8, 2024
956bcf2
rebase
aaupov Nov 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 40 additions & 16 deletions bolt/lib/Profile/StaleProfileMatching.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ namespace opts {

extern cl::opt<bool> TimeRewrite;
extern cl::OptionCategory BoltOptCategory;
extern cl::opt<unsigned> Verbosity;

cl::opt<bool>
InferStaleProfile("infer-stale-profile",
Expand Down Expand Up @@ -197,9 +198,9 @@ class StaleMatcher {
const std::vector<uint64_t> &CallHashes,
const std::unordered_map<uint64_t,
std::vector<const MCDecodedPseudoProbe *>>
IndexToBinaryPseudoProbes,
&IndexToBinaryPseudoProbes,
const std::unordered_map<const MCDecodedPseudoProbe *, FlowBlock *>
BinaryPseudoProbeToBlock,
&BinaryPseudoProbeToBlock,
const uint64_t YamlBFGUID) {
assert(Blocks.size() == Hashes.size() &&
Hashes.size() == CallHashes.size() &&
Expand Down Expand Up @@ -294,6 +295,9 @@ class StaleMatcher {
// Searches for the pseudo probe attached to the matched function's block,
// ignoring pseudo probes attached to function calls and inlined functions'
// blocks.
if (opts::Verbosity >= 2)
outs() << "BOLT-INFO: attempting to match block with pseudo probes\n";

std::vector<const yaml::bolt::PseudoProbeInfo *> BlockPseudoProbes;
for (const auto &PseudoProbe : PseudoProbes) {
// Ensures that pseudo probe information belongs to the appropriate
Expand All @@ -306,26 +310,41 @@ class StaleMatcher {

BlockPseudoProbes.push_back(&PseudoProbe);
}

// Returns nullptr if there is not a 1:1 mapping of the yaml block pseudo
// probe and binary pseudo probe.
if (BlockPseudoProbes.size() == 0 || BlockPseudoProbes.size() > 1)
if (BlockPseudoProbes.size() == 0) {
if (opts::Verbosity >= 2)
errs() << "BOLT-WARNING: no pseudo probes in profile block\n";
return nullptr;

}
if (BlockPseudoProbes.size() > 1) {
if (opts::Verbosity >= 2)
errs() << "BOLT-WARNING: more than 1 pseudo probes in profile block\n";
return nullptr;
}
uint64_t Index = BlockPseudoProbes[0]->Index;
assert(Index <= Blocks.size() && "Invalid pseudo probe index");

if (Index > Blocks.size()) {
if (opts::Verbosity >= 2)
errs() << "BOLT-WARNING: invalid index block pseudo probe index\n";
return nullptr;
}
auto It = IndexToBinaryPseudoProbes.find(Index);
assert(It != IndexToBinaryPseudoProbes.end() &&
"All blocks should have a pseudo probe");
if (It->second.size() > 1)
if (It == IndexToBinaryPseudoProbes.end()) {
if (opts::Verbosity >= 2)
errs() << "BOLT-WARNING: no block pseudo probes found within binary "
"block at index\n";
return nullptr;

}
if (It->second.size() > 1) {
if (opts::Verbosity >= 2)
errs() << "BOLT-WARNING: more than 1 block pseudo probes in binary "
"block at index\n";
return nullptr;
}
const MCDecodedPseudoProbe *BinaryPseudoProbe = It->second[0];
auto BinaryPseudoProbeIt = BinaryPseudoProbeToBlock.find(BinaryPseudoProbe);
assert(BinaryPseudoProbeIt != BinaryPseudoProbeToBlock.end() &&
"All binary pseudo probes should belong a binary basic block");

return BinaryPseudoProbeIt->second;
}
};
Expand Down Expand Up @@ -555,6 +574,10 @@ size_t matchWeightsByHashes(
ProbeMap.lower_bound(FuncAddr + BlockRange.second));
for (const auto &[_, Probes] : BlockProbes) {
for (const MCDecodedPseudoProbe &Probe : Probes) {
if (Probe.getInlineTreeNode()->hasInlineSite())
continue;
if (Probe.getType() != static_cast<uint8_t>(PseudoProbeType::Block))
continue;
IndexToBinaryPseudoProbes[Probe.getIndex()].push_back(&Probe);
BinaryPseudoProbeToBlock[&Probe] = Blocks[I];
}
Expand All @@ -566,12 +589,13 @@ size_t matchWeightsByHashes(
}

uint64_t BFPseudoProbeDescHash = 0;
if (BF.hasPseudoProbe()) {
const MCPseudoProbeDecoder *PseudoProbeDecoder = BC.getPseudoProbeDecoder();
if (BF.getGUID() != 0) {
assert(PseudoProbeDecoder &&
"If BF has pseudo probe, BC should have a pseudo probe decoder");
BFPseudoProbeDescHash =
PseudoProbeDecoder->getFuncDescForGUID(BF.getGUID())->FuncHash;
auto &GUID2FuncDescMap = PseudoProbeDecoder->getGUID2FuncDescMap();
auto It = GUID2FuncDescMap.find(BF.getGUID());
if (It != GUID2FuncDescMap.end())
BFPseudoProbeDescHash = It->second.FuncHash;
}
uint64_t YamlBFGUID =
BFPseudoProbeDescHash && YamlBF.PseudoProbeDescHash &&
Expand Down