1 //===--------------------- SummaryView.h ---------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// \file 10 /// 11 /// This file implements the summary view. 12 /// 13 /// The goal of the summary view is to give a very quick overview of the 14 /// performance throughput. Below is an example of summary view: 15 /// 16 /// 17 /// Iterations: 300 18 /// Instructions: 900 19 /// Total Cycles: 610 20 /// Dispatch Width: 2 21 /// IPC: 1.48 22 /// Block RThroughput: 2.0 23 /// 24 /// The summary view collects a few performance numbers. The two main 25 /// performance indicators are 'Total Cycles' and IPC (Instructions Per Cycle). 26 /// 27 //===----------------------------------------------------------------------===// 28 29 #ifndef LLVM_TOOLS_LLVM_MCA_SUMMARYVIEW_H 30 #define LLVM_TOOLS_LLVM_MCA_SUMMARYVIEW_H 31 32 #include "SourceMgr.h" 33 #include "View.h" 34 #include "llvm/ADT/DenseMap.h" 35 #include "llvm/MC/MCSchedule.h" 36 #include "llvm/Support/raw_ostream.h" 37 38 namespace mca { 39 40 /// A view that collects and prints a few performance numbers. 41 class SummaryView : public View { 42 const llvm::MCSchedModel &SM; 43 const SourceMgr &Source; 44 const unsigned DispatchWidth; 45 unsigned TotalCycles; 46 // The total number of micro opcodes contributed by a block of instructions. 47 unsigned NumMicroOps; 48 // For each processor resource, this vector stores the cumulative number of 49 // resource cycles consumed by the analyzed code block. 50 llvm::SmallVector<unsigned, 8> ProcResourceUsage; 51 52 // Each processor resource is associated with a so-called processor resource 53 // mask. This vector allows to correlate processor resource IDs with processor 54 // resource masks. There is exactly one element per each processor resource 55 // declared by the scheduling model. 56 llvm::SmallVector<uint64_t, 8> ProcResourceMasks; 57 58 // Compute the reciprocal throughput for the analyzed code block. 59 // The reciprocal block throughput is computed as the MAX between: 60 // - NumMicroOps / DispatchWidth 61 // - Total Resource Cycles / #Units (for every resource consumed). 62 double getBlockRThroughput() const; 63 64 public: 65 SummaryView(const llvm::MCSchedModel &Model, const SourceMgr &S, 66 unsigned Width); 67 onCycleEnd()68 void onCycleEnd() override { ++TotalCycles; } 69 70 void onEvent(const HWInstructionEvent &Event) override; 71 72 void printView(llvm::raw_ostream &OS) const override; 73 }; 74 } // namespace mca 75 76 #endif 77