2018-03-08 21:05:02 +08:00
|
|
|
//===--------------------- BackendStatistics.h ------------------*- 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 a printer class for printing generic Backend
|
|
|
|
/// statistics related to the dispatch logic, scheduler and retire unit.
|
|
|
|
///
|
|
|
|
/// Example:
|
|
|
|
/// ========
|
|
|
|
///
|
2018-03-09 00:08:43 +08:00
|
|
|
/// Dynamic Dispatch Stall Cycles:
|
|
|
|
/// RAT - Register unavailable: 0
|
|
|
|
/// RCU - Retire tokens unavailable: 0
|
|
|
|
/// SCHEDQ - Scheduler full: 42
|
|
|
|
/// LQ - Load queue full: 0
|
|
|
|
/// SQ - Store queue full: 0
|
|
|
|
/// GROUP - Static restrictions on the dispatch group: 0
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// Register Alias Table:
|
|
|
|
/// Total number of mappings created: 210
|
|
|
|
/// Max number of mappings used: 35
|
|
|
|
///
|
|
|
|
///
|
2018-03-08 21:05:02 +08:00
|
|
|
/// Dispatch Logic - number of cycles where we saw N instructions dispatched:
|
|
|
|
/// [# dispatched], [# cycles]
|
|
|
|
/// 0, 15 (11.5%)
|
|
|
|
/// 5, 4 (3.1%)
|
|
|
|
///
|
|
|
|
/// Schedulers - number of cycles where we saw N instructions issued:
|
|
|
|
/// [# issued], [# cycles]
|
|
|
|
/// 0, 7 (5.4%)
|
|
|
|
/// 1, 4 (3.1%)
|
|
|
|
/// 2, 8 (6.2%)
|
|
|
|
///
|
|
|
|
/// Retire Control Unit - number of cycles where we saw N instructions retired:
|
|
|
|
/// [# retired], [# cycles]
|
|
|
|
/// 0, 9 (6.9%)
|
|
|
|
/// 1, 6 (4.6%)
|
|
|
|
/// 2, 1 (0.8%)
|
|
|
|
/// 4, 3 (2.3%)
|
|
|
|
///
|
2018-03-09 00:08:43 +08:00
|
|
|
///
|
|
|
|
/// Scheduler's queue usage:
|
|
|
|
/// JALU01, 0/20
|
|
|
|
/// JFPU01, 18/18
|
|
|
|
/// JLSAGU, 0/12
|
|
|
|
///
|
2018-03-08 21:05:02 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_TOOLS_LLVM_MCA_BACKENDSTATISTICS_H
|
|
|
|
#define LLVM_TOOLS_LLVM_MCA_BACKENDSTATISTICS_H
|
|
|
|
|
2018-03-09 00:08:43 +08:00
|
|
|
#include "Backend.h"
|
|
|
|
#include "View.h"
|
2018-03-17 06:21:52 +08:00
|
|
|
#include "llvm/MC/MCSubtargetInfo.h"
|
2018-03-08 21:05:02 +08:00
|
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
#include <map>
|
|
|
|
|
|
|
|
namespace mca {
|
|
|
|
|
2018-03-09 00:08:43 +08:00
|
|
|
class BackendStatistics : public View {
|
|
|
|
// TODO: remove the dependency from Backend.
|
|
|
|
const Backend &B;
|
2018-03-17 06:21:52 +08:00
|
|
|
const llvm::MCSubtargetInfo &STI;
|
2018-03-09 00:08:43 +08:00
|
|
|
|
2018-03-08 21:05:02 +08:00
|
|
|
using Histogram = std::map<unsigned, unsigned>;
|
|
|
|
Histogram DispatchGroupSizePerCycle;
|
|
|
|
Histogram RetiredPerCycle;
|
|
|
|
Histogram IssuedPerCycle;
|
|
|
|
|
|
|
|
unsigned NumDispatched;
|
|
|
|
unsigned NumIssued;
|
|
|
|
unsigned NumRetired;
|
|
|
|
unsigned NumCycles;
|
|
|
|
|
|
|
|
void updateHistograms() {
|
|
|
|
DispatchGroupSizePerCycle[NumDispatched]++;
|
|
|
|
IssuedPerCycle[NumIssued]++;
|
|
|
|
RetiredPerCycle[NumRetired]++;
|
|
|
|
NumDispatched = 0;
|
|
|
|
NumIssued = 0;
|
|
|
|
NumRetired = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void printRetireUnitStatistics(llvm::raw_ostream &OS) const;
|
|
|
|
void printDispatchUnitStatistics(llvm::raw_ostream &OS) const;
|
|
|
|
void printSchedulerStatistics(llvm::raw_ostream &OS) const;
|
|
|
|
|
2018-03-09 00:08:43 +08:00
|
|
|
void printDispatchStalls(llvm::raw_ostream &OS, unsigned RATStalls,
|
|
|
|
unsigned RCUStalls, unsigned SQStalls,
|
|
|
|
unsigned LDQStalls, unsigned STQStalls,
|
|
|
|
unsigned DGStalls) const;
|
|
|
|
void printRATStatistics(llvm::raw_ostream &OS, unsigned Mappings,
|
|
|
|
unsigned MaxUsedMappings) const;
|
|
|
|
void printRCUStatistics(llvm::raw_ostream &OS, const Histogram &Histogram,
|
|
|
|
unsigned Cycles) const;
|
|
|
|
void printDispatchUnitUsage(llvm::raw_ostream &OS, const Histogram &Stats,
|
|
|
|
unsigned Cycles) const;
|
|
|
|
void printIssuePerCycle(const Histogram &IssuePerCycle,
|
|
|
|
unsigned TotalCycles) const;
|
|
|
|
void printSchedulerUsage(llvm::raw_ostream &OS, const llvm::MCSchedModel &SM,
|
|
|
|
const llvm::ArrayRef<BufferUsageEntry> &Usage) const;
|
|
|
|
|
2018-03-08 21:05:02 +08:00
|
|
|
public:
|
2018-03-17 06:21:52 +08:00
|
|
|
BackendStatistics(const Backend &backend, const llvm::MCSubtargetInfo &sti)
|
|
|
|
: B(backend), STI(sti), NumDispatched(0), NumIssued(0), NumRetired(0),
|
|
|
|
NumCycles(0) {}
|
2018-03-08 21:05:02 +08:00
|
|
|
|
2018-03-13 21:11:01 +08:00
|
|
|
void onInstructionEvent(const HWInstructionEvent &Event) override;
|
2018-03-08 21:05:02 +08:00
|
|
|
|
|
|
|
void onCycleBegin(unsigned Cycle) override { NumCycles++; }
|
|
|
|
|
|
|
|
void onCycleEnd(unsigned Cycle) override { updateHistograms(); }
|
|
|
|
|
2018-03-09 00:08:43 +08:00
|
|
|
void printView(llvm::raw_ostream &OS) const override {
|
2018-03-09 20:50:42 +08:00
|
|
|
printDispatchStalls(OS, B.getNumRATStalls(), B.getNumRCUStalls(),
|
|
|
|
B.getNumSQStalls(), B.getNumLDQStalls(),
|
|
|
|
B.getNumSTQStalls(), B.getNumDispatchGroupStalls());
|
2018-03-09 00:08:43 +08:00
|
|
|
printRATStatistics(OS, B.getTotalRegisterMappingsCreated(),
|
2018-03-09 20:50:42 +08:00
|
|
|
B.getMaxUsedRegisterMappings());
|
2018-03-08 21:05:02 +08:00
|
|
|
printDispatchUnitStatistics(OS);
|
|
|
|
printSchedulerStatistics(OS);
|
|
|
|
printRetireUnitStatistics(OS);
|
2018-03-09 00:08:43 +08:00
|
|
|
|
|
|
|
std::vector<BufferUsageEntry> Usage;
|
|
|
|
B.getBuffersUsage(Usage);
|
2018-03-17 06:21:52 +08:00
|
|
|
printSchedulerUsage(OS, STI.getSchedModel(), Usage);
|
2018-03-08 21:05:02 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace mca
|
|
|
|
|
|
|
|
#endif
|