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
44namespace llvm {
45namespace mca {
46
47class 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
74public:
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