1//===--------------------- DispatchStatistics.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 a view that prints a few statistics related to the
11/// dispatch logic. It collects and analyzes instruction dispatch events as
12/// well as static/dynamic dispatch stall events.
13///
14/// Example:
15/// ========
16///
17/// Dynamic Dispatch Stall Cycles:
18/// RAT     - Register unavailable:                      0
19/// RCU     - Retire tokens unavailable:                 0
20/// SCHEDQ  - Scheduler full:                            42
21/// LQ      - Load queue full:                           0
22/// SQ      - Store queue full:                          0
23/// GROUP   - Static restrictions on the dispatch group: 0
24///
25///
26/// Dispatch Logic - number of cycles where we saw N micro opcodes dispatched:
27/// [# dispatched], [# cycles]
28///  0,              15  (11.5%)
29///  2,              4  (3.1%)
30///
31//===----------------------------------------------------------------------===//
32
33#ifndef LLVM_TOOLS_LLVM_MCA_DISPATCHVIEW_H
34#define LLVM_TOOLS_LLVM_MCA_DISPATCHVIEW_H
35
36#include "Views/View.h"
37#include "llvm/ADT/SmallVector.h"
38#include "llvm/MC/MCSubtargetInfo.h"
39#include <map>
40
41namespace llvm {
42namespace mca {
43
44class DispatchStatistics : public View {
45  unsigned NumDispatched;
46  unsigned NumCycles;
47
48  // Counts dispatch stall events caused by unavailability of resources.  There
49  // is one counter for every generic stall kind (see class HWStallEvent).
50  llvm::SmallVector<unsigned, 8> HWStalls;
51
52  using Histogram = std::map<unsigned, unsigned>;
53  Histogram DispatchGroupSizePerCycle;
54
55  void updateHistograms() {
56    DispatchGroupSizePerCycle[NumDispatched]++;
57    NumDispatched = 0;
58  }
59
60  void printDispatchHistogram(llvm::raw_ostream &OS) const;
61
62  void printDispatchStalls(llvm::raw_ostream &OS) const;
63
64public:
65  DispatchStatistics()
66      : NumDispatched(0), NumCycles(0),
67        HWStalls(HWStallEvent::LastGenericEvent) {}
68
69  void onEvent(const HWStallEvent &Event) override;
70
71  void onEvent(const HWInstructionEvent &Event) override;
72
73  void onCycleBegin() override { NumCycles++; }
74
75  void onCycleEnd() override { updateHistograms(); }
76
77  void printView(llvm::raw_ostream &OS) const override {
78    printDispatchStalls(OS);
79    printDispatchHistogram(OS);
80  }
81  StringRef getNameAsString() const override { return "DispatchStatistics"; }
82};
83} // namespace mca
84} // namespace llvm
85
86#endif
87