//===--------------------- SchedulerStatistics.h ----------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// \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, 6 (2.9%) /// 1, 106 (50.7%) /// 2, 97 (46.4%) /// /// Scheduler's queue usage: /// [1] Resource name. /// [2] Average number of used buffer entries. /// [3] Maximum number of used buffer entries. /// [4] Total number of buffer entries. /// /// [1] [2] [3] [4] /// JALU01 0 0 20 /// JFPU01 15 18 18 /// JLSAGU 0 0 12 // //===----------------------------------------------------------------------===// #ifndef LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H #define LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H #include "Views/View.h" #include "llvm/ADT/SmallVector.h" #include "llvm/MC/MCSubtargetInfo.h" #include <map> namespace llvm { namespace mca { class SchedulerStatistics final : public View { const llvm::MCSchedModel &SM; unsigned LQResourceID; unsigned SQResourceID; unsigned NumIssued; unsigned NumCycles; unsigned MostRecentLoadDispatched; unsigned MostRecentStoreDispatched; // Tracks the usage of a scheduler's queue. struct BufferUsage { unsigned SlotsInUse; unsigned MaxUsedSlots; uint64_t CumulativeNumUsedSlots; }; using Histogram = std::map<unsigned, unsigned>; Histogram IssueWidthPerCycle; std::vector<BufferUsage> Usage; void updateHistograms(); void printSchedulerStats(llvm::raw_ostream &OS) const; void printSchedulerUsage(llvm::raw_ostream &OS) const; public: SchedulerStatistics(const llvm::MCSubtargetInfo &STI); 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(const InstRef &IR, 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(const InstRef &IR, llvm::ArrayRef<unsigned> Buffers) override; void printView(llvm::raw_ostream &OS) const override; }; } // namespace mca } // namespace llvm #endif |