Home | History | Annotate | Download | only in llvm-mca
      1 //===--------------------- 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 
     37 #include "View.h"
     38 #include "llvm/ADT/SmallVector.h"
     39 #include "llvm/MC/MCSubtargetInfo.h"
     40 #include <map>
     41 
     42 namespace mca {
     43 
     44 class 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 
     64 public:
     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 };
     82 } // namespace mca
     83 
     84 #endif
     85