98 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8/// \file9///10/// This file defines class SchedulerStatistics. Class SchedulerStatistics is a11/// View that listens to instruction issue events in order to print general12/// 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 2031/// JFPU01 15 18 1832/// JLSAGU 0 0 1233//34//===----------------------------------------------------------------------===//35 36#ifndef LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H37#define LLVM_TOOLS_LLVM_MCA_SCHEDULERSTATISTICS_H38 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 buffered81 // 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 every86 // 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 mca95} // namespace llvm96 97#endif98