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 44namespace llvm { 45namespace mca { 46 47class 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 74public: 75 SchedulerStatistics(const llvm::MCSubtargetInfo &STI); 76 void onEvent(const HWInstructionEvent &Event) override; 77 void onCycleBegin() override { NumCycles++; } 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; 91 StringRef getNameAsString() const override { return "SchedulerStatistics"; } 92 bool isSerializable() const override { return false; } 93}; 94} // namespace mca 95} // namespace llvm 96 97#endif 98