diff options
-rw-r--r-- | llvm/test/tools/llvm-exegesis/X86/analysis-noise.test | 23 | ||||
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/Analysis.cpp | 81 | ||||
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/Analysis.h | 6 |
3 files changed, 91 insertions, 19 deletions
diff --git a/llvm/test/tools/llvm-exegesis/X86/analysis-noise.test b/llvm/test/tools/llvm-exegesis/X86/analysis-noise.test new file mode 100644 index 00000000000..6f4ecfcc0ad --- /dev/null +++ b/llvm/test/tools/llvm-exegesis/X86/analysis-noise.test @@ -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 +... diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.cpp b/llvm/tools/llvm-exegesis/lib/Analysis.cpp index 342b2e52285..0fa0767b71d 100644 --- a/llvm/tools/llvm-exegesis/lib/Analysis.cpp +++ b/llvm/tools/llvm-exegesis/lib/Analysis.cpp @@ -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(); } diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.h b/llvm/tools/llvm-exegesis/lib/Analysis.h index eac5fef8c96..4c1c864e6e7 100644 --- a/llvm/tools/llvm-exegesis/lib/Analysis.h +++ b/llvm/tools/llvm-exegesis/lib/Analysis.h @@ -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, |