gpu-compute: Adding ioctl for HW context size

Adding runtime support for determining the memory required by a SIMD engine
when executing a particular wavefront.
This commit is contained in:
Alexandru Dutu 2016-09-16 12:27:56 -04:00
parent 589e13a23b
commit d5c8c5d3db
6 changed files with 35 additions and 2 deletions

View file

@ -242,6 +242,13 @@ ClDriver::ioctl(LiveProcess *process, ThreadContext *tc, unsigned req)
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);

View file

@ -398,3 +398,9 @@ GpuDispatcher::setFuncargsSize(int funcargs_size)
{
shader->funcargs_size = funcargs_size;
}
uint32_t
GPUDispatcher::getStaticContextSize() const
{
return shader->cuList[0]->wfList[0][0]->getStaticContextSize();
}

View file

@ -159,6 +159,9 @@ class GpuDispatcher : public DmaDevice
int getNumCUs();
int wfSize() const;
void setFuncargsSize(int funcargs_size);
/** Returns the size of the static hardware context of a wavefront */
uint32_t getStaticContextSize() const;
};
#endif // __GPU_DISPATCHER_HH__

View file

@ -48,6 +48,7 @@ static const int HSA_GET_CODE = 0x4804;
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

View file

@ -155,9 +155,9 @@ Wavefront::~Wavefront()
}
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 @@ Wavefront::pc(uint32_t new_pc)
{
reconvergenceStack.top()->pc = new_pc;
}
uint32_t
Wavefront::getStaticContextSize() const
{
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);
}

View file

@ -354,6 +354,12 @@ class Wavefront : public SimObject
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() const;
private:
/**
* Stack containing Control Flow Graph nodes (i.e., kernel instructions)