gpu-compute: use System cache line size in the GPU
authorTony Gutierrez <anthony.gutierrez@amd.com>
Thu, 27 Oct 2016 02:47:47 +0000 (22:47 -0400)
committerTony Gutierrez <anthony.gutierrez@amd.com>
Thu, 27 Oct 2016 02:47:47 +0000 (22:47 -0400)
src/gpu-compute/compute_unit.cc
src/gpu-compute/compute_unit.hh
src/gpu-compute/fetch_unit.cc
src/gpu-compute/shader.cc

index f05ecc1b212826f2b565ff4cd13a9eeb1a65667e..93cffbe1ebdd77e0e0807f0b4fd2002904b8ad94 100644 (file)
@@ -75,7 +75,8 @@ ComputeUnit::ComputeUnit(const Params *p) : MemObject(p), fetchStage(p),
     req_tick_latency(p->mem_req_latency * p->clk_domain->clockPeriod()),
     resp_tick_latency(p->mem_resp_latency * p->clk_domain->clockPeriod()),
     _masterId(p->system->getMasterId(name() + ".ComputeUnit")),
-    lds(*p->localDataStore), globalSeqNum(0),  wavefrontSize(p->wfSize),
+    lds(*p->localDataStore), _cacheLineSize(p->system->cacheLineSize()),
+    globalSeqNum(0), wavefrontSize(p->wfSize),
     kernelLaunchInst(new KernelLaunchStaticInst())
 {
     /**
index 2187bec3846f000a4d06d98c9a3bfae270e7ffe9..4a1c09c27a576c4511a9c742bd642fd11c30c00b 100644 (file)
@@ -390,6 +390,8 @@ class ComputeUnit : public MemObject
     int32_t
     getRefCounter(const uint32_t dispatchId, const uint32_t wgId) const;
 
+    int cacheLineSize() const { return _cacheLineSize; }
+
     bool
     sendToLds(GPUDynInstPtr gpuDynInst) __attribute__((warn_unused_result));
 
@@ -767,6 +769,7 @@ class ComputeUnit : public MemObject
     uint64_t getAndIncSeqNum() { return globalSeqNum++; }
 
   private:
+    const int _cacheLineSize;
     uint64_t globalSeqNum;
     int wavefrontSize;
     GPUStaticInst *kernelLaunchInst;
index 1b19a3223511200e4453f6ce9e5681d4c7672c36..9a059f7fc206a13b00fb99a077da11dfbfeea4c7 100644 (file)
@@ -132,10 +132,10 @@ FetchUnit::initiateFetch(Wavefront *wavefront)
 
     // Since this is an instruction prefetch, if you're split then just finish
     // out the current line.
-    unsigned block_size = RubySystem::getBlockSizeBytes();
+    int block_size = computeUnit->cacheLineSize();
     // check for split accesses
     Addr split_addr = roundDown(vaddr + block_size - 1, block_size);
-    unsigned size = block_size;
+    int size = block_size;
 
     if (split_addr > vaddr) {
         // misaligned access, just grab the rest of the line
index d02f95d2953e73acbad4d722091489ae4567c346..e47edce2c736dcf9b8d14ff59ea6968700e38d58 100644 (file)
@@ -224,7 +224,7 @@ void
 Shader::doFunctionalAccess(RequestPtr req, MemCmd cmd, void *data,
                            bool suppress_func_errors, int cu_id)
 {
-    unsigned block_size = RubySystem::getBlockSizeBytes();
+    int block_size = cuList.at(cu_id)->cacheLineSize();
     unsigned size = req->getSize();
 
     Addr tmp_addr;
@@ -342,7 +342,7 @@ Shader::AccessMem(uint64_t address, void *ptr, uint32_t size, int cu_id,
 {
     uint8_t *data_buf = (uint8_t*)ptr;
 
-    for (ChunkGenerator gen(address, size, RubySystem::getBlockSizeBytes());
+    for (ChunkGenerator gen(address, size, cuList.at(cu_id)->cacheLineSize());
          !gen.done(); gen.next()) {
         Request *req = new Request(0, gen.addr(), gen.size(), 0,
                                    cuList[0]->masterId(), 0, 0, 0);