1 | //===--------------------- SummaryView.h ------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | /// \file |
9 | /// |
10 | /// This file implements the summary view. |
11 | /// |
12 | /// The goal of the summary view is to give a very quick overview of the |
13 | /// performance throughput. Below is an example of summary view: |
14 | /// |
15 | /// |
16 | /// Iterations: 300 |
17 | /// Instructions: 900 |
18 | /// Total Cycles: 610 |
19 | /// Dispatch Width: 2 |
20 | /// IPC: 1.48 |
21 | /// Block RThroughput: 2.0 |
22 | /// |
23 | /// The summary view collects a few performance numbers. The two main |
24 | /// performance indicators are 'Total Cycles' and IPC (Instructions Per Cycle). |
25 | /// |
26 | //===----------------------------------------------------------------------===// |
27 | |
28 | #ifndef LLVM_TOOLS_LLVM_MCA_SUMMARYVIEW_H |
29 | #define LLVM_TOOLS_LLVM_MCA_SUMMARYVIEW_H |
30 | |
31 | #include "llvm/MC/MCSchedule.h" |
32 | #include "llvm/MCA/View.h" |
33 | #include "llvm/Support/raw_ostream.h" |
34 | |
35 | namespace llvm { |
36 | namespace mca { |
37 | |
38 | /// A view that collects and prints a few performance numbers. |
39 | class SummaryView : public View { |
40 | const llvm::MCSchedModel &SM; |
41 | llvm::ArrayRef<llvm::MCInst> Source; |
42 | const unsigned DispatchWidth; |
43 | unsigned LastInstructionIdx; |
44 | unsigned TotalCycles; |
45 | // The total number of micro opcodes contributed by a block of instructions. |
46 | unsigned NumMicroOps; |
47 | |
48 | struct DisplayValues { |
49 | unsigned Instructions; |
50 | unsigned Iterations; |
51 | unsigned TotalInstructions; |
52 | unsigned TotalCycles; |
53 | unsigned DispatchWidth; |
54 | unsigned TotalUOps; |
55 | double IPC; |
56 | double UOpsPerCycle; |
57 | double BlockRThroughput; |
58 | }; |
59 | |
60 | // For each processor resource, this vector stores the cumulative number of |
61 | // resource cycles consumed by the analyzed code block. |
62 | llvm::SmallVector<unsigned, 8> ProcResourceUsage; |
63 | |
64 | // Each processor resource is associated with a so-called processor resource |
65 | // mask. This vector allows to correlate processor resource IDs with processor |
66 | // resource masks. There is exactly one element per each processor resource |
67 | // declared by the scheduling model. |
68 | llvm::SmallVector<uint64_t, 8> ProcResourceMasks; |
69 | |
70 | // Used to map resource indices to actual processor resource IDs. |
71 | llvm::SmallVector<unsigned, 8> ResIdx2ProcResID; |
72 | |
73 | /// Compute the data we want to print out in the object DV. |
74 | void collectData(DisplayValues &DV) const; |
75 | |
76 | public: |
77 | SummaryView(const llvm::MCSchedModel &Model, llvm::ArrayRef<llvm::MCInst> S, |
78 | unsigned Width); |
79 | |
80 | void onCycleEnd() override { ++TotalCycles; } |
81 | void onEvent(const HWInstructionEvent &Event) override; |
82 | void printView(llvm::raw_ostream &OS) const override; |
83 | StringRef getNameAsString() const override { return "SummaryView" ; } |
84 | json::Value toJSON() const override; |
85 | }; |
86 | } // namespace mca |
87 | } // namespace llvm |
88 | |
89 | #endif |
90 | |