diff options
Diffstat (limited to 'llvm/tools/llvm-mca/Views/DispatchStatistics.cpp')
| -rw-r--r-- | llvm/tools/llvm-mca/Views/DispatchStatistics.cpp | 85 | 
1 files changed, 85 insertions, 0 deletions
diff --git a/llvm/tools/llvm-mca/Views/DispatchStatistics.cpp b/llvm/tools/llvm-mca/Views/DispatchStatistics.cpp new file mode 100644 index 000000000000..557b8ba17b17 --- /dev/null +++ b/llvm/tools/llvm-mca/Views/DispatchStatistics.cpp @@ -0,0 +1,85 @@ +//===--------------------- DispatchStatistics.cpp ---------------------*- C++ +//-*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// \file +/// +/// This file implements the DispatchStatistics interface. +/// +//===----------------------------------------------------------------------===// + +#include "Views/DispatchStatistics.h" +#include "llvm/Support/Format.h" + +namespace llvm { +namespace mca { + +void DispatchStatistics::onEvent(const HWStallEvent &Event) { +  if (Event.Type < HWStallEvent::LastGenericEvent) +    HWStalls[Event.Type]++; +} + +void DispatchStatistics::onEvent(const HWInstructionEvent &Event) { +  if (Event.Type != HWInstructionEvent::Dispatched) +    return; + +  const auto &DE = static_cast<const HWInstructionDispatchedEvent &>(Event); +  NumDispatched += DE.MicroOpcodes; +} + +void DispatchStatistics::printDispatchHistogram(raw_ostream &OS) const { +  std::string Buffer; +  raw_string_ostream TempStream(Buffer); +  TempStream << "\n\nDispatch Logic - " +             << "number of cycles where we saw N micro opcodes dispatched:\n"; +  TempStream << "[# dispatched], [# cycles]\n"; +  for (const std::pair<unsigned, unsigned> &Entry : DispatchGroupSizePerCycle) { +    double Percentage = ((double)Entry.second / NumCycles) * 100.0; +    TempStream << " " << Entry.first << ",              " << Entry.second +               << "  (" << format("%.1f", floor((Percentage * 10) + 0.5) / 10) +               << "%)\n"; +  } + +  TempStream.flush(); +  OS << Buffer; +} + +static void printStalls(raw_ostream &OS, unsigned NumStalls, +                        unsigned NumCycles) { +  if (!NumStalls) { +    OS << NumStalls; +    return; +  } + +  double Percentage = ((double)NumStalls / NumCycles) * 100.0; +  OS << NumStalls << "  (" +     << format("%.1f", floor((Percentage * 10) + 0.5) / 10) << "%)"; +} + +void DispatchStatistics::printDispatchStalls(raw_ostream &OS) const { +  std::string Buffer; +  raw_string_ostream SS(Buffer); +  SS << "\n\nDynamic Dispatch Stall Cycles:\n"; +  SS << "RAT     - Register unavailable:                      "; +  printStalls(SS, HWStalls[HWStallEvent::RegisterFileStall], NumCycles); +  SS << "\nRCU     - Retire tokens unavailable:                 "; +  printStalls(SS, HWStalls[HWStallEvent::RetireControlUnitStall], NumCycles); +  SS << "\nSCHEDQ  - Scheduler full:                            "; +  printStalls(SS, HWStalls[HWStallEvent::SchedulerQueueFull], NumCycles); +  SS << "\nLQ      - Load queue full:                           "; +  printStalls(SS, HWStalls[HWStallEvent::LoadQueueFull], NumCycles); +  SS << "\nSQ      - Store queue full:                          "; +  printStalls(SS, HWStalls[HWStallEvent::StoreQueueFull], NumCycles); +  SS << "\nGROUP   - Static restrictions on the dispatch group: "; +  printStalls(SS, HWStalls[HWStallEvent::DispatchGroupStall], NumCycles); +  SS << '\n'; +  SS.flush(); +  OS << Buffer; +} + +} // namespace mca +} // namespace llvm  | 
