aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClement Courbet <courbet@google.com>2018-05-24 12:41:02 +0000
committerClement Courbet <courbet@google.com>2018-05-24 12:41:02 +0000
commitae8ae5dc78b8c6950b57b37706dfc37131d4d913 (patch)
treeb2db1517539526a5e3653bc38c881607eb1eaa0f
parent13f8a77d79ed48da17ee61e0ba1357418ad2d706 (diff)
downloadllvm-ae8ae5dc78b8c6950b57b37706dfc37131d4d913.zip
llvm-ae8ae5dc78b8c6950b57b37706dfc37131d4d913.tar.gz
llvm-ae8ae5dc78b8c6950b57b37706dfc37131d4d913.tar.bz2
[llvm-exegesis] Analysis: Show value extents.
Summary: Screenshot attached in phabricator. Reviewers: gchatelet Subscribers: tschuett, llvm-commits Differential Revision: https://reviews.llvm.org/D47318 llvm-svn: 333181
-rw-r--r--llvm/tools/llvm-exegesis/lib/Analysis.cpp32
-rw-r--r--llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp10
-rw-r--r--llvm/tools/llvm-exegesis/lib/BenchmarkResult.h24
-rw-r--r--llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp10
4 files changed, 67 insertions, 9 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.cpp b/llvm/tools/llvm-exegesis/lib/Analysis.cpp
index 6ad693f..0802f84 100644
--- a/llvm/tools/llvm-exegesis/lib/Analysis.cpp
+++ b/llvm/tools/llvm-exegesis/lib/Analysis.cpp
@@ -195,22 +195,30 @@ void Analysis::printSchedClassClustersHtml(std::vector<size_t> PointIds,
OS << "<tr><td>";
writeClusterId<kEscapeHtml>(OS, CurrentClusterId);
OS << "</td><td><ul>";
- const auto &ClusterRepresentative =
- Points[PointIds[I]]; // FIXME: average measurements.
+ std::vector<BenchmarkMeasureStats> MeasurementStats(
+ Points[PointIds[I]].Measurements.size());
for (; I < E &&
Clustering_.getClusterIdForPoint(PointIds[I]) == CurrentClusterId;
++I) {
+ const auto &Point = Points[PointIds[I]];
OS << "<li><span class=\"mono\">";
- writeEscaped<kEscapeHtml>(OS, Points[PointIds[I]].Key.OpcodeName);
+ writeEscaped<kEscapeHtml>(OS, Point.Key.OpcodeName);
OS << "</span> <span class=\"mono\">";
- writeEscaped<kEscapeHtml>(OS, Points[PointIds[I]].Key.Config);
+ writeEscaped<kEscapeHtml>(OS, Point.Key.Config);
OS << "</span></li>";
+ for (size_t J = 0, F = Point.Measurements.size(); J < F; ++J) {
+ MeasurementStats[J].push(Point.Measurements[J]);
+ }
}
OS << "</ul></td>";
- for (const auto &Measurement : ClusterRepresentative.Measurements) {
- OS << "<td>";
- writeMeasurementValue<kEscapeHtml>(OS, Measurement.Value);
- OS << "</td>";
+ for (const auto &Stats : MeasurementStats) {
+ OS << "<td class=\"measurement\">";
+ writeMeasurementValue<kEscapeHtml>(OS, Stats.avg());
+ OS << "<br><span class=\"minmax\">[";
+ writeMeasurementValue<kEscapeHtml>(OS, Stats.min());
+ OS << ";";
+ writeMeasurementValue<kEscapeHtml>(OS, Stats.max());
+ OS << "]</span></td>";
}
OS << "</tr>";
}
@@ -321,7 +329,7 @@ void Analysis::printSchedClassDescHtml(const llvm::MCSchedClassDesc &SCDesc,
writeEscaped<kEscapeHtml>(OS, SubtargetInfo_->getSchedModel()
.getProcResource(WPR.ProcResourceIdx)
->Name);
- OS << "</spam>: " << WPR.Cycles << "</li>";
+ OS << "</span>: " << WPR.Cycles << "</li>";
}
OS << "</ul></td>";
OS << "</tr>";
@@ -378,6 +386,12 @@ table.sched-class-desc td {
span.mono {
font-family: monospace;
}
+span.minmax {
+ color: #888;
+}
+td.measurement {
+ text-align: center;
+}
</style>
</head>
)";
diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp
index b1083f4..ed449db 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp
@@ -104,4 +104,14 @@ void InstructionBenchmark::writeYamlOrDie(const llvm::StringRef Filename) {
}
}
+void BenchmarkMeasureStats::push(const BenchmarkMeasure &BM) {
+ if (Key.empty())
+ Key = BM.Key;
+ assert(Key == BM.Key);
+ ++NumValues;
+ SumValues += BM.Value;
+ MaxValue = std::max(MaxValue, BM.Value);
+ MinValue = std::min(MinValue, BM.Value);
+}
+
} // namespace exegesis
diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h
index 3a7d241..4362df8 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h
@@ -18,6 +18,7 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/YAMLTraits.h"
+#include <limits>
#include <string>
#include <vector>
@@ -61,6 +62,29 @@ struct InstructionBenchmark {
void writeYamlOrDie(const llvm::StringRef Filename);
};
+//------------------------------------------------------------------------------
+// Utilities to work with Benchmark measures.
+
+// A class that measures stats over benchmark measures.
+class BenchmarkMeasureStats {
+public:
+ void push(const BenchmarkMeasure &BM);
+
+ double avg() const {
+ assert(NumValues);
+ return SumValues / NumValues;
+ }
+ double min() const { return MinValue; }
+ double max() const { return MaxValue; }
+
+private:
+ std::string Key;
+ double SumValues = 0.0;
+ int NumValues = 0;
+ double MaxValue = std::numeric_limits<double>::min();
+ double MinValue = std::numeric_limits<double>::max();
+};
+
} // namespace exegesis
#endif // LLVM_TOOLS_LLVM_EXEGESIS_BENCHMARKRESULT_H
diff --git a/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp b/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp
index 9e00510..33b139c 100644
--- a/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp
@@ -77,5 +77,15 @@ TEST(BenchmarkResultTest, WriteToAndReadFromDisk) {
}
}
+TEST(BenchmarkResultTest, BenchmarkMeasureStats) {
+ BenchmarkMeasureStats Stats;
+ Stats.push(BenchmarkMeasure{"a", 0.5, "debug a"});
+ Stats.push(BenchmarkMeasure{"a", 1.5, "debug a"});
+ Stats.push(BenchmarkMeasure{"a", -1.0, "debug a"});
+ Stats.push(BenchmarkMeasure{"a", 0.0, "debug a"});
+ EXPECT_EQ(Stats.min(), -1.0);
+ EXPECT_EQ(Stats.max(), 1.5);
+ EXPECT_EQ(Stats.avg(), 0.25); // (0.5+1.5-1.0+0.0) / 4
+}
} // namespace
} // namespace exegesis