1 | //===--------------------- SchedulerStatistics.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 defines class SchedulerStatistics. Class SchedulerStatistics is a |
11 | /// View that listens to instruction issue events in order to print general |
12 | /// statistics related to the hardware schedulers. |
13 | /// |
14 | /// Example: |
15 | /// ======== |
16 | /// |
17 | /// Schedulers - number of cycles where we saw N instructions issued: |
18 | /// [# issued], [# cycles] |
19 | /// 0, 6 (2.9%) |
20 | /// 1, 106 (50.7%) |
21 | /// 2, 97 (46.4%) |
22 | /// |
23 | /// Scheduler's queue usage: |
24 | /// [1] Resource name. |
25 | /// [2] Average number of used buffer entries. |
26 | /// [3] Maximum number of used buffer entries. |
27 | /// [4] Total number of buffer entries. |
28 | /// |
29 | /// [1] [2] [3] [4] |
30 | /// JALU01 0 0 20 |
31 | /// JFPU01 15 18 18 |
32 | /// JLSAGU 0 0 12 |
33 | // |
34 | //===----------------------------------------------------------------------===// |
35 | |
36 | #ifndef LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H |
37 | #define LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H |
38 | |
39 | #include "llvm/ADT/SmallVector.h" |
40 | #include "llvm/MC/MCSubtargetInfo.h" |
41 | #include "llvm/MCA/View.h" |
42 | #include <map> |
43 | |
44 | namespace llvm { |
45 | namespace mca { |
46 | |
47 | class SchedulerStatistics final : public View { |
48 | const llvm::MCSchedModel &SM; |
49 | unsigned LQResourceID; |
50 | unsigned SQResourceID; |
51 | |
52 | unsigned NumIssued; |
53 | unsigned NumCycles; |
54 | |
55 | unsigned MostRecentLoadDispatched; |
56 | unsigned MostRecentStoreDispatched; |
57 | |
58 | // Tracks the usage of a scheduler's queue. |
59 | struct BufferUsage { |
60 | unsigned SlotsInUse; |
61 | unsigned MaxUsedSlots; |
62 | uint64_t CumulativeNumUsedSlots; |
63 | }; |
64 | |
65 | using Histogram = std::map<unsigned, unsigned>; |
66 | Histogram IssueWidthPerCycle; |
67 | |
68 | std::vector<BufferUsage> Usage; |
69 | |
70 | void updateHistograms(); |
71 | void printSchedulerStats(llvm::raw_ostream &OS) const; |
72 | void printSchedulerUsage(llvm::raw_ostream &OS) const; |
73 | |
74 | public: |
75 | SchedulerStatistics(const llvm::MCSubtargetInfo &STI); |
76 | void onEvent(const HWInstructionEvent &Event) override; |
77 | void onCycleBegin() override { NumCycles++; } |
78 | void onCycleEnd() override { updateHistograms(); } |
79 | |
80 | // Increases the number of used scheduler queue slots of every buffered |
81 | // resource in the Buffers set. |
82 | void onReservedBuffers(const InstRef &IR, |
83 | llvm::ArrayRef<unsigned> Buffers) override; |
84 | |
85 | // Decreases by one the number of used scheduler queue slots of every |
86 | // buffered resource in the Buffers set. |
87 | void onReleasedBuffers(const InstRef &IR, |
88 | llvm::ArrayRef<unsigned> Buffers) override; |
89 | |
90 | void printView(llvm::raw_ostream &OS) const override; |
91 | StringRef getNameAsString() const override { return "SchedulerStatistics" ; } |
92 | bool isSerializable() const override { return false; } |
93 | }; |
94 | } // namespace mca |
95 | } // namespace llvm |
96 | |
97 | #endif |
98 | |