110aa09f0SMatt Davis //===--------------------- DispatchStatistics.h -----------------*- C++ -*-===// 210aa09f0SMatt Davis // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 610aa09f0SMatt Davis // 710aa09f0SMatt Davis //===----------------------------------------------------------------------===// 810aa09f0SMatt Davis /// \file 910aa09f0SMatt Davis /// 1010aa09f0SMatt Davis /// This file implements a view that prints a few statistics related to the 1110aa09f0SMatt Davis /// dispatch logic. It collects and analyzes instruction dispatch events as 1210aa09f0SMatt Davis /// well as static/dynamic dispatch stall events. 1310aa09f0SMatt Davis /// 1410aa09f0SMatt Davis /// Example: 1510aa09f0SMatt Davis /// ======== 1610aa09f0SMatt Davis /// 1710aa09f0SMatt Davis /// Dynamic Dispatch Stall Cycles: 1810aa09f0SMatt Davis /// RAT - Register unavailable: 0 1910aa09f0SMatt Davis /// RCU - Retire tokens unavailable: 0 2010aa09f0SMatt Davis /// SCHEDQ - Scheduler full: 42 2110aa09f0SMatt Davis /// LQ - Load queue full: 0 2210aa09f0SMatt Davis /// SQ - Store queue full: 0 2310aa09f0SMatt Davis /// GROUP - Static restrictions on the dispatch group: 0 2410aa09f0SMatt Davis /// 2510aa09f0SMatt Davis /// 268b647dcfSAndrea Di Biagio /// Dispatch Logic - number of cycles where we saw N micro opcodes dispatched: 2710aa09f0SMatt Davis /// [# dispatched], [# cycles] 2810aa09f0SMatt Davis /// 0, 15 (11.5%) 2910aa09f0SMatt Davis /// 2, 4 (3.1%) 3010aa09f0SMatt Davis /// 3110aa09f0SMatt Davis //===----------------------------------------------------------------------===// 3210aa09f0SMatt Davis 3310aa09f0SMatt Davis #ifndef LLVM_TOOLS_LLVM_MCA_DISPATCHVIEW_H 3410aa09f0SMatt Davis #define LLVM_TOOLS_LLVM_MCA_DISPATCHVIEW_H 3510aa09f0SMatt Davis 3610aa09f0SMatt Davis #include "llvm/ADT/SmallVector.h" 3710aa09f0SMatt Davis #include "llvm/MC/MCSubtargetInfo.h" 38*fe01014fSPatrick Holland #include "llvm/MCA/View.h" 3910aa09f0SMatt Davis #include <map> 4010aa09f0SMatt Davis 415a8fd657SFangrui Song namespace llvm { 4210aa09f0SMatt Davis namespace mca { 4310aa09f0SMatt Davis 4410aa09f0SMatt Davis class DispatchStatistics : public View { 4510aa09f0SMatt Davis unsigned NumDispatched; 4610aa09f0SMatt Davis unsigned NumCycles; 4710aa09f0SMatt Davis 4810aa09f0SMatt Davis // Counts dispatch stall events caused by unavailability of resources. There 4910aa09f0SMatt Davis // is one counter for every generic stall kind (see class HWStallEvent). 5010aa09f0SMatt Davis llvm::SmallVector<unsigned, 8> HWStalls; 5110aa09f0SMatt Davis 5210aa09f0SMatt Davis using Histogram = std::map<unsigned, unsigned>; 5310aa09f0SMatt Davis Histogram DispatchGroupSizePerCycle; 5410aa09f0SMatt Davis updateHistograms()5510aa09f0SMatt Davis void updateHistograms() { 5610aa09f0SMatt Davis DispatchGroupSizePerCycle[NumDispatched]++; 5710aa09f0SMatt Davis NumDispatched = 0; 5810aa09f0SMatt Davis } 5910aa09f0SMatt Davis 6010aa09f0SMatt Davis void printDispatchHistogram(llvm::raw_ostream &OS) const; 6110aa09f0SMatt Davis 6210aa09f0SMatt Davis void printDispatchStalls(llvm::raw_ostream &OS) const; 6310aa09f0SMatt Davis 6410aa09f0SMatt Davis public: DispatchStatistics()6510aa09f0SMatt Davis DispatchStatistics() 6610aa09f0SMatt Davis : NumDispatched(0), NumCycles(0), 6710aa09f0SMatt Davis HWStalls(HWStallEvent::LastGenericEvent) {} 6810aa09f0SMatt Davis 6910aa09f0SMatt Davis void onEvent(const HWStallEvent &Event) override; 7010aa09f0SMatt Davis 7110aa09f0SMatt Davis void onEvent(const HWInstructionEvent &Event) override; 7210aa09f0SMatt Davis onCycleBegin()7310aa09f0SMatt Davis void onCycleBegin() override { NumCycles++; } 7410aa09f0SMatt Davis onCycleEnd()7510aa09f0SMatt Davis void onCycleEnd() override { updateHistograms(); } 7610aa09f0SMatt Davis printView(llvm::raw_ostream & OS)7710aa09f0SMatt Davis void printView(llvm::raw_ostream &OS) const override { 7810aa09f0SMatt Davis printDispatchStalls(OS); 7910aa09f0SMatt Davis printDispatchHistogram(OS); 8010aa09f0SMatt Davis } getNameAsString()81d38be2baSWolfgang Pieb StringRef getNameAsString() const override { return "DispatchStatistics"; } 82aa13e4feSMarcos Horro json::Value toJSON() const override; 8310aa09f0SMatt Davis }; 8410aa09f0SMatt Davis } // namespace mca 855a8fd657SFangrui Song } // namespace llvm 8610aa09f0SMatt Davis 8710aa09f0SMatt Davis #endif 88