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