blob: 9c64c722148b8648b3da83d136ed9a077acc9cb0 [file] [log] [blame]
Andrea Di Biagio821f6502018-04-10 14:55:14 +00001//===--------------------- DispatchStatistics.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 implements a view that prints a few statistics related to the
12/// dispatch logic. It collects and analyzes instruction dispatch events as
13/// well as static/dynamic dispatch stall events.
14///
15/// Example:
16/// ========
17///
18/// Dynamic Dispatch Stall Cycles:
19/// RAT - Register unavailable: 0
20/// RCU - Retire tokens unavailable: 0
21/// SCHEDQ - Scheduler full: 42
22/// LQ - Load queue full: 0
23/// SQ - Store queue full: 0
24/// GROUP - Static restrictions on the dispatch group: 0
25///
26///
27/// Dispatch Logic - number of cycles where we saw N instructions dispatched:
28/// [# dispatched], [# cycles]
29/// 0, 15 (11.5%)
30/// 2, 4 (3.1%)
31///
32//===----------------------------------------------------------------------===//
33
34#ifndef LLVM_TOOLS_LLVM_MCA_DISPATCHVIEW_H
35#define LLVM_TOOLS_LLVM_MCA_DISPATCHVIEW_H
36
Matt Davis10aa09f2018-08-24 20:24:53 +000037#include "Views/View.h"
Andrea Di Biagio821f6502018-04-10 14:55:14 +000038#include "llvm/ADT/SmallVector.h"
39#include "llvm/MC/MCSubtargetInfo.h"
Andrea Di Biagioa88281d2018-06-18 17:04:56 +000040#include <map>
Andrea Di Biagio821f6502018-04-10 14:55:14 +000041
42namespace mca {
43
44class DispatchStatistics : public View {
Andrea Di Biagio821f6502018-04-10 14:55:14 +000045 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
Andrea Di Biagioa88281d2018-06-18 17:04:56 +000052 using Histogram = std::map<unsigned, unsigned>;
Andrea Di Biagio074ff7c2018-04-11 12:31:44 +000053 Histogram DispatchGroupSizePerCycle;
54
Andrea Di Biagio821f6502018-04-10 14:55:14 +000055 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;
Andrea Di Biagio821f6502018-04-10 14:55:14 +000063
64public:
Andrea Di Biagio641cca32018-04-25 10:27:30 +000065 DispatchStatistics()
66 : NumDispatched(0), NumCycles(0),
Andrea Di Biagio821f6502018-04-10 14:55:14 +000067 HWStalls(HWStallEvent::LastGenericEvent) {}
68
Matt Davis0906a7f2018-07-12 16:56:17 +000069 void onEvent(const HWStallEvent &Event) override;
70
71 void onEvent(const HWInstructionEvent &Event) override;
Andrea Di Biagio821f6502018-04-10 14:55:14 +000072
Andrea Di Biagio3e646442018-04-12 10:49:40 +000073 void onCycleBegin() override { NumCycles++; }
Andrea Di Biagio821f6502018-04-10 14:55:14 +000074
Andrea Di Biagio3e646442018-04-12 10:49:40 +000075 void onCycleEnd() override { updateHistograms(); }
Andrea Di Biagio821f6502018-04-10 14:55:14 +000076
Andrea Di Biagio821f6502018-04-10 14:55:14 +000077 void printView(llvm::raw_ostream &OS) const override {
78 printDispatchStalls(OS);
79 printDispatchHistogram(OS);
80 }
81};
82} // namespace mca
83
84#endif