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