dispatcher.hh revision 12126
111308Santhony.gutierrez@amd.com/* 211308Santhony.gutierrez@amd.com * Copyright (c) 2011-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 * 1711308Santhony.gutierrez@amd.com * 3. Neither the name of the copyright holder nor the names of its contributors 1811308Santhony.gutierrez@amd.com * may be used to endorse or promote products derived from this software 1911308Santhony.gutierrez@amd.com * 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 * 3311308Santhony.gutierrez@amd.com * Author: Brad Beckmann, Marc Orr 3411308Santhony.gutierrez@amd.com */ 3511308Santhony.gutierrez@amd.com 3611308Santhony.gutierrez@amd.com#ifndef __GPU_DISPATCHER_HH__ 3711308Santhony.gutierrez@amd.com#define __GPU_DISPATCHER_HH__ 3811308Santhony.gutierrez@amd.com 3911308Santhony.gutierrez@amd.com#include <queue> 4011308Santhony.gutierrez@amd.com#include <vector> 4111308Santhony.gutierrez@amd.com 4211308Santhony.gutierrez@amd.com#include "base/statistics.hh" 4311308Santhony.gutierrez@amd.com#include "dev/dma_device.hh" 4411308Santhony.gutierrez@amd.com#include "gpu-compute/compute_unit.hh" 4511308Santhony.gutierrez@amd.com#include "gpu-compute/ndrange.hh" 4611308Santhony.gutierrez@amd.com#include "gpu-compute/qstruct.hh" 4711308Santhony.gutierrez@amd.com#include "mem/port.hh" 4811308Santhony.gutierrez@amd.com#include "params/GpuDispatcher.hh" 4911308Santhony.gutierrez@amd.com 5011308Santhony.gutierrez@amd.comclass BaseCPU; 5111308Santhony.gutierrez@amd.comclass Shader; 5211308Santhony.gutierrez@amd.com 5311308Santhony.gutierrez@amd.comclass GpuDispatcher : public DmaDevice 5411308Santhony.gutierrez@amd.com{ 5511308Santhony.gutierrez@amd.com public: 5611308Santhony.gutierrez@amd.com typedef GpuDispatcherParams Params; 5711308Santhony.gutierrez@amd.com 5811308Santhony.gutierrez@amd.com MasterID masterId() { return _masterId; } 5911308Santhony.gutierrez@amd.com 6011308Santhony.gutierrez@amd.com protected: 6111308Santhony.gutierrez@amd.com MasterID _masterId; 6211308Santhony.gutierrez@amd.com 6311308Santhony.gutierrez@amd.com // Base and length of PIO register space 6411308Santhony.gutierrez@amd.com Addr pioAddr; 6511308Santhony.gutierrez@amd.com Addr pioSize; 6611308Santhony.gutierrez@amd.com Tick pioDelay; 6711308Santhony.gutierrez@amd.com 6811308Santhony.gutierrez@amd.com HsaQueueEntry curTask; 6911308Santhony.gutierrez@amd.com 7011308Santhony.gutierrez@amd.com std::unordered_map<int, NDRange> ndRangeMap; 7111308Santhony.gutierrez@amd.com NDRange ndRange; 7211308Santhony.gutierrez@amd.com 7311308Santhony.gutierrez@amd.com // list of kernel_ids to launch 7411308Santhony.gutierrez@amd.com std::queue<int> execIds; 7511308Santhony.gutierrez@amd.com // list of kernel_ids that have finished 7611308Santhony.gutierrez@amd.com std::queue<int> doneIds; 7711308Santhony.gutierrez@amd.com 7811308Santhony.gutierrez@amd.com uint64_t dispatchCount; 7911308Santhony.gutierrez@amd.com // is there a kernel in execution? 8011308Santhony.gutierrez@amd.com bool dispatchActive; 8111308Santhony.gutierrez@amd.com 8211308Santhony.gutierrez@amd.com BaseCPU *cpu; 8311308Santhony.gutierrez@amd.com Shader *shader; 8411308Santhony.gutierrez@amd.com ClDriver *driver; 8512126Sspwilson2@wisc.edu EventFunctionWrapper tickEvent; 8612126Sspwilson2@wisc.edu 8711308Santhony.gutierrez@amd.com 8811308Santhony.gutierrez@amd.com static GpuDispatcher *instance; 8911308Santhony.gutierrez@amd.com 9011308Santhony.gutierrez@amd.com // sycall emulation mode can have only 1 application running(?) 9111308Santhony.gutierrez@amd.com // else we have to do some pid based tagging 9211308Santhony.gutierrez@amd.com // unused 9311308Santhony.gutierrez@amd.com typedef std::unordered_map<uint64_t, uint64_t> TranslationBuffer; 9411308Santhony.gutierrez@amd.com TranslationBuffer tlb; 9511308Santhony.gutierrez@amd.com 9611308Santhony.gutierrez@amd.com public: 9711308Santhony.gutierrez@amd.com /*statistics*/ 9811308Santhony.gutierrez@amd.com Stats::Scalar num_kernelLaunched; 9911308Santhony.gutierrez@amd.com GpuDispatcher(const Params *p); 10011308Santhony.gutierrez@amd.com 10111308Santhony.gutierrez@amd.com ~GpuDispatcher() { } 10211308Santhony.gutierrez@amd.com 10311308Santhony.gutierrez@amd.com void exec(); 10411308Santhony.gutierrez@amd.com virtual void serialize(CheckpointOut &cp) const; 10511308Santhony.gutierrez@amd.com virtual void unserialize(CheckpointIn &cp); 10611308Santhony.gutierrez@amd.com void notifyWgCompl(Wavefront *w); 10711308Santhony.gutierrez@amd.com void scheduleDispatch(); 10811308Santhony.gutierrez@amd.com void accessUserVar(BaseCPU *cpu, uint64_t addr, int val, int off); 10911308Santhony.gutierrez@amd.com 11011308Santhony.gutierrez@amd.com // using singleton so that glue code can pass pointer locations 11111308Santhony.gutierrez@amd.com // to the dispatcher. when there are multiple dispatchers, we can 11211308Santhony.gutierrez@amd.com // call something like getInstance(index) 11311308Santhony.gutierrez@amd.com static void 11411308Santhony.gutierrez@amd.com setInstance(GpuDispatcher *_instance) 11511308Santhony.gutierrez@amd.com { 11611308Santhony.gutierrez@amd.com instance = _instance; 11711308Santhony.gutierrez@amd.com } 11811308Santhony.gutierrez@amd.com 11911308Santhony.gutierrez@amd.com static GpuDispatcher* getInstance() { return instance; } 12011308Santhony.gutierrez@amd.com 12111308Santhony.gutierrez@amd.com class TLBPort : public MasterPort 12211308Santhony.gutierrez@amd.com { 12311308Santhony.gutierrez@amd.com public: 12411308Santhony.gutierrez@amd.com 12511308Santhony.gutierrez@amd.com TLBPort(const std::string &_name, GpuDispatcher *_dispatcher) 12611308Santhony.gutierrez@amd.com : MasterPort(_name, _dispatcher), dispatcher(_dispatcher) { } 12711308Santhony.gutierrez@amd.com 12811308Santhony.gutierrez@amd.com protected: 12911308Santhony.gutierrez@amd.com GpuDispatcher *dispatcher; 13011308Santhony.gutierrez@amd.com 13111308Santhony.gutierrez@amd.com virtual bool recvTimingResp(PacketPtr pkt) { return true; } 13211308Santhony.gutierrez@amd.com virtual Tick recvAtomic(PacketPtr pkt) { return 0; } 13311308Santhony.gutierrez@amd.com virtual void recvFunctional(PacketPtr pkt) { } 13411308Santhony.gutierrez@amd.com virtual void recvRangeChange() { } 13511308Santhony.gutierrez@amd.com virtual void recvReqRetry() { } 13611308Santhony.gutierrez@amd.com 13711308Santhony.gutierrez@amd.com }; 13811308Santhony.gutierrez@amd.com 13911308Santhony.gutierrez@amd.com TLBPort *tlbPort; 14011308Santhony.gutierrez@amd.com 14111308Santhony.gutierrez@amd.com virtual BaseMasterPort& getMasterPort(const std::string &if_name, 14211308Santhony.gutierrez@amd.com PortID idx); 14311308Santhony.gutierrez@amd.com 14411308Santhony.gutierrez@amd.com AddrRangeList getAddrRanges() const; 14511308Santhony.gutierrez@amd.com Tick read(PacketPtr pkt); 14611308Santhony.gutierrez@amd.com Tick write(PacketPtr pkt); 14711308Santhony.gutierrez@amd.com 14811308Santhony.gutierrez@amd.com // helper functions to retrieve/set GPU attributes 14911308Santhony.gutierrez@amd.com int getNumCUs(); 15011534Sjohn.kalamatianos@amd.com int wfSize() const; 15111308Santhony.gutierrez@amd.com void setFuncargsSize(int funcargs_size); 15211640Salexandru.dutu@amd.com 15311640Salexandru.dutu@amd.com /** Returns the size of the static hardware context of a wavefront */ 15411640Salexandru.dutu@amd.com uint32_t getStaticContextSize() const; 15511308Santhony.gutierrez@amd.com}; 15611308Santhony.gutierrez@amd.com 15711308Santhony.gutierrez@amd.com#endif // __GPU_DISPATCHER_HH__ 158