llvm-mirror/tools
Andrea Di Biagio 88551367a3 [MCA][Bottleneck Analysis] Teach how to compute a critical sequence of instructions based on the simulation.
This patch teaches the bottleneck analysis how to identify and print the most
expensive sequence of instructions according to the simulation. Fixes PR37494.

The goal is to help users identify the sequence of instruction which is most
critical for performance.

A dependency graph is internally used by the bottleneck analysis to describe
data dependencies and processor resource interferences between instructions.

There is one node in the graph for every instruction in the input assembly
sequence. The number of nodes in the graph is independent from the number of
iterations simulated by the tool. It means that a single node of the graph
represents all the possible instances of a same instruction contributed by the
simulated iterations.

Edges are dynamically "discovered" by the bottleneck analysis by observing
instruction state transitions and "backend pressure increase" events generated
by the Execute stage. Information from the events is used to identify critical
dependencies, and materialize edges in the graph. A dependency edge is uniquely
identified by a pair of node identifiers plus an instance of struct
DependencyEdge::Dependency (which provides more details about the actual
dependency kind).

The bottleneck analysis internally ranks dependency edges based on their impact
on the runtime (see field DependencyEdge::Dependency::Cost). To this end, each
edge of the graph has an associated cost. By default, the cost of an edge is a
function of its latency (in cycles). In practice, the cost of an edge is also a
function of the number of cycles where the dependency has been seen as
'contributing to backend pressure increases'. The idea is that the higher the
cost of an edge, the higher is the impact of the dependency on performance. To
put it in another way, the cost of an edge is a measure of criticality for
performance.

Note how a same edge may be found in multiple iteration of the simulated loop.
The logic that adds new edges to the graph checks if an equivalent dependency
already exists (duplicate edges are not allowed). If an equivalent dependency
edge is found, field DependencyEdge::Frequency of that edge is incremented by
one, and the new cost is cumulatively added to the existing edge cost.

At the end of simulation, costs are propagated to nodes through the edges of the
graph. The goal is to identify a critical sequence from a node of the root-set
(composed by node of the graph with no predecessors) to a 'sink node' with no
successors.  Note that the graph is intentionally kept acyclic to minimize the
complexity of the critical sequence computation algorithm (complexity is
currently linear in the number of nodes in the graph).

The critical path is finally computed as a sequence of dependency edges. For
edges describing processor resource interferences, the view also prints a
so-called "interference probability" value (by dividing field
DependencyEdge::Frequency by the total number of iterations).

Examples of critical sequence computations can be found in tests added/modified
by this patch.

On output streams that support colored output, instructions from the critical
sequence are rendered with a different color.

Strictly speaking the analysis conducted by the bottleneck analysis view is not
a critical path analysis. The cost of an edge doesn't only depend on the
dependency latency. More importantly, the cost of a same edge may be computed
differently by different iterations.

The number of dependencies is discovered dynamically based on the events
generated by the simulator. However, their number is not fixed. This is
especially true for edges that model processor resource interferences; an
interference may not occur in every iteration. For that reason, it makes sense
to also print out a "probability of interference".

By construction, the accuracy of this analysis (as always) is strongly dependent
on the simulation (and therefore the quality of the information available in the
scheduling model).

That being said, the critical sequence effectively identifies a performance
criticality. Instructions from that sequence are expected to have a very big
impact on performance. So, users can take advantage of this information to focus
their attention on specific interactions between instructions.
In my experience, it works quite well in practice, and produces useful
output (in a reasonable amount time).

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

