| /* | |
| * Copyright (c) 2011-2015 Advanced Micro Devices, Inc. | |
| * All rights reserved. | |
| * | |
| * For use for simulation and test purposes only | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are met: | |
| * | |
| * 1. Redistributions of source code must retain the above copyright notice, | |
| * this list of conditions and the following disclaimer. | |
| * | |
| * 2. Redistributions in binary form must reproduce the above copyright notice, | |
| * this list of conditions and the following disclaimer in the documentation | |
| * and/or other materials provided with the distribution. | |
| * | |
| * 3. Neither the name of the copyright holder nor the names of its contributors | |
| * may be used to endorse or promote products derived from this software | |
| * without specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
| * POSSIBILITY OF SUCH DAMAGE. | |
| * | |
| * Author: Steve Reinhardt | |
| */ | |
| #ifndef __SHADER_HH__ | |
| #define __SHADER_HH__ | |
| #include <functional> | |
| #include <string> | |
| #include "arch/isa.hh" | |
| #include "arch/isa_traits.hh" | |
| #include "base/types.hh" | |
| #include "cpu/simple/atomic.hh" | |
| #include "cpu/simple/timing.hh" | |
| #include "cpu/simple_thread.hh" | |
| #include "cpu/thread_context.hh" | |
| #include "cpu/thread_state.hh" | |
| #include "enums/MemType.hh" | |
| #include "gpu-compute/compute_unit.hh" | |
| #include "gpu-compute/gpu_tlb.hh" | |
| #include "gpu-compute/lds_state.hh" | |
| #include "gpu-compute/qstruct.hh" | |
| #include "mem/page_table.hh" | |
| #include "mem/port.hh" | |
| #include "mem/request.hh" | |
| #include "params/Shader.hh" | |
| #include "sim/faults.hh" | |
| #include "sim/process.hh" | |
| #include "sim/sim_object.hh" | |
| class BaseTLB; | |
| class GpuDispatcher; | |
| namespace TheISA | |
| { | |
| class GpuTLB; | |
| } | |
| static const int LDS_SIZE = 65536; | |
| // Class Shader: This describes a single shader instance. Most | |
| // configurations will only have a single shader. | |
| class Shader : public ClockedObject | |
| { | |
| protected: | |
| // Shader's clock period in terms of number of ticks of curTime, | |
| // aka global simulation clock | |
| Tick clock; | |
| public: | |
| typedef ShaderParams Params; | |
| enum hsail_mode_e {SIMT,VECTOR_SCALAR}; | |
| // clock related functions ; maps to-and-from | |
| // Simulation ticks and shader clocks. | |
| Tick frequency() const { return SimClock::Frequency / clock; } | |
| Tick ticks(int numCycles) const { return (Tick)clock * numCycles; } | |
| Tick getClock() const { return clock; } | |
| Tick curCycle() const { return curTick() / clock; } | |
| Tick tickToCycles(Tick val) const { return val / clock;} | |
| SimpleThread *cpuThread; | |
| ThreadContext *gpuTc; | |
| BaseCPU *cpuPointer; | |
| void processTick(); | |
| EventFunctionWrapper tickEvent; | |
| // is this simulation going to be timing mode in the memory? | |
| bool timingSim; | |
| hsail_mode_e hsail_mode; | |
| // If set, issue acq packet @ kernel launch | |
| int impl_kern_boundary_sync; | |
| // If set, generate a separate packet for acquire/release on | |
| // ld_acquire/st_release/atomic operations | |
| int separate_acquire_release; | |
| // If set, fetch returns may be coissued with instructions | |
| int coissue_return; | |
| // If set, always dump all 64 gprs to trace | |
| int trace_vgpr_all; | |
| // Number of cu units in the shader | |
| int n_cu; | |
| // Number of wavefront slots per cu | |
| int n_wf; | |
| // The size of global memory | |
| int globalMemSize; | |
| /* | |
| * Bytes/work-item for call instruction | |
| * The number of arguments for an hsail function will | |
| * vary. We simply determine the maximum # of arguments | |
| * required by any hsail function up front before the | |
| * simulation (during parsing of the Brig) and record | |
| * that number here. | |
| */ | |
| int funcargs_size; | |
| // Tracks CU that rr dispatcher should attempt scheduling | |
| int nextSchedCu; | |
| // Size of scheduled add queue | |
| uint32_t sa_n; | |
| // Pointer to value to be increments | |
| std::vector<uint32_t*> sa_val; | |
| // When to do the increment | |
| std::vector<uint64_t> sa_when; | |
| // Amount to increment by | |
| std::vector<int32_t> sa_x; | |
| // List of Compute Units (CU's) | |
| std::vector<ComputeUnit*> cuList; | |
| uint64_t tick_cnt; | |
| uint64_t box_tick_cnt; | |
| uint64_t start_tick_cnt; | |
| GpuDispatcher *dispatcher; | |
| Shader(const Params *p); | |
| ~Shader(); | |
| virtual void init(); | |
| // Run shader | |
| void exec(); | |
| // Check to see if shader is busy | |
| bool busy(); | |
| // Schedule a 32-bit value to be incremented some time in the future | |
| void ScheduleAdd(uint32_t *val, Tick when, int x); | |
| bool processTimingPacket(PacketPtr pkt); | |
| void AccessMem(uint64_t address, void *ptr, uint32_t size, int cu_id, | |
| MemCmd cmd, bool suppress_func_errors); | |
| void ReadMem(uint64_t address, void *ptr, uint32_t sz, int cu_id); | |
| void ReadMem(uint64_t address, void *ptr, uint32_t sz, int cu_id, | |
| bool suppress_func_errors); | |
| void WriteMem(uint64_t address, void *ptr, uint32_t sz, int cu_id); | |
| void WriteMem(uint64_t address, void *ptr, uint32_t sz, int cu_id, | |
| bool suppress_func_errors); | |
| void doFunctionalAccess(const RequestPtr &req, MemCmd cmd, void *data, | |
| bool suppress_func_errors, int cu_id); | |
| void | |
| registerCU(int cu_id, ComputeUnit *compute_unit) | |
| { | |
| cuList[cu_id] = compute_unit; | |
| } | |
| void handshake(GpuDispatcher *dispatcher); | |
| bool dispatch_workgroups(NDRange *ndr); | |
| Addr mmap(int length); | |
| void functionalTLBAccess(PacketPtr pkt, int cu_id, BaseTLB::Mode mode); | |
| void updateContext(int cid); | |
| void hostWakeUp(BaseCPU *cpu); | |
| }; | |
| #endif // __SHADER_HH__ |