diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2019-02-04 09:12:17 +0000 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2019-02-04 09:12:17 +0000 |
commit | 1a0d595f15602b6fe222f0ee7dfd0285e433ab7c (patch) | |
tree | 9efc189bd00363fc29535f87dda8c3771d6676f9 /llvm/tools/llvm-exegesis/lib/Analysis.cpp | |
parent | dc78bc277d10d22daa422c35c61e0a3993bd6269 (diff) | |
download | llvm-1a0d595f15602b6fe222f0ee7dfd0285e433ab7c.zip llvm-1a0d595f15602b6fe222f0ee7dfd0285e433ab7c.tar.gz llvm-1a0d595f15602b6fe222f0ee7dfd0285e433ab7c.tar.bz2 |
[llvm-exegesis] Throughput support in analysis mode
Summary:
D57000 / [[ https://bugs.llvm.org/show_bug.cgi?id=37698 | PR37698 ]] added support for measuring of the inverse throughput.
But the support for the analysis was not added.
This attempts to fix that. (analysis done o bdver2 / piledriver)
First, small-scale experiment:
```
$ ./bin/llvm-exegesis -num-repetitions=10000 -mode=inverse_throughput -opcode-name=BSF64rr
Check generated assembly with: /usr/bin/objdump -d /tmp/snippet-d0acdd.o
---
mode: inverse_throughput
key:
instructions:
- 'BSF64rr RAX RDX'
config: ''
register_initial_values:
- 'RDX=0x0'
cpu_name: bdver2
llvm_triple: x86_64-unknown-linux-gnu
num_repetitions: 10000
measurements:
- { key: inverse_throughput, value: 3.0278, per_snippet_value: 3.0278 }
error: ''
info: instruction has no tied variables picking Uses different from defs
assembled_snippet: 48BA0000000000000000480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2480FBCC2C3
...
```
If we plug `bsfq %r12, %r10` into llvm-mca:
https://godbolt.org/z/ZtOyhJ
```
Dispatch Width: 4
uOps Per Cycle: 3.00
IPC: 0.50
Block RThroughput: 2.0
```
So RThroughput mismatch exists.
Now, let's upscale and analyse:
{F8207148}
`$ ./bin/llvm-exegesis -mode=analysis -analysis-epsilon=1.0 -benchmarks-file=/tmp/benchmarks-inverse_throughput.yaml -analysis-inconsistencies-output-file=/tmp/clusters.html`:
{F8207172}
{F8207197}
And if we now look at https://www.agner.org/optimize/instruction_tables.pdf,
`Reciprocal throughput` for `BSF r,r` is listed as `3`.
Yay?
Reviewers: courbet, gchatelet
Reviewed By: courbet
Subscribers: tschuett, RKSimon, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D57647
llvm-svn: 353023
Diffstat (limited to 'llvm/tools/llvm-exegesis/lib/Analysis.cpp')
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/Analysis.cpp | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.cpp b/llvm/tools/llvm-exegesis/lib/Analysis.cpp index 47afa8c..158fbfe3 100644 --- a/llvm/tools/llvm-exegesis/lib/Analysis.cpp +++ b/llvm/tools/llvm-exegesis/lib/Analysis.cpp @@ -316,6 +316,7 @@ void Analysis::printSchedClassClustersHtml( writeLatencySnippetHtml(OS, Point.Key.Instructions, *InstrInfo_); break; case InstructionBenchmark::Uops: + case InstructionBenchmark::InverseThroughput: writeUopsSnippetHtml(OS, Point.Key.Instructions, *InstrInfo_); break; default: @@ -507,9 +508,14 @@ bool Analysis::SchedClassCluster::measurementsMatch( } ClusterCenterPoint[I].PerInstructionValue = Representative[I].avg(); } + } else if (Mode == InstructionBenchmark::InverseThroughput) { + for (int I = 0, E = Representative.size(); I < E; ++I) { + SchedClassPoint[I].PerInstructionValue = + MCSchedModel::getReciprocalThroughput(STI, *RSC.SCDesc); + ClusterCenterPoint[I].PerInstructionValue = Representative[I].min(); + } } else { - llvm::errs() << "unimplemented measurement matching for mode " << Mode - << "\n"; + llvm_unreachable("unimplemented measurement matching mode"); return false; } return Clustering.isNeighbour(ClusterCenterPoint, SchedClassPoint); @@ -519,9 +525,9 @@ void Analysis::printSchedClassDescHtml(const ResolvedSchedClass &RSC, llvm::raw_ostream &OS) const { OS << "<table class=\"sched-class-desc\">"; OS << "<tr><th>Valid</th><th>Variant</th><th>NumMicroOps</th><th>Latency</" - "th><th>WriteProcRes</th><th title=\"This is the idealized unit " - "resource (port) pressure assuming ideal distribution\">Idealized " - "Resource Pressure</th></tr>"; + "th><th>RThroughput</th><th>WriteProcRes</th><th title=\"This is the " + "idealized unit resource (port) pressure assuming ideal " + "distribution\">Idealized Resource Pressure</th></tr>"; if (RSC.SCDesc->isValid()) { const auto &SM = SubtargetInfo_->getSchedModel(); OS << "<tr><td>✔</td>"; @@ -540,6 +546,12 @@ void Analysis::printSchedClassDescHtml(const ResolvedSchedClass &RSC, OS << "</li>"; } OS << "</ul></td>"; + // inverse throughput. + OS << "<td>"; + writeMeasurementValue<kEscapeHtml>( + OS, + MCSchedModel::getReciprocalThroughput(*SubtargetInfo_, *RSC.SCDesc)); + OS << "</td>"; // WriteProcRes. OS << "<td><ul>"; for (const auto &WPR : RSC.NonRedundantWriteProcRes) { |