1 //===--------------------- SchedulerStatistics.h ----------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// \file 9 /// 10 /// This file defines class SchedulerStatistics. Class SchedulerStatistics is a 11 /// View that listens to instruction issue events in order to print general 12 /// statistics related to the hardware schedulers. 13 /// 14 /// Example: 15 /// ======== 16 /// 17 /// Schedulers - number of cycles where we saw N instructions issued: 18 /// [# issued], [# cycles] 19 /// 0, 6 (2.9%) 20 /// 1, 106 (50.7%) 21 /// 2, 97 (46.4%) 22 /// 23 /// Scheduler's queue usage: 24 /// [1] Resource name. 25 /// [2] Average number of used buffer entries. 26 /// [3] Maximum number of used buffer entries. 27 /// [4] Total number of buffer entries. 28 /// 29 /// [1] [2] [3] [4] 30 /// JALU01 0 0 20 31 /// JFPU01 15 18 18 32 /// JLSAGU 0 0 12 33 // 34 //===----------------------------------------------------------------------===// 35 36 #ifndef LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H 37 #define LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H 38 39 #include "llvm/ADT/SmallVector.h" 40 #include "llvm/MC/MCSubtargetInfo.h" 41 #include "llvm/MCA/View.h" 42 #include <map> 43 44 namespace llvm { 45 namespace mca { 46 47 class SchedulerStatistics final : public View { 48 const llvm::MCSchedModel &SM; 49 unsigned LQResourceID; 50 unsigned SQResourceID; 51 52 unsigned NumIssued; 53 unsigned NumCycles; 54 55 unsigned MostRecentLoadDispatched; 56 unsigned MostRecentStoreDispatched; 57 58 // Tracks the usage of a scheduler's queue. 59 struct BufferUsage { 60 unsigned SlotsInUse; 61 unsigned MaxUsedSlots; 62 uint64_t CumulativeNumUsedSlots; 63 }; 64 65 using Histogram = std::map<unsigned, unsigned>; 66 Histogram IssueWidthPerCycle; 67 68 std::vector<BufferUsage> Usage; 69 70 void updateHistograms(); 71 void printSchedulerStats(llvm::raw_ostream &OS) const; 72 void printSchedulerUsage(llvm::raw_ostream &OS) const; 73 74 public: 75 SchedulerStatistics(const llvm::MCSubtargetInfo &STI); 76 void onEvent(const HWInstructionEvent &Event) override; onCycleBegin()77 void onCycleBegin() override { NumCycles++; } onCycleEnd()78 void onCycleEnd() override { updateHistograms(); } 79 80 // Increases the number of used scheduler queue slots of every buffered 81 // resource in the Buffers set. 82 void onReservedBuffers(const InstRef &IR, 83 llvm::ArrayRef<unsigned> Buffers) override; 84 85 // Decreases by one the number of used scheduler queue slots of every 86 // buffered resource in the Buffers set. 87 void onReleasedBuffers(const InstRef &IR, 88 llvm::ArrayRef<unsigned> Buffers) override; 89 90 void printView(llvm::raw_ostream &OS) const override; getNameAsString()91 StringRef getNameAsString() const override { return "SchedulerStatistics"; } isSerializable()92 bool isSerializable() const override { return false; } 93 }; 94 } // namespace mca 95 } // namespace llvm 96 97 #endif 98