Go to the documentation of this file.
36 #include "debug/GPUCommandProc.hh"
37 #include "debug/GPUKernelInfo.hh"
39 #include "params/GPUCommandProcessor.hh"
45 :
HSADevice(
p), dispatcher(*
p.dispatcher), driver(nullptr)
71 static int dynamic_task_id = 0;
79 auto &virt_proxy = tc->getVirtProxy();
94 DPRINTF(GPUCommandProc,
"GPU machine code is %lli bytes from start of the "
97 DPRINTF(GPUCommandProc,
"GPUCommandProc: Sending dispatch pkt to %lu\n",
98 (uint64_t)tc->cpuId());
104 DPRINTF(GPUCommandProc,
"Machine code starts at addr: %#x\n",
107 Addr kern_name_addr(0);
108 std::string kernel_name;
121 (uint8_t*)&kern_name_addr, 0x8);
123 virt_proxy.readString(kernel_name, kern_name_addr);
125 kernel_name =
"Blit kernel";
128 DPRINTF(GPUKernelInfo,
"Kernel name: %s\n", kernel_name.c_str());
131 dynamic_task_id, raw_pkt, &akc, host_pkt_addr, machine_code_addr);
133 DPRINTF(GPUCommandProc,
"Task ID: %i Got AQL: wg size (%dx%dx%d), "
134 "grid size (%dx%dx%d) kernarg addr: %#x, completion "
141 DPRINTF(GPUCommandProc,
"Extracted code object: %s (num vector regs: %d, "
142 "num scalar regs: %d, code addr: %#x, kernarg size: %d, "
167 DPRINTF(GPUCommandProc,
"Triggering completion signal: %x!\n", value_addr);
170 *new_signal = signal_value;
182 if (*mailbox_ptr != 0) {
188 DPRINTF(GPUCommandProc,
"Calling signal wakeup event on "
189 "signal event value %d\n", *event_val);
241 DPRINTF(GPUCommandProc,
"Agent Dispatch Packet NOP\n");
242 }
else if (agent_pkt->
type == AgentCmd::Steal) {
244 int kid = agent_pkt->
arg[0];
246 "Agent Dispatch Packet Stealing signal handle for kernel %d\n",
253 DPRINTF(GPUCommandProc,
"Return Addr: %p\n",return_address);
256 *new_signal_addr = (
Addr)signal_addr;
260 "Agent Dispatch Packet Stealing signal handle from kid %d :" \
261 "(%x:%x) writing into %x\n",
262 kid,signal_addr,new_signal_addr,return_address);
266 panic(
"The agent dispatch packet provided an unknown argument in" \
267 "arg[0],currently only 0(nop) or 1(return kernel signal) is accepted");
305 dmaReadVirt(hostReadIdxPtr +
sizeof(hostReadIdxPtr),
306 sizeof(readDispIdOffEvent->readDispIdOffset), readDispIdOffEvent,
307 &readDispIdOffEvent->readDispIdOffset);
HSAPacketProcessor * hsaPP
uint64_t functionalReadHsaSignal(Addr signal_handle) override
void dispatchPkt(HSAQueueEntry *task)
Once the CP has finished extracting all relevant information about a task and has initialized the ABI...
GPUDispatcher & dispatcher
HSAQueueDescriptor * getQueueDesc(uint32_t queId)
uint64_t completion_signal
void dmaWriteVirt(Addr host_addr, unsigned size, DmaCallback *cb, void *data, Tick delay=0)
AddrRangeList getAddrRanges() const override
Every PIO device is obliged to provide an implementation that returns the address ranges the device r...
Perform a DMA read of the read_dispatch_id_field_base_byte_offset field, which follows directly after...
GPUCommandProcessor()=delete
void submitDispatchPkt(void *raw_pkt, uint32_t queue_id, Addr host_pkt_addr) override
submitDispatchPkt() is the entry point into the CP from the HSAPP and is only meant to be used with A...
void finishPkt(void *pkt, uint32_t rl_idx)
HSAQueueEntry * hsaTask(int disp_id)
int numVectorRegs() const
void dmaReadVirt(Addr host_addr, unsigned size, DmaCallback *cb, void *data, Tick delay=0)
Addr getHsaSignalValueAddr(Addr signal_handle)
Addr completionSignal() const
def format Nop(code, *opt_flags)
uint64_t hostReadIndexPtr
void updateHsaSignal(Addr signal_handle, uint64_t signal_value) override
void submitAgentDispatchPkt(void *raw_pkt, uint32_t queue_id, Addr host_pkt_addr) override
submitAgentDispatchPkt() is for accepting agent dispatch packets.
void dispatch(HSAQueueEntry *task)
After all relevant HSA data structures have been traversed/extracted from memory by the CP,...
void setShader(Shader *shader)
uint16_t workgroup_size_z
void setCommandProcessor(GPUCommandProcessor *gpu_cmd_proc)
Addr getHsaSignalEventAddr(Addr signal_handle)
uint16_t workgroup_size_y
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
int numScalarRegs() const
void attachDriver(HSADriver *driver) override
void submitVendorPkt(void *raw_pkt, uint32_t queue_id, Addr host_pkt_addr) override
submitVendorPkt() is for accepting vendor-specific packets from the HSAPP.
uint16_t workgroup_size_x
void signalWakeupEvent(uint32_t event_id)
uint64_t runtime_loader_kernel_symbol
virtual void signalWakeupEvent(uint32_t event_id)
int64_t kernel_code_entry_byte_offset
void initABI(HSAQueueEntry *task)
The CP is responsible for traversing all HSA-ABI-related data structures from memory and initializing...
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Addr getHsaSignalMailboxAddr(Addr signal_handle)
#define panic(...)
This implements a cprintf based panic() function.
Generated on Tue Jun 22 2021 15:28:28 for gem5 by doxygen 1.8.17