summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexandru Dutu <alexandru.dutu@amd.com>2016-09-16 12:27:56 -0400
committerAlexandru Dutu <alexandru.dutu@amd.com>2016-09-16 12:27:56 -0400
commitd5c8c5d3db1954ff4e33dade0812fed7b60a9269 (patch)
treebedbecb25c0b1824e25164b287ad2fdddb65dffa /src
parent589e13a23b3969c1137d2170a8638356d0c0fc65 (diff)
downloadgem5-d5c8c5d3db1954ff4e33dade0812fed7b60a9269.tar.xz
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.
Diffstat (limited to 'src')
-rw-r--r--src/gpu-compute/cl_driver.cc7
-rw-r--r--src/gpu-compute/dispatcher.cc6
-rw-r--r--src/gpu-compute/dispatcher.hh3
-rw-r--r--src/gpu-compute/hsa_kernel_info.hh1
-rw-r--r--src/gpu-compute/wavefront.cc14
-rw-r--r--src/gpu-compute/wavefront.hh6
6 files changed, 35 insertions, 2 deletions
diff --git a/src/gpu-compute/cl_driver.cc b/src/gpu-compute/cl_driver.cc
index 6bb6be102..d3950ec04 100644
--- a/src/gpu-compute/cl_driver.cc
+++ b/src/gpu-compute/cl_driver.cc
@@ -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);
diff --git a/src/gpu-compute/dispatcher.cc b/src/gpu-compute/dispatcher.cc
index adc1f51bd..79eb46bbf 100644
--- a/src/gpu-compute/dispatcher.cc
+++ b/src/gpu-compute/dispatcher.cc
@@ -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();
+}
diff --git a/src/gpu-compute/dispatcher.hh b/src/gpu-compute/dispatcher.hh
index e984af494..f5e89e8aa 100644
--- a/src/gpu-compute/dispatcher.hh
+++ b/src/gpu-compute/dispatcher.hh
@@ -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__
diff --git a/src/gpu-compute/hsa_kernel_info.hh b/src/gpu-compute/hsa_kernel_info.hh
index 396913dac..4151695eb 100644
--- 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_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
diff --git a/src/gpu-compute/wavefront.cc b/src/gpu-compute/wavefront.cc
index c73307ac4..76a0bdf9e 100644
--- a/src/gpu-compute/wavefront.cc
+++ b/src/gpu-compute/wavefront.cc
@@ -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);
+}
diff --git a/src/gpu-compute/wavefront.hh b/src/gpu-compute/wavefront.hh
index db2e434a9..4fe66ecfe 100644
--- a/src/gpu-compute/wavefront.hh
+++ b/src/gpu-compute/wavefront.hh
@@ -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)