1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

[llvm-exegesis] Show noise cluster in analysis output.

Reviewers: gchatelet

Subscribers: tschuett, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D68780

llvm-svn: 374533
This commit is contained in:
Clement Courbet 2019-10-11 11:33:18 +00:00
parent a331311b65
commit 37e17e4483
3 changed files with 91 additions and 19 deletions

View File

@ -0,0 +1,23 @@
# RUN: llvm-exegesis -mode=analysis -benchmarks-file=%s -analysis-inconsistencies-output-file=- -analysis-clusters-output-file="" -analysis-numpoints=3 | FileCheck %s
# CHECK: DOCTYPE
# CHECK: [noise] Cluster (1 points)
---
mode: latency
key:
instructions:
- 'ADD64rr RAX RAX RDI'
config: ''
register_initial_values:
- 'RAX=0x0'
- 'RDI=0x0'
cpu_name: haswell
llvm_triple: x86_64-unknown-linux-gnu
num_repetitions: 10000
measurements:
- { key: latency, value: 1.0049, per_snippet_value: 1.0049 }
error: ''
info: Repeating a single implicitly serial instruction
assembled_snippet: 48B8000000000000000048BF00000000000000004801F84801F84801F84801F84801F84801F84801F84801F84801F84801F84801F84801F84801F84801F84801F84801F8C3
...

View File

@ -268,6 +268,27 @@ static void writeLatencySnippetHtml(raw_ostream &OS,
}
}
void Analysis::printPointHtml(const InstructionBenchmark &Point,
llvm::raw_ostream &OS) const {
OS << "<li><span class=\"mono\" title=\"";
writeSnippet<EscapeTag, kEscapeHtmlString>(OS, Point.AssembledSnippet, "\n");
OS << "\">";
switch (Point.Mode) {
case InstructionBenchmark::Latency:
writeLatencySnippetHtml(OS, Point.Key.Instructions, *InstrInfo_);
break;
case InstructionBenchmark::Uops:
case InstructionBenchmark::InverseThroughput:
writeUopsSnippetHtml(OS, Point.Key.Instructions, *InstrInfo_);
break;
default:
llvm_unreachable("invalid mode");
}
OS << "</span> <span class=\"mono\">";
writeEscaped<kEscapeHtml>(OS, Point.Key.Config);
OS << "</span></li>";
}
void Analysis::printSchedClassClustersHtml(
const std::vector<SchedClassCluster> &Clusters,
const ResolvedSchedClass &RSC, raw_ostream &OS) const {
@ -292,25 +313,7 @@ void Analysis::printSchedClassClustersHtml(
writeClusterId<kEscapeHtml>(OS, Cluster.id());
OS << "</td><td><ul>";
for (const size_t PointId : Cluster.getPointIds()) {
const auto &Point = Points[PointId];
OS << "<li><span class=\"mono\" title=\"";
writeSnippet<EscapeTag, kEscapeHtmlString>(OS, Point.AssembledSnippet,
"\n");
OS << "\">";
switch (Point.Mode) {
case InstructionBenchmark::Latency:
writeLatencySnippetHtml(OS, Point.Key.Instructions, *InstrInfo_);
break;
case InstructionBenchmark::Uops:
case InstructionBenchmark::InverseThroughput:
writeUopsSnippetHtml(OS, Point.Key.Instructions, *InstrInfo_);
break;
default:
llvm_unreachable("invalid mode");
}
OS << "</span> <span class=\"mono\">";
writeEscaped<kEscapeHtml>(OS, Point.Key.Config);
OS << "</span></li>";
printPointHtml(Points[PointId], OS);
}
OS << "</ul></td>";
for (const auto &Stats : Cluster.getCentroid().getStats()) {
@ -422,6 +425,43 @@ void Analysis::printSchedClassDescHtml(const ResolvedSchedClass &RSC,
OS << "</table>";
}
void Analysis::printClusterRawHtml(
const InstructionBenchmarkClustering::ClusterId &Id, StringRef display_name,
llvm::raw_ostream &OS) const {
const auto &Points = Clustering_.getPoints();
const auto &Cluster = Clustering_.getCluster(Id);
if (Cluster.PointIndices.empty())
return;
OS << "<div class=\"inconsistency\"><p>" << display_name << " Cluster ("
<< Cluster.PointIndices.size() << " points)</p>";
OS << "<table class=\"sched-class-clusters\">";
// Table Header.
OS << "<tr><th>ClusterId</th><th>Opcode/Config</th>";
for (const auto &Measurement : Points[Cluster.PointIndices[0]].Measurements) {
OS << "<th>";
writeEscaped<kEscapeHtml>(OS, Measurement.Key);
OS << "</th>";
}
OS << "</tr>";
// Point data.
for (const auto &PointId : Cluster.PointIndices) {
OS << "<tr class=\"bad-cluster\"><td>" << display_name << "</td><td><ul>";
printPointHtml(Points[PointId], OS);
OS << "</ul></td>";
for (const auto &Measurement : Points[PointId].Measurements) {
OS << "<td class=\"measurement\">";
writeMeasurementValue<kEscapeHtml>(OS, Measurement.PerInstructionValue);
}
OS << "</tr>";
}
OS << "</table>";
OS << "</div>";
} // namespace exegesis
static constexpr const char kHtmlHead[] = R"(
<head>
<title>llvm-exegesis Analysis Results</title>
@ -549,6 +589,9 @@ Error Analysis::run<Analysis::PrintSchedClassInconsistencies>(
OS << "</div>";
}
printClusterRawHtml(InstructionBenchmarkClustering::ClusterId::noise(),
"[noise]", OS);
OS << "</body></html>";
return Error::success();
}

View File

@ -81,6 +81,12 @@ private:
void printInstructionRowCsv(size_t PointId, raw_ostream &OS) const;
void printClusterRawHtml(const InstructionBenchmarkClustering::ClusterId &Id,
StringRef display_name, llvm::raw_ostream &OS) const;
void printPointHtml(const InstructionBenchmark &Point,
llvm::raw_ostream &OS) const;
void
printSchedClassClustersHtml(const std::vector<SchedClassCluster> &Clusters,
const ResolvedSchedClass &SC,