Path: blob/main/contrib/llvm-project/llvm/tools/llvm-mca/Views/RetireControlUnitStatistics.cpp
35290 views
//===--------------------- RetireControlUnitStatistics.cpp ------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7/// \file8///9/// This file implements the RetireControlUnitStatistics interface.10///11//===----------------------------------------------------------------------===//1213#include "Views/RetireControlUnitStatistics.h"14#include "llvm/Support/Format.h"1516namespace llvm {17namespace mca {1819RetireControlUnitStatistics::RetireControlUnitStatistics(const MCSchedModel &SM)20: NumRetired(0), NumCycles(0), EntriesInUse(0), MaxUsedEntries(0),21SumOfUsedEntries(0) {22TotalROBEntries = SM.MicroOpBufferSize;23if (SM.hasExtraProcessorInfo()) {24const MCExtraProcessorInfo &EPI = SM.getExtraProcessorInfo();25if (EPI.ReorderBufferSize)26TotalROBEntries = EPI.ReorderBufferSize;27}28}2930void RetireControlUnitStatistics::onEvent(const HWInstructionEvent &Event) {31if (Event.Type == HWInstructionEvent::Dispatched) {32unsigned NumEntries =33static_cast<const HWInstructionDispatchedEvent &>(Event).MicroOpcodes;34EntriesInUse += NumEntries;35}3637if (Event.Type == HWInstructionEvent::Retired) {38unsigned ReleasedEntries = Event.IR.getInstruction()->getDesc().NumMicroOps;39assert(EntriesInUse >= ReleasedEntries && "Invalid internal state!");40EntriesInUse -= ReleasedEntries;41++NumRetired;42}43}4445void RetireControlUnitStatistics::onCycleEnd() {46// Update histogram47RetiredPerCycle[NumRetired]++;48NumRetired = 0;49++NumCycles;50MaxUsedEntries = std::max(MaxUsedEntries, EntriesInUse);51SumOfUsedEntries += EntriesInUse;52}5354void RetireControlUnitStatistics::printView(raw_ostream &OS) const {55std::string Buffer;56raw_string_ostream TempStream(Buffer);57TempStream << "\n\nRetire Control Unit - "58<< "number of cycles where we saw N instructions retired:\n";59TempStream << "[# retired], [# cycles]\n";6061for (const std::pair<const unsigned, unsigned> &Entry : RetiredPerCycle) {62TempStream << " " << Entry.first;63if (Entry.first < 10)64TempStream << ", ";65else66TempStream << ", ";67TempStream << Entry.second << " ("68<< format("%.1f", ((double)Entry.second / NumCycles) * 100.0)69<< "%)\n";70}7172unsigned AvgUsage = (double)SumOfUsedEntries / NumCycles;73double MaxUsagePercentage =74((double)MaxUsedEntries / TotalROBEntries) * 100.0;75double NormalizedMaxPercentage = floor((MaxUsagePercentage * 10) + 0.5) / 10;76double AvgUsagePercentage = ((double)AvgUsage / TotalROBEntries) * 100.0;77double NormalizedAvgPercentage = floor((AvgUsagePercentage * 10) + 0.5) / 10;7879TempStream << "\nTotal ROB Entries: " << TotalROBEntries80<< "\nMax Used ROB Entries: " << MaxUsedEntries81<< format(" ( %.1f%% )", NormalizedMaxPercentage)82<< "\nAverage Used ROB Entries per cy: " << AvgUsage83<< format(" ( %.1f%% )\n", NormalizedAvgPercentage);8485TempStream.flush();86OS << Buffer;87}8889} // namespace mca90} // namespace llvm919293