diff options
Diffstat (limited to 'llvm/tools/llvm-mca/SchedulerStatistics.cpp')
| -rw-r--r-- | llvm/tools/llvm-mca/SchedulerStatistics.cpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/llvm/tools/llvm-mca/SchedulerStatistics.cpp b/llvm/tools/llvm-mca/SchedulerStatistics.cpp new file mode 100644 index 00000000000..28a34def225 --- /dev/null +++ b/llvm/tools/llvm-mca/SchedulerStatistics.cpp @@ -0,0 +1,92 @@ +//===--------------------- SchedulerStatistics.cpp --------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// \file +/// +/// This file implements the SchedulerStatistics interface. +/// +//===----------------------------------------------------------------------===// + +#include "SchedulerStatistics.h" +#include "llvm/Support/Format.h" + +using namespace llvm; + +namespace mca { + +void SchedulerStatistics::onInstructionEvent(const HWInstructionEvent &Event) { + if (Event.Type == HWInstructionEvent::Issued) + ++NumIssued; +} + +void SchedulerStatistics::onReservedBuffers(ArrayRef<unsigned> Buffers) { + for (const unsigned Buffer : Buffers) { + if (BufferedResources.find(Buffer) != BufferedResources.end()) { + BufferUsage &BU = BufferedResources[Buffer]; + BU.SlotsInUse++; + BU.MaxUsedSlots = std::max(BU.MaxUsedSlots, BU.SlotsInUse); + continue; + } + + BufferedResources.insert( + std::pair<unsigned, BufferUsage>(Buffer, {1U, 1U})); + } +} + +void SchedulerStatistics::onReleasedBuffers(ArrayRef<unsigned> Buffers) { + for (const unsigned Buffer : Buffers) { + assert(BufferedResources.find(Buffer) != BufferedResources.end() && + "Buffered resource not in map?"); + BufferUsage &BU = BufferedResources[Buffer]; + BU.SlotsInUse--; + } +} + +void SchedulerStatistics::printSchedulerStatistics(llvm::raw_ostream &OS) const { + std::string Buffer; + raw_string_ostream TempStream(Buffer); + TempStream << "\n\nSchedulers - number of cycles where we saw N instructions " + "issued:\n"; + TempStream << "[# issued], [# cycles]\n"; + for (const std::pair<unsigned, unsigned> &Entry : IssuedPerCycle) { + TempStream << " " << Entry.first << ", " << Entry.second << " (" + << format("%.1f", ((double)Entry.second / NumCycles) * 100) + << "%)\n"; + } + + TempStream.flush(); + OS << Buffer; +} + +void SchedulerStatistics::printSchedulerUsage(raw_ostream &OS, + const MCSchedModel &SM) const { + std::string Buffer; + raw_string_ostream TempStream(Buffer); + TempStream << "\n\nScheduler's queue usage:\n"; + // Early exit if no buffered resources were consumed. + if (BufferedResources.empty()) { + TempStream << "No scheduler resources used.\n"; + TempStream.flush(); + OS << Buffer; + return; + } + + for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) { + const MCProcResourceDesc &ProcResource = *SM.getProcResource(I); + if (ProcResource.BufferSize <= 0) + continue; + + const BufferUsage &BU = BufferedResources.lookup(I); + TempStream << ProcResource.Name << ", " << BU.MaxUsedSlots << '/' + << ProcResource.BufferSize << '\n'; + } + + TempStream.flush(); + OS << Buffer; +} +} // namespace mca |

