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: Steve Reinhardt 3411308Santhony.gutierrez@amd.com */ 3511308Santhony.gutierrez@amd.com 3611308Santhony.gutierrez@amd.com#ifndef __SHADER_HH__ 3711308Santhony.gutierrez@amd.com#define __SHADER_HH__ 3811308Santhony.gutierrez@amd.com 3911308Santhony.gutierrez@amd.com#include <functional> 4011308Santhony.gutierrez@amd.com#include <string> 4111308Santhony.gutierrez@amd.com 4211308Santhony.gutierrez@amd.com#include "arch/isa.hh" 4311308Santhony.gutierrez@amd.com#include "arch/isa_traits.hh" 4411308Santhony.gutierrez@amd.com#include "base/types.hh" 4511308Santhony.gutierrez@amd.com#include "cpu/simple/atomic.hh" 4611308Santhony.gutierrez@amd.com#include "cpu/simple/timing.hh" 4711308Santhony.gutierrez@amd.com#include "cpu/simple_thread.hh" 4811308Santhony.gutierrez@amd.com#include "cpu/thread_context.hh" 4911308Santhony.gutierrez@amd.com#include "cpu/thread_state.hh" 5011308Santhony.gutierrez@amd.com#include "enums/MemType.hh" 5111308Santhony.gutierrez@amd.com#include "gpu-compute/compute_unit.hh" 5211308Santhony.gutierrez@amd.com#include "gpu-compute/gpu_tlb.hh" 5311308Santhony.gutierrez@amd.com#include "gpu-compute/lds_state.hh" 5411308Santhony.gutierrez@amd.com#include "gpu-compute/qstruct.hh" 5511308Santhony.gutierrez@amd.com#include "mem/page_table.hh" 5611308Santhony.gutierrez@amd.com#include "mem/port.hh" 5711308Santhony.gutierrez@amd.com#include "mem/request.hh" 5811308Santhony.gutierrez@amd.com#include "params/Shader.hh" 5911308Santhony.gutierrez@amd.com#include "sim/faults.hh" 6011308Santhony.gutierrez@amd.com#include "sim/process.hh" 6111308Santhony.gutierrez@amd.com#include "sim/sim_object.hh" 6211308Santhony.gutierrez@amd.com 6311308Santhony.gutierrez@amd.comclass BaseTLB; 6411308Santhony.gutierrez@amd.comclass GpuDispatcher; 6511308Santhony.gutierrez@amd.com 6611308Santhony.gutierrez@amd.comnamespace TheISA 6711308Santhony.gutierrez@amd.com{ 6811308Santhony.gutierrez@amd.com class GpuTLB; 6911308Santhony.gutierrez@amd.com} 7011308Santhony.gutierrez@amd.com 7111308Santhony.gutierrez@amd.comstatic const int LDS_SIZE = 65536; 7211308Santhony.gutierrez@amd.com 7311308Santhony.gutierrez@amd.com// Class Shader: This describes a single shader instance. Most 7411308Santhony.gutierrez@amd.com// configurations will only have a single shader. 7511308Santhony.gutierrez@amd.com 7611900Sandreas.sandberg@arm.comclass Shader : public ClockedObject 7711308Santhony.gutierrez@amd.com{ 7811308Santhony.gutierrez@amd.com protected: 7911308Santhony.gutierrez@amd.com // Shader's clock period in terms of number of ticks of curTime, 8011308Santhony.gutierrez@amd.com // aka global simulation clock 8111308Santhony.gutierrez@amd.com Tick clock; 8211308Santhony.gutierrez@amd.com 8311308Santhony.gutierrez@amd.com public: 8411308Santhony.gutierrez@amd.com typedef ShaderParams Params; 8511308Santhony.gutierrez@amd.com enum hsail_mode_e {SIMT,VECTOR_SCALAR}; 8611308Santhony.gutierrez@amd.com 8711308Santhony.gutierrez@amd.com // clock related functions ; maps to-and-from 8811308Santhony.gutierrez@amd.com // Simulation ticks and shader clocks. 8911308Santhony.gutierrez@amd.com Tick frequency() const { return SimClock::Frequency / clock; } 9011308Santhony.gutierrez@amd.com 9111308Santhony.gutierrez@amd.com Tick ticks(int numCycles) const { return (Tick)clock * numCycles; } 9211308Santhony.gutierrez@amd.com 9311308Santhony.gutierrez@amd.com Tick getClock() const { return clock; } 9411308Santhony.gutierrez@amd.com Tick curCycle() const { return curTick() / clock; } 9511308Santhony.gutierrez@amd.com Tick tickToCycles(Tick val) const { return val / clock;} 9611308Santhony.gutierrez@amd.com 9711308Santhony.gutierrez@amd.com 9811308Santhony.gutierrez@amd.com SimpleThread *cpuThread; 9911308Santhony.gutierrez@amd.com ThreadContext *gpuTc; 10011308Santhony.gutierrez@amd.com BaseCPU *cpuPointer; 10111308Santhony.gutierrez@amd.com 10212126Sspwilson2@wisc.edu void processTick(); 10312126Sspwilson2@wisc.edu EventFunctionWrapper tickEvent; 10411308Santhony.gutierrez@amd.com 10511308Santhony.gutierrez@amd.com // is this simulation going to be timing mode in the memory? 10611308Santhony.gutierrez@amd.com bool timingSim; 10711308Santhony.gutierrez@amd.com hsail_mode_e hsail_mode; 10811308Santhony.gutierrez@amd.com 10911308Santhony.gutierrez@amd.com // If set, issue acq packet @ kernel launch 11011308Santhony.gutierrez@amd.com int impl_kern_boundary_sync; 11111308Santhony.gutierrez@amd.com // If set, generate a separate packet for acquire/release on 11211308Santhony.gutierrez@amd.com // ld_acquire/st_release/atomic operations 11311308Santhony.gutierrez@amd.com int separate_acquire_release; 11411308Santhony.gutierrez@amd.com // If set, fetch returns may be coissued with instructions 11511308Santhony.gutierrez@amd.com int coissue_return; 11611308Santhony.gutierrez@amd.com // If set, always dump all 64 gprs to trace 11711308Santhony.gutierrez@amd.com int trace_vgpr_all; 11811308Santhony.gutierrez@amd.com // Number of cu units in the shader 11911308Santhony.gutierrez@amd.com int n_cu; 12011308Santhony.gutierrez@amd.com // Number of wavefront slots per cu 12111308Santhony.gutierrez@amd.com int n_wf; 12211308Santhony.gutierrez@amd.com // The size of global memory 12311308Santhony.gutierrez@amd.com int globalMemSize; 12411308Santhony.gutierrez@amd.com 12511308Santhony.gutierrez@amd.com /* 12611308Santhony.gutierrez@amd.com * Bytes/work-item for call instruction 12711308Santhony.gutierrez@amd.com * The number of arguments for an hsail function will 12811308Santhony.gutierrez@amd.com * vary. We simply determine the maximum # of arguments 12911308Santhony.gutierrez@amd.com * required by any hsail function up front before the 13011308Santhony.gutierrez@amd.com * simulation (during parsing of the Brig) and record 13111308Santhony.gutierrez@amd.com * that number here. 13211308Santhony.gutierrez@amd.com */ 13311308Santhony.gutierrez@amd.com int funcargs_size; 13411308Santhony.gutierrez@amd.com 13511308Santhony.gutierrez@amd.com // Tracks CU that rr dispatcher should attempt scheduling 13611308Santhony.gutierrez@amd.com int nextSchedCu; 13711308Santhony.gutierrez@amd.com 13811308Santhony.gutierrez@amd.com // Size of scheduled add queue 13911308Santhony.gutierrez@amd.com uint32_t sa_n; 14011308Santhony.gutierrez@amd.com 14111308Santhony.gutierrez@amd.com // Pointer to value to be increments 14211308Santhony.gutierrez@amd.com std::vector<uint32_t*> sa_val; 14311308Santhony.gutierrez@amd.com // When to do the increment 14411308Santhony.gutierrez@amd.com std::vector<uint64_t> sa_when; 14511308Santhony.gutierrez@amd.com // Amount to increment by 14611308Santhony.gutierrez@amd.com std::vector<int32_t> sa_x; 14711308Santhony.gutierrez@amd.com 14811308Santhony.gutierrez@amd.com // List of Compute Units (CU's) 14911308Santhony.gutierrez@amd.com std::vector<ComputeUnit*> cuList; 15011308Santhony.gutierrez@amd.com 15111308Santhony.gutierrez@amd.com uint64_t tick_cnt; 15211308Santhony.gutierrez@amd.com uint64_t box_tick_cnt; 15311308Santhony.gutierrez@amd.com uint64_t start_tick_cnt; 15411308Santhony.gutierrez@amd.com 15511308Santhony.gutierrez@amd.com GpuDispatcher *dispatcher; 15611308Santhony.gutierrez@amd.com 15711308Santhony.gutierrez@amd.com Shader(const Params *p); 15811308Santhony.gutierrez@amd.com ~Shader(); 15911308Santhony.gutierrez@amd.com virtual void init(); 16011308Santhony.gutierrez@amd.com 16111308Santhony.gutierrez@amd.com // Run shader 16211308Santhony.gutierrez@amd.com void exec(); 16311308Santhony.gutierrez@amd.com 16411308Santhony.gutierrez@amd.com // Check to see if shader is busy 16511308Santhony.gutierrez@amd.com bool busy(); 16611308Santhony.gutierrez@amd.com 16711308Santhony.gutierrez@amd.com // Schedule a 32-bit value to be incremented some time in the future 16811308Santhony.gutierrez@amd.com void ScheduleAdd(uint32_t *val, Tick when, int x); 16911308Santhony.gutierrez@amd.com bool processTimingPacket(PacketPtr pkt); 17011308Santhony.gutierrez@amd.com 17111308Santhony.gutierrez@amd.com void AccessMem(uint64_t address, void *ptr, uint32_t size, int cu_id, 17211308Santhony.gutierrez@amd.com MemCmd cmd, bool suppress_func_errors); 17311308Santhony.gutierrez@amd.com 17411308Santhony.gutierrez@amd.com void ReadMem(uint64_t address, void *ptr, uint32_t sz, int cu_id); 17511308Santhony.gutierrez@amd.com 17611308Santhony.gutierrez@amd.com void ReadMem(uint64_t address, void *ptr, uint32_t sz, int cu_id, 17711308Santhony.gutierrez@amd.com bool suppress_func_errors); 17811308Santhony.gutierrez@amd.com 17911308Santhony.gutierrez@amd.com void WriteMem(uint64_t address, void *ptr, uint32_t sz, int cu_id); 18011308Santhony.gutierrez@amd.com 18111308Santhony.gutierrez@amd.com void WriteMem(uint64_t address, void *ptr, uint32_t sz, int cu_id, 18211308Santhony.gutierrez@amd.com bool suppress_func_errors); 18311308Santhony.gutierrez@amd.com 18412749Sgiacomo.travaglini@arm.com void doFunctionalAccess(const RequestPtr &req, MemCmd cmd, void *data, 18511308Santhony.gutierrez@amd.com bool suppress_func_errors, int cu_id); 18611308Santhony.gutierrez@amd.com 18711308Santhony.gutierrez@amd.com void 18811308Santhony.gutierrez@amd.com registerCU(int cu_id, ComputeUnit *compute_unit) 18911308Santhony.gutierrez@amd.com { 19011308Santhony.gutierrez@amd.com cuList[cu_id] = compute_unit; 19111308Santhony.gutierrez@amd.com } 19211308Santhony.gutierrez@amd.com 19311308Santhony.gutierrez@amd.com void handshake(GpuDispatcher *dispatcher); 19411308Santhony.gutierrez@amd.com bool dispatch_workgroups(NDRange *ndr); 19511308Santhony.gutierrez@amd.com Addr mmap(int length); 19611308Santhony.gutierrez@amd.com void functionalTLBAccess(PacketPtr pkt, int cu_id, BaseTLB::Mode mode); 19711435Smitch.hayenga@arm.com void updateContext(int cid); 19811308Santhony.gutierrez@amd.com void hostWakeUp(BaseCPU *cpu); 19911308Santhony.gutierrez@amd.com}; 20011308Santhony.gutierrez@amd.com 20111308Santhony.gutierrez@amd.com#endif // __SHADER_HH__ 202