90 lines · c
1//===--------------------- SummaryView.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 implements the summary view.11///12/// The goal of the summary view is to give a very quick overview of the13/// performance throughput. Below is an example of summary view:14///15///16/// Iterations: 30017/// Instructions: 90018/// Total Cycles: 61019/// Dispatch Width: 220/// IPC: 1.4821/// Block RThroughput: 2.022///23/// The summary view collects a few performance numbers. The two main24/// performance indicators are 'Total Cycles' and IPC (Instructions Per Cycle).25///26//===----------------------------------------------------------------------===//27 28#ifndef LLVM_TOOLS_LLVM_MCA_SUMMARYVIEW_H29#define LLVM_TOOLS_LLVM_MCA_SUMMARYVIEW_H30 31#include "llvm/MC/MCSchedule.h"32#include "llvm/MCA/View.h"33#include "llvm/Support/raw_ostream.h"34 35namespace llvm {36namespace mca {37 38/// A view that collects and prints a few performance numbers.39class SummaryView : public View {40 const llvm::MCSchedModel &SM;41 llvm::ArrayRef<llvm::MCInst> Source;42 const unsigned DispatchWidth;43 unsigned LastInstructionIdx;44 unsigned TotalCycles;45 // The total number of micro opcodes contributed by a block of instructions.46 unsigned NumMicroOps;47 48 struct DisplayValues {49 unsigned Instructions;50 unsigned Iterations;51 unsigned TotalInstructions;52 unsigned TotalCycles;53 unsigned DispatchWidth;54 unsigned TotalUOps;55 double IPC;56 double UOpsPerCycle;57 double BlockRThroughput;58 };59 60 // For each processor resource, this vector stores the cumulative number of61 // resource cycles consumed by the analyzed code block.62 llvm::SmallVector<unsigned, 8> ProcResourceUsage;63 64 // Each processor resource is associated with a so-called processor resource65 // mask. This vector allows to correlate processor resource IDs with processor66 // resource masks. There is exactly one element per each processor resource67 // declared by the scheduling model.68 llvm::SmallVector<uint64_t, 8> ProcResourceMasks;69 70 // Used to map resource indices to actual processor resource IDs.71 llvm::SmallVector<unsigned, 8> ResIdx2ProcResID;72 73 /// Compute the data we want to print out in the object DV.74 void collectData(DisplayValues &DV) const;75 76public:77 SummaryView(const llvm::MCSchedModel &Model, llvm::ArrayRef<llvm::MCInst> S,78 unsigned Width);79 80 void onCycleEnd() override { ++TotalCycles; }81 void onEvent(const HWInstructionEvent &Event) override;82 void printView(llvm::raw_ostream &OS) const override;83 StringRef getNameAsString() const override { return "SummaryView"; }84 json::Value toJSON() const override;85};86} // namespace mca87} // namespace llvm88 89#endif90