xref: /llvm-project/llvm/tools/llvm-mca/Views/DispatchStatistics.h (revision fe01014faa336d25543561fc65201dea7f424347)
110aa09f0SMatt Davis //===--------------------- DispatchStatistics.h -----------------*- C++ -*-===//
210aa09f0SMatt Davis //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
610aa09f0SMatt Davis //
710aa09f0SMatt Davis //===----------------------------------------------------------------------===//
810aa09f0SMatt Davis /// \file
910aa09f0SMatt Davis ///
1010aa09f0SMatt Davis /// This file implements a view that prints a few statistics related to the
1110aa09f0SMatt Davis /// dispatch logic. It collects and analyzes instruction dispatch events as
1210aa09f0SMatt Davis /// well as static/dynamic dispatch stall events.
1310aa09f0SMatt Davis ///
1410aa09f0SMatt Davis /// Example:
1510aa09f0SMatt Davis /// ========
1610aa09f0SMatt Davis ///
1710aa09f0SMatt Davis /// Dynamic Dispatch Stall Cycles:
1810aa09f0SMatt Davis /// RAT     - Register unavailable:                      0
1910aa09f0SMatt Davis /// RCU     - Retire tokens unavailable:                 0
2010aa09f0SMatt Davis /// SCHEDQ  - Scheduler full:                            42
2110aa09f0SMatt Davis /// LQ      - Load queue full:                           0
2210aa09f0SMatt Davis /// SQ      - Store queue full:                          0
2310aa09f0SMatt Davis /// GROUP   - Static restrictions on the dispatch group: 0
2410aa09f0SMatt Davis ///
2510aa09f0SMatt Davis ///
268b647dcfSAndrea Di Biagio /// Dispatch Logic - number of cycles where we saw N micro opcodes dispatched:
2710aa09f0SMatt Davis /// [# dispatched], [# cycles]
2810aa09f0SMatt Davis ///  0,              15  (11.5%)
2910aa09f0SMatt Davis ///  2,              4  (3.1%)
3010aa09f0SMatt Davis ///
3110aa09f0SMatt Davis //===----------------------------------------------------------------------===//
3210aa09f0SMatt Davis 
3310aa09f0SMatt Davis #ifndef LLVM_TOOLS_LLVM_MCA_DISPATCHVIEW_H
3410aa09f0SMatt Davis #define LLVM_TOOLS_LLVM_MCA_DISPATCHVIEW_H
3510aa09f0SMatt Davis 
3610aa09f0SMatt Davis #include "llvm/ADT/SmallVector.h"
3710aa09f0SMatt Davis #include "llvm/MC/MCSubtargetInfo.h"
38*fe01014fSPatrick Holland #include "llvm/MCA/View.h"
3910aa09f0SMatt Davis #include <map>
4010aa09f0SMatt Davis 
415a8fd657SFangrui Song namespace llvm {
4210aa09f0SMatt Davis namespace mca {
4310aa09f0SMatt Davis 
4410aa09f0SMatt Davis class DispatchStatistics : public View {
4510aa09f0SMatt Davis   unsigned NumDispatched;
4610aa09f0SMatt Davis   unsigned NumCycles;
4710aa09f0SMatt Davis 
4810aa09f0SMatt Davis   // Counts dispatch stall events caused by unavailability of resources.  There
4910aa09f0SMatt Davis   // is one counter for every generic stall kind (see class HWStallEvent).
5010aa09f0SMatt Davis   llvm::SmallVector<unsigned, 8> HWStalls;
5110aa09f0SMatt Davis 
5210aa09f0SMatt Davis   using Histogram = std::map<unsigned, unsigned>;
5310aa09f0SMatt Davis   Histogram DispatchGroupSizePerCycle;
5410aa09f0SMatt Davis 
updateHistograms()5510aa09f0SMatt Davis   void updateHistograms() {
5610aa09f0SMatt Davis     DispatchGroupSizePerCycle[NumDispatched]++;
5710aa09f0SMatt Davis     NumDispatched = 0;
5810aa09f0SMatt Davis   }
5910aa09f0SMatt Davis 
6010aa09f0SMatt Davis   void printDispatchHistogram(llvm::raw_ostream &OS) const;
6110aa09f0SMatt Davis 
6210aa09f0SMatt Davis   void printDispatchStalls(llvm::raw_ostream &OS) const;
6310aa09f0SMatt Davis 
6410aa09f0SMatt Davis public:
DispatchStatistics()6510aa09f0SMatt Davis   DispatchStatistics()
6610aa09f0SMatt Davis       : NumDispatched(0), NumCycles(0),
6710aa09f0SMatt Davis         HWStalls(HWStallEvent::LastGenericEvent) {}
6810aa09f0SMatt Davis 
6910aa09f0SMatt Davis   void onEvent(const HWStallEvent &Event) override;
7010aa09f0SMatt Davis 
7110aa09f0SMatt Davis   void onEvent(const HWInstructionEvent &Event) override;
7210aa09f0SMatt Davis 
onCycleBegin()7310aa09f0SMatt Davis   void onCycleBegin() override { NumCycles++; }
7410aa09f0SMatt Davis 
onCycleEnd()7510aa09f0SMatt Davis   void onCycleEnd() override { updateHistograms(); }
7610aa09f0SMatt Davis 
printView(llvm::raw_ostream & OS)7710aa09f0SMatt Davis   void printView(llvm::raw_ostream &OS) const override {
7810aa09f0SMatt Davis     printDispatchStalls(OS);
7910aa09f0SMatt Davis     printDispatchHistogram(OS);
8010aa09f0SMatt Davis   }
getNameAsString()81d38be2baSWolfgang Pieb   StringRef getNameAsString() const override { return "DispatchStatistics"; }
82aa13e4feSMarcos Horro   json::Value toJSON() const override;
8310aa09f0SMatt Davis };
8410aa09f0SMatt Davis } // namespace mca
855a8fd657SFangrui Song } // namespace llvm
8610aa09f0SMatt Davis 
8710aa09f0SMatt Davis #endif
88