diff --git a/src/gpu-compute/dispatcher.cc b/src/gpu-compute/dispatcher.cc --- a/src/gpu-compute/dispatcher.cc +++ b/src/gpu-compute/dispatcher.cc @@ -398,3 +398,9 @@ { shader->funcargs_size = funcargs_size; } + +uint32_t +GPUDispatcher::getStaticContextSize() +{ + return shader->cuList[0]->wfList[0][0]->getStaticContextSize(); +} diff --git a/src/gpu-compute/hsa_kernel_info.hh b/src/gpu-compute/hsa_kernel_info.hh --- a/src/gpu-compute/hsa_kernel_info.hh +++ b/src/gpu-compute/hsa_kernel_info.hh @@ -48,6 +48,7 @@ static const int HSA_GET_READONLY_DATA = 0x4805; static const int HSA_GET_CU_CNT = 0x4806; static const int HSA_GET_VSZ = 0x4807; +static const int HSA_GET_HW_STATIC_CONTEXT_SIZE = 0x4808; // Return value (via buffer ptr) for HSA_GET_SIZES struct HsaDriverSizes diff --git a/src/gpu-compute/wavefront.hh b/src/gpu-compute/wavefront.hh --- a/src/gpu-compute/wavefront.hh +++ b/src/gpu-compute/wavefront.hh @@ -354,6 +354,12 @@ void discardFetch(); + /** + * Returns the size of the static hardware context of a particular wavefront + * This should be updated everytime the context is changed + */ + uint32_t getStaticContextSize(); + private: /** * Stack containing Control Flow Graph nodes (i.e., kernel instructions) diff --git a/src/gpu-compute/wavefront.cc b/src/gpu-compute/wavefront.cc --- a/src/gpu-compute/wavefront.cc +++ b/src/gpu-compute/wavefront.cc @@ -155,9 +155,9 @@ } void -Wavefront::start(uint64_t _wfDynId,uint64_t _base_ptr) +Wavefront::start(uint64_t _wf_dyn_id,uint64_t _base_ptr) { - wfDynId = _wfDynId; + wfDynId = _wf_dyn_id; basePtr = _base_ptr; status = S_RUNNING; } @@ -931,3 +931,13 @@ { reconvergenceStack.top()->pc = new_pc; } + +uint32_t +Wavefront::getStaticContextSize() +{ + return barCnt.size() * sizeof(int) + sizeof(dynWaveId) + sizeof(maxBarCnt) + + sizeof(oldBarrierCnt) + sizeof(barrierCnt) + sizeof(wgId) + + sizeof(computeUnit->cu_id) + sizeof(barrierId) + sizeof(initMask) + + sizeof(privBase) + sizeof(spillBase) + sizeof(ldsChunk) + + computeUnit->wfSize() * sizeof(ReconvergenceStackEntry); +} # Node ID b64d8e2229aed09863e5807cdda1d058a6f6bd42 # Parent f2ef83f70ee70b033e69072f3a21bc634d5acab8 diff --git a/src/gpu-compute/cl_driver.cc b/src/gpu-compute/cl_driver.cc --- a/src/gpu-compute/cl_driver.cc +++ b/src/gpu-compute/cl_driver.cc @@ -242,6 +242,13 @@ buf.copyOut(tc->getMemProxy()); } break; + case HSA_GET_HW_STATIC_CONTEXT_SIZE: + { + BufferArg buf(buf_addr, sizeof(uint32_t)); + *((uint32_t*)buf.bufferPtr()) = dispatcher->getStaticContextSize(); + buf.copyOut(tc->getMemProxy()); + } + break; default: fatal("ClDriver: bad ioctl %d\n", req); diff --git a/src/gpu-compute/dispatcher.hh b/src/gpu-compute/dispatcher.hh --- a/src/gpu-compute/dispatcher.hh +++ b/src/gpu-compute/dispatcher.hh @@ -159,6 +159,9 @@ int getNumCUs(); int wfSize() const; void setFuncargsSize(int funcargs_size); + + /** Returns the size of the static hardware context of a wavefront */ + uint32_t getStaticContextSize(); }; #endif // __GPU_DISPATCHER_HH__