xref: /llvm-project/llvm/tools/llvm-mca/Views/SchedulerStatistics.h (revision fe01014faa336d25543561fc65201dea7f424347)
110aa09f0SMatt Davis //===--------------------- SchedulerStatistics.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 defines class SchedulerStatistics. Class SchedulerStatistics is a
1110aa09f0SMatt Davis /// View that listens to instruction issue events in order to print general
1210aa09f0SMatt Davis /// statistics related to the hardware schedulers.
1310aa09f0SMatt Davis ///
1410aa09f0SMatt Davis /// Example:
1510aa09f0SMatt Davis /// ========
1610aa09f0SMatt Davis ///
1710aa09f0SMatt Davis /// Schedulers - number of cycles where we saw N instructions issued:
1810aa09f0SMatt Davis /// [# issued], [# cycles]
19b89b96c1SAndrea Di Biagio ///  0,          6  (2.9%)
20b89b96c1SAndrea Di Biagio ///  1,          106  (50.7%)
21b89b96c1SAndrea Di Biagio ///  2,          97  (46.4%)
2210aa09f0SMatt Davis ///
2310aa09f0SMatt Davis /// Scheduler's queue usage:
24b89b96c1SAndrea Di Biagio /// [1] Resource name.
25b89b96c1SAndrea Di Biagio /// [2] Average number of used buffer entries.
26b89b96c1SAndrea Di Biagio /// [3] Maximum number of used buffer entries.
27b89b96c1SAndrea Di Biagio /// [4] Total number of buffer entries.
2810aa09f0SMatt Davis ///
29b89b96c1SAndrea Di Biagio ///  [1]            [2]        [3]        [4]
30b89b96c1SAndrea Di Biagio /// JALU01           0          0          20
31b89b96c1SAndrea Di Biagio /// JFPU01           15         18         18
32b89b96c1SAndrea Di Biagio /// JLSAGU           0          0          12
33b89b96c1SAndrea Di Biagio //
3410aa09f0SMatt Davis //===----------------------------------------------------------------------===//
3510aa09f0SMatt Davis 
3610aa09f0SMatt Davis #ifndef LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H
3710aa09f0SMatt Davis #define LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H
3810aa09f0SMatt Davis 
3910aa09f0SMatt Davis #include "llvm/ADT/SmallVector.h"
4010aa09f0SMatt Davis #include "llvm/MC/MCSubtargetInfo.h"
41*fe01014fSPatrick Holland #include "llvm/MCA/View.h"
4210aa09f0SMatt Davis #include <map>
4310aa09f0SMatt Davis 
445a8fd657SFangrui Song namespace llvm {
4510aa09f0SMatt Davis namespace mca {
4610aa09f0SMatt Davis 
47b89b96c1SAndrea Di Biagio class SchedulerStatistics final : public View {
4810aa09f0SMatt Davis   const llvm::MCSchedModel &SM;
49373a4ccfSAndrea Di Biagio   unsigned LQResourceID;
50373a4ccfSAndrea Di Biagio   unsigned SQResourceID;
51373a4ccfSAndrea Di Biagio 
5210aa09f0SMatt Davis   unsigned NumIssued;
5310aa09f0SMatt Davis   unsigned NumCycles;
5410aa09f0SMatt Davis 
55373a4ccfSAndrea Di Biagio   unsigned MostRecentLoadDispatched;
56373a4ccfSAndrea Di Biagio   unsigned MostRecentStoreDispatched;
57373a4ccfSAndrea Di Biagio 
5810aa09f0SMatt Davis   // Tracks the usage of a scheduler's queue.
5910aa09f0SMatt Davis   struct BufferUsage {
6010aa09f0SMatt Davis     unsigned SlotsInUse;
6110aa09f0SMatt Davis     unsigned MaxUsedSlots;
62b89b96c1SAndrea Di Biagio     uint64_t CumulativeNumUsedSlots;
6310aa09f0SMatt Davis   };
6410aa09f0SMatt Davis 
65f6a60f1fSAndrea Di Biagio   using Histogram = std::map<unsigned, unsigned>;
66f6a60f1fSAndrea Di Biagio   Histogram IssueWidthPerCycle;
67f6a60f1fSAndrea Di Biagio 
68b89b96c1SAndrea Di Biagio   std::vector<BufferUsage> Usage;
6910aa09f0SMatt Davis 
70b89b96c1SAndrea Di Biagio   void updateHistograms();
71b89b96c1SAndrea Di Biagio   void printSchedulerStats(llvm::raw_ostream &OS) const;
7210aa09f0SMatt Davis   void printSchedulerUsage(llvm::raw_ostream &OS) const;
7310aa09f0SMatt Davis 
7410aa09f0SMatt Davis public:
75373a4ccfSAndrea Di Biagio   SchedulerStatistics(const llvm::MCSubtargetInfo &STI);
7610aa09f0SMatt Davis   void onEvent(const HWInstructionEvent &Event) override;
onCycleBegin()7710aa09f0SMatt Davis   void onCycleBegin() override { NumCycles++; }
onCycleEnd()7810aa09f0SMatt Davis   void onCycleEnd() override { updateHistograms(); }
7910aa09f0SMatt Davis 
8010aa09f0SMatt Davis   // Increases the number of used scheduler queue slots of every buffered
8110aa09f0SMatt Davis   // resource in the Buffers set.
8229c5d5aaSAndrea Di Biagio   void onReservedBuffers(const InstRef &IR,
8329c5d5aaSAndrea Di Biagio                          llvm::ArrayRef<unsigned> Buffers) override;
8410aa09f0SMatt Davis 
8510aa09f0SMatt Davis   // Decreases by one the number of used scheduler queue slots of every
8610aa09f0SMatt Davis   // buffered resource in the Buffers set.
8729c5d5aaSAndrea Di Biagio   void onReleasedBuffers(const InstRef &IR,
8829c5d5aaSAndrea Di Biagio                          llvm::ArrayRef<unsigned> Buffers) override;
8910aa09f0SMatt Davis 
90b89b96c1SAndrea Di Biagio   void printView(llvm::raw_ostream &OS) const override;
getNameAsString()91d38be2baSWolfgang Pieb   StringRef getNameAsString() const override { return "SchedulerStatistics"; }
isSerializable()92aa13e4feSMarcos Horro   bool isSerializable() const override { return false; }
9310aa09f0SMatt Davis };
9410aa09f0SMatt Davis } // namespace mca
955a8fd657SFangrui Song } // namespace llvm
9610aa09f0SMatt Davis 
9710aa09f0SMatt Davis #endif
98