114 lines · cpp
1//===--------------------- SummaryView.cpp ----------------------*- 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 functionalities used by the SummaryView to print11/// the report information.12///13//===----------------------------------------------------------------------===//14 15#include "Views/SummaryView.h"16#include "llvm/ADT/SmallVector.h"17#include "llvm/MCA/Support.h"18#include "llvm/Support/Format.h"19 20namespace llvm {21namespace mca {22 23#define DEBUG_TYPE "llvm-mca"24 25SummaryView::SummaryView(const MCSchedModel &Model, ArrayRef<MCInst> S,26 unsigned Width)27 : SM(Model), Source(S), DispatchWidth(Width ? Width : Model.IssueWidth),28 LastInstructionIdx(0), TotalCycles(0), NumMicroOps(0),29 ProcResourceUsage(Model.getNumProcResourceKinds(), 0),30 ProcResourceMasks(Model.getNumProcResourceKinds()),31 ResIdx2ProcResID(Model.getNumProcResourceKinds(), 0) {32 computeProcResourceMasks(SM, ProcResourceMasks);33 for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) {34 unsigned Index = getResourceStateIndex(ProcResourceMasks[I]);35 ResIdx2ProcResID[Index] = I;36 }37}38 39void SummaryView::onEvent(const HWInstructionEvent &Event) {40 if (Event.Type == HWInstructionEvent::Dispatched)41 LastInstructionIdx = Event.IR.getSourceIndex();42 43 // We are only interested in the "instruction retired" events generated by44 // the retire stage for instructions that are part of iteration #0.45 if (Event.Type != HWInstructionEvent::Retired ||46 Event.IR.getSourceIndex() >= Source.size())47 return;48 49 // Update the cumulative number of resource cycles based on the processor50 // resource usage information available from the instruction descriptor. We51 // need to compute the cumulative number of resource cycles for every52 // processor resource which is consumed by an instruction of the block.53 const Instruction &Inst = *Event.IR.getInstruction();54 const InstrDesc &Desc = Inst.getDesc();55 NumMicroOps += Desc.NumMicroOps;56 for (const std::pair<uint64_t, ResourceUsage> &RU : Desc.Resources) {57 if (RU.second.size()) {58 unsigned ProcResID = ResIdx2ProcResID[getResourceStateIndex(RU.first)];59 ProcResourceUsage[ProcResID] += RU.second.size();60 }61 }62}63 64void SummaryView::printView(raw_ostream &OS) const {65 std::string Buffer;66 raw_string_ostream TempStream(Buffer);67 DisplayValues DV;68 69 collectData(DV);70 TempStream << "Iterations: " << DV.Iterations;71 TempStream << "\nInstructions: " << DV.TotalInstructions;72 TempStream << "\nTotal Cycles: " << DV.TotalCycles;73 TempStream << "\nTotal uOps: " << DV.TotalUOps << '\n';74 TempStream << "\nDispatch Width: " << DV.DispatchWidth;75 TempStream << "\nuOps Per Cycle: "76 << format("%.2f", floor((DV.UOpsPerCycle * 100) + 0.5) / 100);77 TempStream << "\nIPC: "78 << format("%.2f", floor((DV.IPC * 100) + 0.5) / 100);79 TempStream << "\nBlock RThroughput: "80 << format("%.1f", floor((DV.BlockRThroughput * 10) + 0.5) / 10)81 << '\n';82 TempStream.flush();83 OS << Buffer;84}85 86void SummaryView::collectData(DisplayValues &DV) const {87 DV.Instructions = Source.size();88 DV.Iterations = (LastInstructionIdx / DV.Instructions) + 1;89 DV.TotalInstructions = DV.Instructions * DV.Iterations;90 DV.TotalCycles = TotalCycles;91 DV.DispatchWidth = DispatchWidth;92 DV.TotalUOps = NumMicroOps * DV.Iterations;93 DV.UOpsPerCycle = (double)DV.TotalUOps / TotalCycles;94 DV.IPC = (double)DV.TotalInstructions / TotalCycles;95 DV.BlockRThroughput = computeBlockRThroughput(SM, DispatchWidth, NumMicroOps,96 ProcResourceUsage);97}98 99json::Value SummaryView::toJSON() const {100 DisplayValues DV;101 collectData(DV);102 json::Object JO({{"Iterations", DV.Iterations},103 {"Instructions", DV.TotalInstructions},104 {"TotalCycles", DV.TotalCycles},105 {"TotaluOps", DV.TotalUOps},106 {"DispatchWidth", DV.DispatchWidth},107 {"uOpsPerCycle", DV.UOpsPerCycle},108 {"IPC", DV.IPC},109 {"BlockRThroughput", DV.BlockRThroughput}});110 return JO;111}112} // namespace mca.113} // namespace llvm114