111308Santhony.gutierrez@amd.com/* 211308Santhony.gutierrez@amd.com * Copyright (c) 2013-2015 Advanced Micro Devices, Inc. 311308Santhony.gutierrez@amd.com * All rights reserved. 411308Santhony.gutierrez@amd.com * 511308Santhony.gutierrez@amd.com * For use for simulation and test purposes only 611308Santhony.gutierrez@amd.com * 711308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 811308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are met: 911308Santhony.gutierrez@amd.com * 1011308Santhony.gutierrez@amd.com * 1. Redistributions of source code must retain the above copyright notice, 1111308Santhony.gutierrez@amd.com * this list of conditions and the following disclaimer. 1211308Santhony.gutierrez@amd.com * 1311308Santhony.gutierrez@amd.com * 2. Redistributions in binary form must reproduce the above copyright notice, 1411308Santhony.gutierrez@amd.com * this list of conditions and the following disclaimer in the documentation 1511308Santhony.gutierrez@amd.com * and/or other materials provided with the distribution. 1611308Santhony.gutierrez@amd.com * 1712697Santhony.gutierrez@amd.com * 3. Neither the name of the copyright holder nor the names of its 1812697Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from this 1912697Santhony.gutierrez@amd.com * software without specific prior written permission. 2011308Santhony.gutierrez@amd.com * 2111308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2211308Santhony.gutierrez@amd.com * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2311308Santhony.gutierrez@amd.com * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2411308Santhony.gutierrez@amd.com * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 2511308Santhony.gutierrez@amd.com * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2611308Santhony.gutierrez@amd.com * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2711308Santhony.gutierrez@amd.com * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2811308Santhony.gutierrez@amd.com * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2911308Santhony.gutierrez@amd.com * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3011308Santhony.gutierrez@amd.com * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3111308Santhony.gutierrez@amd.com * POSSIBILITY OF SUCH DAMAGE. 3211308Santhony.gutierrez@amd.com * 3312697Santhony.gutierrez@amd.com * Authors: Sooraj Puthoor 3411308Santhony.gutierrez@amd.com */ 3511308Santhony.gutierrez@amd.com 3611308Santhony.gutierrez@amd.com#ifndef __MEM_RUBY_SYSTEM_GPU_COALESCER_HH__ 3711308Santhony.gutierrez@amd.com#define __MEM_RUBY_SYSTEM_GPU_COALESCER_HH__ 3811308Santhony.gutierrez@amd.com 3911308Santhony.gutierrez@amd.com#include <iostream> 4011308Santhony.gutierrez@amd.com#include <unordered_map> 4111308Santhony.gutierrez@amd.com 4211308Santhony.gutierrez@amd.com#include "base/statistics.hh" 4311308Santhony.gutierrez@amd.com#include "mem/request.hh" 4411308Santhony.gutierrez@amd.com#include "mem/ruby/common/Address.hh" 4511308Santhony.gutierrez@amd.com#include "mem/ruby/common/Consumer.hh" 4614184Sgabeblack@google.com#include "mem/ruby/protocol/HSAScope.hh" 4714184Sgabeblack@google.com#include "mem/ruby/protocol/HSASegment.hh" 4814184Sgabeblack@google.com#include "mem/ruby/protocol/PrefetchBit.hh" 4914184Sgabeblack@google.com#include "mem/ruby/protocol/RubyAccessMode.hh" 5014184Sgabeblack@google.com#include "mem/ruby/protocol/RubyRequestType.hh" 5114184Sgabeblack@google.com#include "mem/ruby/protocol/SequencerRequestType.hh" 5211900Sandreas.sandberg@arm.com#include "mem/ruby/system/Sequencer.hh" 5311308Santhony.gutierrez@amd.com 5411308Santhony.gutierrez@amd.comclass DataBlock; 5511308Santhony.gutierrez@amd.comclass CacheMsg; 5611308Santhony.gutierrez@amd.comclass MachineID; 5711308Santhony.gutierrez@amd.comclass CacheMemory; 5811308Santhony.gutierrez@amd.com 5911308Santhony.gutierrez@amd.comclass RubyGPUCoalescerParams; 6011308Santhony.gutierrez@amd.com 6112749Sgiacomo.travaglini@arm.comHSAScope reqScopeToHSAScope(const RequestPtr &req); 6212749Sgiacomo.travaglini@arm.comHSASegment reqSegmentToHSASegment(const RequestPtr &req); 6311308Santhony.gutierrez@amd.com 6411308Santhony.gutierrez@amd.comstruct GPUCoalescerRequest 6511308Santhony.gutierrez@amd.com{ 6611308Santhony.gutierrez@amd.com PacketPtr pkt; 6711308Santhony.gutierrez@amd.com RubyRequestType m_type; 6811308Santhony.gutierrez@amd.com Cycles issue_time; 6911308Santhony.gutierrez@amd.com 7011308Santhony.gutierrez@amd.com GPUCoalescerRequest(PacketPtr _pkt, RubyRequestType _m_type, 7111308Santhony.gutierrez@amd.com Cycles _issue_time) 7211308Santhony.gutierrez@amd.com : pkt(_pkt), m_type(_m_type), issue_time(_issue_time) 7311308Santhony.gutierrez@amd.com {} 7411308Santhony.gutierrez@amd.com}; 7511308Santhony.gutierrez@amd.com 7611689Santhony.gutierrez@amd.comclass RequestDesc 7711689Santhony.gutierrez@amd.com{ 7811689Santhony.gutierrez@amd.com public: 7911689Santhony.gutierrez@amd.com RequestDesc(PacketPtr pkt, RubyRequestType p_type, RubyRequestType s_type) 8011689Santhony.gutierrez@amd.com : pkt(pkt), primaryType(p_type), secondaryType(s_type) 8111689Santhony.gutierrez@amd.com { 8211689Santhony.gutierrez@amd.com } 8311689Santhony.gutierrez@amd.com 8411689Santhony.gutierrez@amd.com RequestDesc() : pkt(nullptr), primaryType(RubyRequestType_NULL), 8511689Santhony.gutierrez@amd.com secondaryType(RubyRequestType_NULL) 8611689Santhony.gutierrez@amd.com { 8711689Santhony.gutierrez@amd.com } 8811689Santhony.gutierrez@amd.com 8911689Santhony.gutierrez@amd.com PacketPtr pkt; 9011689Santhony.gutierrez@amd.com RubyRequestType primaryType; 9111689Santhony.gutierrez@amd.com RubyRequestType secondaryType; 9211689Santhony.gutierrez@amd.com}; 9311689Santhony.gutierrez@amd.com 9411308Santhony.gutierrez@amd.comstd::ostream& operator<<(std::ostream& out, const GPUCoalescerRequest& obj); 9511308Santhony.gutierrez@amd.com 9611308Santhony.gutierrez@amd.comclass GPUCoalescer : public RubyPort 9711308Santhony.gutierrez@amd.com{ 9811308Santhony.gutierrez@amd.com public: 9911308Santhony.gutierrez@amd.com typedef RubyGPUCoalescerParams Params; 10011308Santhony.gutierrez@amd.com GPUCoalescer(const Params *); 10111308Santhony.gutierrez@amd.com ~GPUCoalescer(); 10211308Santhony.gutierrez@amd.com 10311308Santhony.gutierrez@amd.com // Public Methods 10411308Santhony.gutierrez@amd.com void wakeup(); // Used only for deadlock detection 10511308Santhony.gutierrez@amd.com 10611308Santhony.gutierrez@amd.com void printProgress(std::ostream& out) const; 10711308Santhony.gutierrez@amd.com void resetStats(); 10811308Santhony.gutierrez@amd.com void collateStats(); 10911308Santhony.gutierrez@amd.com void regStats(); 11011308Santhony.gutierrez@amd.com 11111308Santhony.gutierrez@amd.com void writeCallback(Addr address, DataBlock& data); 11211308Santhony.gutierrez@amd.com 11311308Santhony.gutierrez@amd.com void writeCallback(Addr address, 11411308Santhony.gutierrez@amd.com MachineType mach, 11511308Santhony.gutierrez@amd.com DataBlock& data); 11611308Santhony.gutierrez@amd.com 11711308Santhony.gutierrez@amd.com void writeCallback(Addr address, 11811308Santhony.gutierrez@amd.com MachineType mach, 11911308Santhony.gutierrez@amd.com DataBlock& data, 12011308Santhony.gutierrez@amd.com Cycles initialRequestTime, 12111308Santhony.gutierrez@amd.com Cycles forwardRequestTime, 12211308Santhony.gutierrez@amd.com Cycles firstResponseTime, 12311308Santhony.gutierrez@amd.com bool isRegion); 12411308Santhony.gutierrez@amd.com 12511308Santhony.gutierrez@amd.com void writeCallback(Addr address, 12611308Santhony.gutierrez@amd.com MachineType mach, 12711308Santhony.gutierrez@amd.com DataBlock& data, 12811308Santhony.gutierrez@amd.com Cycles initialRequestTime, 12911308Santhony.gutierrez@amd.com Cycles forwardRequestTime, 13011308Santhony.gutierrez@amd.com Cycles firstResponseTime); 13111308Santhony.gutierrez@amd.com 13211308Santhony.gutierrez@amd.com void readCallback(Addr address, DataBlock& data); 13311308Santhony.gutierrez@amd.com 13411308Santhony.gutierrez@amd.com void readCallback(Addr address, 13511308Santhony.gutierrez@amd.com MachineType mach, 13611308Santhony.gutierrez@amd.com DataBlock& data); 13711308Santhony.gutierrez@amd.com 13811308Santhony.gutierrez@amd.com void readCallback(Addr address, 13911308Santhony.gutierrez@amd.com MachineType mach, 14011308Santhony.gutierrez@amd.com DataBlock& data, 14111308Santhony.gutierrez@amd.com Cycles initialRequestTime, 14211308Santhony.gutierrez@amd.com Cycles forwardRequestTime, 14311308Santhony.gutierrez@amd.com Cycles firstResponseTime); 14411308Santhony.gutierrez@amd.com 14511308Santhony.gutierrez@amd.com void readCallback(Addr address, 14611308Santhony.gutierrez@amd.com MachineType mach, 14711308Santhony.gutierrez@amd.com DataBlock& data, 14811308Santhony.gutierrez@amd.com Cycles initialRequestTime, 14911308Santhony.gutierrez@amd.com Cycles forwardRequestTime, 15011308Santhony.gutierrez@amd.com Cycles firstResponseTime, 15111308Santhony.gutierrez@amd.com bool isRegion); 15211308Santhony.gutierrez@amd.com /* atomics need their own callback because the data 15311308Santhony.gutierrez@amd.com might be const coming from SLICC */ 15411308Santhony.gutierrez@amd.com void atomicCallback(Addr address, 15511308Santhony.gutierrez@amd.com MachineType mach, 15611308Santhony.gutierrez@amd.com const DataBlock& data); 15711308Santhony.gutierrez@amd.com 15811308Santhony.gutierrez@amd.com void recordCPReadCallBack(MachineID myMachID, MachineID senderMachID); 15911308Santhony.gutierrez@amd.com void recordCPWriteCallBack(MachineID myMachID, MachineID senderMachID); 16011308Santhony.gutierrez@amd.com 16111308Santhony.gutierrez@amd.com // Alternate implementations in VIPER Coalescer 16211308Santhony.gutierrez@amd.com virtual RequestStatus makeRequest(PacketPtr pkt); 16311308Santhony.gutierrez@amd.com 16411308Santhony.gutierrez@amd.com int outstandingCount() const { return m_outstanding_count; } 16511308Santhony.gutierrez@amd.com 16611308Santhony.gutierrez@amd.com bool 16711308Santhony.gutierrez@amd.com isDeadlockEventScheduled() const 16811308Santhony.gutierrez@amd.com { 16911308Santhony.gutierrez@amd.com return deadlockCheckEvent.scheduled(); 17011308Santhony.gutierrez@amd.com } 17111308Santhony.gutierrez@amd.com 17211308Santhony.gutierrez@amd.com void 17311308Santhony.gutierrez@amd.com descheduleDeadlockEvent() 17411308Santhony.gutierrez@amd.com { 17511308Santhony.gutierrez@amd.com deschedule(deadlockCheckEvent); 17611308Santhony.gutierrez@amd.com } 17711308Santhony.gutierrez@amd.com 17811308Santhony.gutierrez@amd.com bool empty() const; 17911308Santhony.gutierrez@amd.com 18011308Santhony.gutierrez@amd.com void print(std::ostream& out) const; 18111308Santhony.gutierrez@amd.com void checkCoherence(Addr address); 18211308Santhony.gutierrez@amd.com 18311308Santhony.gutierrez@amd.com void markRemoved(); 18411308Santhony.gutierrez@amd.com void removeRequest(GPUCoalescerRequest* request); 18511308Santhony.gutierrez@amd.com void evictionCallback(Addr address); 18611308Santhony.gutierrez@amd.com void completeIssue(); 18711308Santhony.gutierrez@amd.com 18811308Santhony.gutierrez@amd.com void insertKernel(int wavefront_id, PacketPtr pkt); 18911308Santhony.gutierrez@amd.com 19011308Santhony.gutierrez@amd.com void recordRequestType(SequencerRequestType requestType); 19111308Santhony.gutierrez@amd.com Stats::Histogram& getOutstandReqHist() { return m_outstandReqHist; } 19211308Santhony.gutierrez@amd.com 19311308Santhony.gutierrez@amd.com Stats::Histogram& getLatencyHist() { return m_latencyHist; } 19411308Santhony.gutierrez@amd.com Stats::Histogram& getTypeLatencyHist(uint32_t t) 19511308Santhony.gutierrez@amd.com { return *m_typeLatencyHist[t]; } 19611308Santhony.gutierrez@amd.com 19711308Santhony.gutierrez@amd.com Stats::Histogram& getMissLatencyHist() 19811308Santhony.gutierrez@amd.com { return m_missLatencyHist; } 19911308Santhony.gutierrez@amd.com Stats::Histogram& getMissTypeLatencyHist(uint32_t t) 20011308Santhony.gutierrez@amd.com { return *m_missTypeLatencyHist[t]; } 20111308Santhony.gutierrez@amd.com 20211308Santhony.gutierrez@amd.com Stats::Histogram& getMissMachLatencyHist(uint32_t t) const 20311308Santhony.gutierrez@amd.com { return *m_missMachLatencyHist[t]; } 20411308Santhony.gutierrez@amd.com 20511308Santhony.gutierrez@amd.com Stats::Histogram& 20611308Santhony.gutierrez@amd.com getMissTypeMachLatencyHist(uint32_t r, uint32_t t) const 20711308Santhony.gutierrez@amd.com { return *m_missTypeMachLatencyHist[r][t]; } 20811308Santhony.gutierrez@amd.com 20911308Santhony.gutierrez@amd.com Stats::Histogram& getIssueToInitialDelayHist(uint32_t t) const 21011308Santhony.gutierrez@amd.com { return *m_IssueToInitialDelayHist[t]; } 21111308Santhony.gutierrez@amd.com 21211308Santhony.gutierrez@amd.com Stats::Histogram& 21311308Santhony.gutierrez@amd.com getInitialToForwardDelayHist(const MachineType t) const 21411308Santhony.gutierrez@amd.com { return *m_InitialToForwardDelayHist[t]; } 21511308Santhony.gutierrez@amd.com 21611308Santhony.gutierrez@amd.com Stats::Histogram& 21711308Santhony.gutierrez@amd.com getForwardRequestToFirstResponseHist(const MachineType t) const 21811308Santhony.gutierrez@amd.com { return *m_ForwardToFirstResponseDelayHist[t]; } 21911308Santhony.gutierrez@amd.com 22011308Santhony.gutierrez@amd.com Stats::Histogram& 22111308Santhony.gutierrez@amd.com getFirstResponseToCompletionDelayHist(const MachineType t) const 22211308Santhony.gutierrez@amd.com { return *m_FirstResponseToCompletionDelayHist[t]; } 22311308Santhony.gutierrez@amd.com 22411308Santhony.gutierrez@amd.com // Changed to protected to enable inheritance by VIPER Coalescer 22511308Santhony.gutierrez@amd.com protected: 22611308Santhony.gutierrez@amd.com bool tryCacheAccess(Addr addr, RubyRequestType type, 22711308Santhony.gutierrez@amd.com Addr pc, RubyAccessMode access_mode, 22811308Santhony.gutierrez@amd.com int size, DataBlock*& data_ptr); 22911308Santhony.gutierrez@amd.com // Alternate implementations in VIPER Coalescer 23011308Santhony.gutierrez@amd.com virtual void issueRequest(PacketPtr pkt, RubyRequestType type); 23111308Santhony.gutierrez@amd.com 23211308Santhony.gutierrez@amd.com void kernelCallback(int wavfront_id); 23311308Santhony.gutierrez@amd.com 23411308Santhony.gutierrez@amd.com void hitCallback(GPUCoalescerRequest* request, 23511308Santhony.gutierrez@amd.com MachineType mach, 23611308Santhony.gutierrez@amd.com DataBlock& data, 23711308Santhony.gutierrez@amd.com bool success, 23811308Santhony.gutierrez@amd.com Cycles initialRequestTime, 23911308Santhony.gutierrez@amd.com Cycles forwardRequestTime, 24011308Santhony.gutierrez@amd.com Cycles firstResponseTime, 24111308Santhony.gutierrez@amd.com bool isRegion); 24211308Santhony.gutierrez@amd.com void recordMissLatency(GPUCoalescerRequest* request, 24311308Santhony.gutierrez@amd.com MachineType mach, 24411308Santhony.gutierrez@amd.com Cycles initialRequestTime, 24511308Santhony.gutierrez@amd.com Cycles forwardRequestTime, 24611308Santhony.gutierrez@amd.com Cycles firstResponseTime, 24711308Santhony.gutierrez@amd.com bool success, bool isRegion); 24811308Santhony.gutierrez@amd.com void completeHitCallback(std::vector<PacketPtr> & mylist, int len); 24911308Santhony.gutierrez@amd.com PacketPtr mapAddrToPkt(Addr address); 25011308Santhony.gutierrez@amd.com 25111308Santhony.gutierrez@amd.com 25211308Santhony.gutierrez@amd.com RequestStatus getRequestStatus(PacketPtr pkt, 25311308Santhony.gutierrez@amd.com RubyRequestType request_type); 25411308Santhony.gutierrez@amd.com bool insertRequest(PacketPtr pkt, RubyRequestType request_type); 25511308Santhony.gutierrez@amd.com 25611308Santhony.gutierrez@amd.com bool handleLlsc(Addr address, GPUCoalescerRequest* request); 25711308Santhony.gutierrez@amd.com 25812133Sspwilson2@wisc.edu EventFunctionWrapper issueEvent; 25911308Santhony.gutierrez@amd.com 26011308Santhony.gutierrez@amd.com 26111308Santhony.gutierrez@amd.com // Changed to protected to enable inheritance by VIPER Coalescer 26211308Santhony.gutierrez@amd.com protected: 26311308Santhony.gutierrez@amd.com int m_max_outstanding_requests; 26411308Santhony.gutierrez@amd.com int m_deadlock_threshold; 26511308Santhony.gutierrez@amd.com 26611308Santhony.gutierrez@amd.com CacheMemory* m_dataCache_ptr; 26711308Santhony.gutierrez@amd.com CacheMemory* m_instCache_ptr; 26811308Santhony.gutierrez@amd.com 26911308Santhony.gutierrez@amd.com // We need to track both the primary and secondary request types. 27011308Santhony.gutierrez@amd.com // The secondary request type comprises a subset of RubyRequestTypes that 27111308Santhony.gutierrez@amd.com // are understood by the L1 Controller. A primary request type can be any 27211308Santhony.gutierrez@amd.com // RubyRequestType. 27311689Santhony.gutierrez@amd.com typedef std::unordered_map<Addr, std::vector<RequestDesc>> CoalescingTable; 27411308Santhony.gutierrez@amd.com CoalescingTable reqCoalescer; 27511308Santhony.gutierrez@amd.com std::vector<Addr> newRequests; 27611308Santhony.gutierrez@amd.com 27711308Santhony.gutierrez@amd.com typedef std::unordered_map<Addr, GPUCoalescerRequest*> RequestTable; 27811308Santhony.gutierrez@amd.com RequestTable m_writeRequestTable; 27911308Santhony.gutierrez@amd.com RequestTable m_readRequestTable; 28011308Santhony.gutierrez@amd.com // Global outstanding request count, across all request tables 28111308Santhony.gutierrez@amd.com int m_outstanding_count; 28211308Santhony.gutierrez@amd.com bool m_deadlock_check_scheduled; 28311308Santhony.gutierrez@amd.com std::unordered_map<int, PacketPtr> kernelEndList; 28411308Santhony.gutierrez@amd.com std::vector<int> newKernelEnds; 28511308Santhony.gutierrez@amd.com 28611308Santhony.gutierrez@amd.com int m_store_waiting_on_load_cycles; 28711308Santhony.gutierrez@amd.com int m_store_waiting_on_store_cycles; 28811308Santhony.gutierrez@amd.com int m_load_waiting_on_store_cycles; 28911308Santhony.gutierrez@amd.com int m_load_waiting_on_load_cycles; 29011308Santhony.gutierrez@amd.com 29111660Stushar@ece.gatech.edu bool m_runningGarnetStandalone; 29211308Santhony.gutierrez@amd.com 29312133Sspwilson2@wisc.edu EventFunctionWrapper deadlockCheckEvent; 29411308Santhony.gutierrez@amd.com bool assumingRfOCoherence; 29511308Santhony.gutierrez@amd.com 29611308Santhony.gutierrez@amd.com // m5 style stats for TCP hit/miss counts 29711308Santhony.gutierrez@amd.com Stats::Scalar GPU_TCPLdHits; 29811308Santhony.gutierrez@amd.com Stats::Scalar GPU_TCPLdTransfers; 29911308Santhony.gutierrez@amd.com Stats::Scalar GPU_TCCLdHits; 30011308Santhony.gutierrez@amd.com Stats::Scalar GPU_LdMiss; 30111308Santhony.gutierrez@amd.com 30211308Santhony.gutierrez@amd.com Stats::Scalar GPU_TCPStHits; 30311308Santhony.gutierrez@amd.com Stats::Scalar GPU_TCPStTransfers; 30411308Santhony.gutierrez@amd.com Stats::Scalar GPU_TCCStHits; 30511308Santhony.gutierrez@amd.com Stats::Scalar GPU_StMiss; 30611308Santhony.gutierrez@amd.com 30711308Santhony.gutierrez@amd.com Stats::Scalar CP_TCPLdHits; 30811308Santhony.gutierrez@amd.com Stats::Scalar CP_TCPLdTransfers; 30911308Santhony.gutierrez@amd.com Stats::Scalar CP_TCCLdHits; 31011308Santhony.gutierrez@amd.com Stats::Scalar CP_LdMiss; 31111308Santhony.gutierrez@amd.com 31211308Santhony.gutierrez@amd.com Stats::Scalar CP_TCPStHits; 31311308Santhony.gutierrez@amd.com Stats::Scalar CP_TCPStTransfers; 31411308Santhony.gutierrez@amd.com Stats::Scalar CP_TCCStHits; 31511308Santhony.gutierrez@amd.com Stats::Scalar CP_StMiss; 31611308Santhony.gutierrez@amd.com 31711308Santhony.gutierrez@amd.com //! Histogram for number of outstanding requests per cycle. 31811308Santhony.gutierrez@amd.com Stats::Histogram m_outstandReqHist; 31911308Santhony.gutierrez@amd.com 32011308Santhony.gutierrez@amd.com //! Histogram for holding latency profile of all requests. 32111308Santhony.gutierrez@amd.com Stats::Histogram m_latencyHist; 32211308Santhony.gutierrez@amd.com std::vector<Stats::Histogram *> m_typeLatencyHist; 32311308Santhony.gutierrez@amd.com 32411308Santhony.gutierrez@amd.com //! Histogram for holding latency profile of all requests that 32511308Santhony.gutierrez@amd.com //! miss in the controller connected to this sequencer. 32611308Santhony.gutierrez@amd.com Stats::Histogram m_missLatencyHist; 32711308Santhony.gutierrez@amd.com std::vector<Stats::Histogram *> m_missTypeLatencyHist; 32811308Santhony.gutierrez@amd.com 32911308Santhony.gutierrez@amd.com //! Histograms for profiling the latencies for requests that 33011308Santhony.gutierrez@amd.com //! required external messages. 33111308Santhony.gutierrez@amd.com std::vector<Stats::Histogram *> m_missMachLatencyHist; 33211308Santhony.gutierrez@amd.com std::vector< std::vector<Stats::Histogram *> > m_missTypeMachLatencyHist; 33311308Santhony.gutierrez@amd.com 33411308Santhony.gutierrez@amd.com //! Histograms for recording the breakdown of miss latency 33511308Santhony.gutierrez@amd.com std::vector<Stats::Histogram *> m_IssueToInitialDelayHist; 33611308Santhony.gutierrez@amd.com std::vector<Stats::Histogram *> m_InitialToForwardDelayHist; 33711308Santhony.gutierrez@amd.com std::vector<Stats::Histogram *> m_ForwardToFirstResponseDelayHist; 33811308Santhony.gutierrez@amd.com std::vector<Stats::Histogram *> m_FirstResponseToCompletionDelayHist; 33911900Sandreas.sandberg@arm.com 34011900Sandreas.sandberg@arm.comprivate: 34111900Sandreas.sandberg@arm.com // Private copy constructor and assignment operator 34211900Sandreas.sandberg@arm.com GPUCoalescer(const GPUCoalescer& obj); 34311900Sandreas.sandberg@arm.com GPUCoalescer& operator=(const GPUCoalescer& obj); 34411308Santhony.gutierrez@amd.com}; 34511308Santhony.gutierrez@amd.com 34611308Santhony.gutierrez@amd.cominline std::ostream& 34711308Santhony.gutierrez@amd.comoperator<<(std::ostream& out, const GPUCoalescer& obj) 34811308Santhony.gutierrez@amd.com{ 34911308Santhony.gutierrez@amd.com obj.print(out); 35011308Santhony.gutierrez@amd.com out << std::flush; 35111308Santhony.gutierrez@amd.com return out; 35211308Santhony.gutierrez@amd.com} 35311308Santhony.gutierrez@amd.com 35411308Santhony.gutierrez@amd.com#endif // __MEM_RUBY_SYSTEM_GPU_COALESCER_HH__ 355