llvm-svn: 364045
2019-06-21 13:32:54 +00:00
..
bugpoint [Bugpoint] fix another use-after-move. NFC 2019-05-31 21:36:21 +00:00
bugpoint-passes Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
dsymutil Simplify std::lower_bound with llvm::{bsearch,lower_bound}. NFC 2019-06-21 05:40:31 +00:00
gold [Remarks] Extend -fsave-optimization-record to specify the format 2019-06-17 16:06:00 +00:00
llc [Remarks] Extend -fsave-optimization-record to specify the format 2019-06-17 16:06:00 +00:00
lli [ORC] Guarantee unique JITDylib names in lli, add usage notes to createJITDylib. 2019-05-21 22:07:53 +00:00
llvm-ar [llvm-ar] Create thin archives with MRI scripts 2019-06-06 13:19:50 +00:00
llvm-as Make llvm-as --help great again 2019-05-27 08:24:06 +00:00
llvm-as-fuzzer Fix some include order and file headers issues. NFC 2019-02-21 07:42:31 +00:00
llvm-bcanalyzer Use llvm::stable_sort. NFC 2019-04-22 15:53:43 +00:00
llvm-c-test Fix BUILD_SHARED_LIBS builds after r361567 2019-05-24 02:15:27 +00:00
llvm-cat Simplify llvm-cat help 2019-05-13 11:29:25 +00:00
llvm-cfi-verify Recommit [Object] Change object::SectionRef::getContents() to return Expected<StringRef> 2019-05-16 13:24:04 +00:00
llvm-config [cmake] Add function for building native tool 2019-04-02 15:58:03 +00:00
llvm-cov Recommit [Object] Change object::SectionRef::getContents() to return Expected<StringRef> 2019-05-16 13:24:04 +00:00
llvm-cvtres Share /machine: handling code with llvm-cvtres too 2019-06-12 11:32:43 +00:00
llvm-cxxdump Break false dependencies on target libraries 2019-05-23 23:02:56 +00:00
llvm-cxxfilt [binutils] Add response file option to help and docs 2019-06-21 11:49:20 +00:00
llvm-cxxmap Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
llvm-diff Fix some include order and file headers issues. NFC 2019-02-21 07:42:31 +00:00
llvm-dis Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
llvm-dwarfdump [binutils] Add response file option to help and docs 2019-06-21 11:49:20 +00:00
llvm-dwp Fix BUILD_SHARED_LIBS builds after r361567 2019-05-24 02:15:27 +00:00
llvm-elfabi Fix some include order and file headers issues. NFC 2019-02-21 07:42:31 +00:00
llvm-exegesis fix a typo unavaliable=>unavailable 2019-06-08 15:07:55 +00:00
llvm-extract Sanitize llvm-extract -help output 2019-06-12 21:08:19 +00:00
llvm-go [tests][go]Add -stdlib=libc++ to build GO test if LLVM is built with libc++ 2019-05-16 13:32:55 +00:00
llvm-isel-fuzzer Break a couple more false dependencies on target libraries 2019-06-10 23:52:38 +00:00
llvm-itanium-demangle-fuzzer Fix file header issues in fuzzers. NFC 2019-02-21 07:57:14 +00:00
llvm-jitlink Break a couple more false dependencies on target libraries 2019-06-10 23:52:38 +00:00
llvm-jitlistener Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
llvm-link Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
llvm-lipo [llvm-lipo] Drop unneeded braces. NFC 2019-06-07 20:52:17 +00:00
llvm-lto [ThinLTO]LTO]Legacy] Fix dependent libraries support by adding querying of the IRSymtab 2019-06-12 11:07:56 +00:00
llvm-lto2 [Remarks] Extend -fsave-optimization-record to specify the format 2019-06-17 16:06:00 +00:00
llvm-mc [DWARF] Make -g with empty assembler source work better. 2019-03-01 20:58:04 +00:00
llvm-mc-assemble-fuzzer Fix some include order and file headers issues. NFC 2019-02-21 07:42:31 +00:00
llvm-mc-disassemble-fuzzer Fix file header issues in fuzzers. NFC 2019-02-21 07:57:14 +00:00
llvm-mca [MCA][Bottleneck Analysis] Teach how to compute a critical sequence of instructions based on the simulation. 2019-06-21 13:32:54 +00:00
llvm-microsoft-demangle-fuzzer Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
llvm-modextract Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
llvm-mt Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
llvm-nm [llvm-nm] Generalize ELF symbol types 'N' and 'n' 2019-06-20 10:15:11 +00:00
llvm-objcopy [llvm-objcopy][MachO] Rebuild the symbol/string table in the writer 2019-06-21 00:21:50 +00:00
llvm-objdump [binutils] Add response file option to help and docs 2019-06-21 11:49:20 +00:00
llvm-opt-fuzzer Break a couple more false dependencies on target libraries 2019-06-10 23:52:38 +00:00
llvm-opt-report [CommandLineParser] Add DefaultOption flag 2019-04-15 17:18:10 +00:00
llvm-pdbutil [PDB] Copy inlinee lines records into the PDB 2019-06-03 18:15:38 +00:00
llvm-profdata [llvm-profdata] Add overlap command to compute similarity b/w two profile files 2019-04-30 21:19:12 +00:00
llvm-rc Fix typos: (re)?sor?uce -> (re)?source 2019-04-26 05:56:23 +00:00
llvm-readobj [binutils] Add response file option to help and docs 2019-06-21 11:49:20 +00:00
llvm-rtdyld Break false dependencies on target libraries 2019-05-23 23:02:56 +00:00
llvm-shlib [llvm-shlib] Fix cross-compilation for LLVM-C 2019-04-02 15:58:05 +00:00
llvm-size [binutils] Add response file option to help and docs 2019-06-21 11:49:20 +00:00
llvm-special-case-list-fuzzer Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
llvm-split Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
llvm-stress Avoid cppcheck operator precedence warnings. NFCI. 2019-05-03 13:50:38 +00:00
llvm-strings [binutils] Add response file option to help and docs 2019-06-21 11:49:20 +00:00
llvm-symbolizer [binutils] Add response file option to help and docs 2019-06-21 11:49:20 +00:00
llvm-undname llvm-undname: Add a -raw-file flag to pass a raw buffer to microsoftDemangle 2019-04-16 12:51:40 +00:00
llvm-xray Simplify std::lower_bound with llvm::{bsearch,lower_bound}. NFC 2019-06-21 05:40:31 +00:00
llvm-yaml-numeric-parser-fuzzer Fix file header issues in fuzzers. NFC 2019-02-21 07:57:14 +00:00
lto [Legacy LTO] Fix build bots: r363140: Fix export name 2019-06-12 12:17:49 +00:00
msbuild vs integration: bump version nbr 2019-06-19 07:39:53 +00:00
obj2yaml [yaml2obj/obj2yaml] - Make RawContentSection::Info Optional<> 2019-06-19 08:57:38 +00:00
opt [Remarks] Extend -fsave-optimization-record to specify the format 2019-06-17 16:06:00 +00:00
opt-viewer [opt-viewer] Teach optrecord.py about !Failure tags 2019-03-27 18:35:04 +00:00
remarks-shlib Reland "[Remarks] Add a new Remark / RemarkParser abstraction" 2019-03-19 21:11:07 +00:00
sancov Recommit [Object] Change object::SectionRef::getContents() to return Expected<StringRef> 2019-05-16 13:24:04 +00:00
sanstats [DebugInfo] add SectionedAddress to DebugInfo interfaces. 2019-02-27 13:17:36 +00:00
verify-uselistorder Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
xcode-toolchain [CMake] Use LLVM_ENABLE_IDE instead of CMAKE_CONFIGURATION_TYPES 2018-10-15 21:20:02 +00:00
yaml2obj [yaml2obj] - Convert ELFState<ELFT>::addSymbols method to toELFSymbols helper. NFCI. 2019-06-20 14:44:48 +00:00
CMakeLists.txt Fix most of LLVM's tests with LLVM_ENABLE_PIC=OFF 2019-01-16 20:44:36 +00:00
LLVMBuild.txt [JITLink] Add llvm-jitlink subdirectory to tools/LLVMBuild.txt 2019-04-20 17:58:29 +00:00