blob: 1b577a27234ca3b0d05785881a2ce16f59020688 [file] [log] [blame]
Andrea Di Biagio3a6b0922018-03-08 13:05:02 +00001//===--------------------- ResourcePressureView.h ---------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9/// \file
10///
11/// This file define class ResourcePressureView.
12/// Class ResourcePressureView observes hardware events generated by
13/// the Backend object and collects statistics related to resource usage at
14/// instruction granularity.
15/// Resource pressure information is then printed out to a stream in the
16/// form of a table like the one from the example below:
17///
18/// Resources:
19/// [0] - JALU0
20/// [1] - JALU1
21/// [2] - JDiv
22/// [3] - JFPM
23/// [4] - JFPU0
24/// [5] - JFPU1
25/// [6] - JLAGU
26/// [7] - JSAGU
27/// [8] - JSTC
28/// [9] - JVIMUL
29///
30/// Resource pressure per iteration:
31/// [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
32/// 0.00 0.00 0.00 0.00 2.00 2.00 0.00 0.00 0.00 0.00
33///
34/// Resource pressure by instruction:
35/// [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] Instructions:
36/// - - - - - 1.00 - - - - vpermilpd $1, %xmm0,
37/// %xmm1
38/// - - - - 1.00 - - - - - vaddps %xmm0, %xmm1,
39/// %xmm2
40/// - - - - - 1.00 - - - - vmovshdup %xmm2, %xmm3
41/// - - - - 1.00 - - - - - vaddss %xmm2, %xmm3,
42/// %xmm4
43///
44/// In this example, we have AVX code executed on AMD Jaguar (btver2).
45/// Both shuffles and vector floating point add operations on XMM registers have
46/// a reciprocal throughput of 1cy.
47/// Each add is issued to pipeline JFPU0, while each shuffle is issued to
48/// pipeline JFPU1. The overall pressure per iteration is reported by two
49/// tables: the first smaller table is the resource pressure per iteration;
50/// the second table reports resource pressure per instruction. Values are the
51/// average resource cycles consumed by an instruction.
52/// Every vector add from the example uses resource JFPU0 for an average of 1cy
53/// per iteration. Consequently, the resource pressure on JFPU0 is of 2cy per
54/// iteration.
55///
56//===----------------------------------------------------------------------===//
57
58#ifndef LLVM_TOOLS_LLVM_MCA_RESOURCEPRESSUREVIEW_H
59#define LLVM_TOOLS_LLVM_MCA_RESOURCEPRESSUREVIEW_H
60
Andrea Di Biagio3a6b0922018-03-08 13:05:02 +000061#include "SourceMgr.h"
Andrea Di Biagio53e6ade2018-03-09 12:50:42 +000062#include "View.h"
Andrea Di Biagio3a6b0922018-03-08 13:05:02 +000063#include "llvm/MC/MCInstPrinter.h"
64#include "llvm/MC/MCSubtargetInfo.h"
65#include <map>
66
67namespace mca {
68
69class Backend;
70
71/// This class collects resource pressure statistics and it is able to print
72/// out all the collected information as a table to an output stream.
Andrea Di Biagio8af3fe82018-03-08 16:08:43 +000073class ResourcePressureView : public View {
Andrea Di Biagio3a6b0922018-03-08 13:05:02 +000074 const llvm::MCSubtargetInfo &STI;
75 llvm::MCInstPrinter &MCIP;
76 const SourceMgr &Source;
77
78 // Map to quickly get a resource descriptor from a mask.
79 std::map<uint64_t, unsigned> Resource2VecIndex;
80
81 // Table of resources used by instructions.
82 std::vector<unsigned> ResourceUsage;
83 unsigned NumResourceUnits;
84
85 const llvm::MCInst &GetMCInstFromIndex(unsigned Index) const;
86 void printResourcePressurePerIteration(llvm::raw_ostream &OS,
87 unsigned Executions) const;
88 void printResourcePressurePerInstruction(llvm::raw_ostream &OS,
89 unsigned Executions) const;
Andrea Di Biagio0c541292018-03-10 16:55:07 +000090 void initialize();
Andrea Di Biagio3a6b0922018-03-08 13:05:02 +000091
92public:
93 ResourcePressureView(const llvm::MCSubtargetInfo &ST,
Andrea Di Biagio0c541292018-03-10 16:55:07 +000094 llvm::MCInstPrinter &Printer, const SourceMgr &SM)
Andrea Di Biagio3a6b0922018-03-08 13:05:02 +000095 : STI(ST), MCIP(Printer), Source(SM) {
Andrea Di Biagio0c541292018-03-10 16:55:07 +000096 initialize();
Andrea Di Biagio3a6b0922018-03-08 13:05:02 +000097 }
98
Clement Courbet844f22d2018-03-13 13:11:01 +000099 void onInstructionEvent(const HWInstructionEvent &Event) override;
Andrea Di Biagio3a6b0922018-03-08 13:05:02 +0000100
Andrea Di Biagio07eb79a2018-03-08 17:02:28 +0000101 void printView(llvm::raw_ostream &OS) const override {
Andrea Di Biagio3a6b0922018-03-08 13:05:02 +0000102 unsigned Executions = Source.getNumIterations();
103 printResourcePressurePerIteration(OS, Executions);
104 printResourcePressurePerInstruction(OS, Executions);
105 }
106};
107
108} // namespace mca
109
110#endif