//===--------------------- SchedulerStatistics.h ----------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// \file /// /// This file defines class SchedulerStatistics. Class SchedulerStatistics is a /// View that listens to instruction issue events in order to print general /// statistics related to the hardware schedulers. /// /// Example: /// ======== /// /// Schedulers - number of cycles where we saw N instructions issued: /// [# issued], [# cycles] /// 0, 7 (5.4%) /// 1, 4 (3.1%) /// 2, 8 (6.2%) /// /// Scheduler's queue usage: /// JALU01, 0/20 /// JFPU01, 18/18 /// JLSAGU, 0/12 /// //===----------------------------------------------------------------------===// #ifndef LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H #define LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H #include "View.h" #include "llvm/ADT/SmallVector.h" #include "llvm/MC/MCSubtargetInfo.h" #include <map> namespace mca { class SchedulerStatistics : public View { const llvm::MCSchedModel &SM; using Histogram = std::map<unsigned, unsigned>; Histogram IssuedPerCycle; unsigned NumIssued; unsigned NumCycles; // Tracks the usage of a scheduler's queue. struct BufferUsage { unsigned SlotsInUse; unsigned MaxUsedSlots; }; std::map<unsigned, BufferUsage> BufferedResources; void updateHistograms() { IssuedPerCycle[NumIssued]++; NumIssued = 0; } void printSchedulerStatistics(llvm::raw_ostream &OS) const; void printSchedulerUsage(llvm::raw_ostream &OS) const; public: SchedulerStatistics(const llvm::MCSubtargetInfo &STI) : SM(STI.getSchedModel()), NumIssued(0), NumCycles(0) {} void onEvent(const HWInstructionEvent &Event) override; void onCycleBegin() override { NumCycles++; } void onCycleEnd() override { updateHistograms(); } // Increases the number of used scheduler queue slots of every buffered // resource in the Buffers set. void onReservedBuffers(llvm::ArrayRef<unsigned> Buffers) override; // Decreases by one the number of used scheduler queue slots of every // buffered resource in the Buffers set. void onReleasedBuffers(llvm::ArrayRef<unsigned> Buffers) override; void printView(llvm::raw_ostream &OS) const override { printSchedulerStatistics(OS); printSchedulerUsage(OS); } }; } // namespace mca #endif