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()); buf.copyOut(tc->getMemProxy());
} }
break; 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: default:
fatal("ClDriver: bad ioctl %d\n", req); fatal("ClDriver: bad ioctl %d\n", req);

View file

@ -398,3 +398,9 @@ GpuDispatcher::setFuncargsSize(int funcargs_size)
{ {
shader->funcargs_size = 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 getNumCUs();
int wfSize() const; int wfSize() const;
void setFuncargsSize(int funcargs_size); void setFuncargsSize(int funcargs_size);
/** Returns the size of the static hardware context of a wavefront */
uint32_t getStaticContextSize() const;
}; };
#endif // __GPU_DISPATCHER_HH__ #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_READONLY_DATA = 0x4805;
static const int HSA_GET_CU_CNT = 0x4806; static const int HSA_GET_CU_CNT = 0x4806;
static const int HSA_GET_VSZ = 0x4807; 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 // Return value (via buffer ptr) for HSA_GET_SIZES
struct HsaDriverSizes struct HsaDriverSizes

View file

@ -155,9 +155,9 @@ Wavefront::~Wavefront()
} }
void 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; basePtr = _base_ptr;
status = S_RUNNING; status = S_RUNNING;
} }
@ -931,3 +931,13 @@ Wavefront::pc(uint32_t new_pc)
{ {
reconvergenceStack.top()->pc = 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(); 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: private:
/** /**
* Stack containing Control Flow Graph nodes (i.e., kernel instructions) * Stack containing Control Flow Graph nodes (i.e., kernel instructions)