summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES6
-rw-r--r--src/gpgpu-sim/gpu-cache.h13
2 files changed, 19 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index 7b80e58..4bba86b 100644
--- a/CHANGES
+++ b/CHANGES
@@ -11,6 +11,12 @@ Version 3.2.0+edits (development branch) versus 3.2.0
have the same warp_id but different dynamic_warp_ids.
- Added extensions to the cache class hierarchy to allow for the use of custom tag_array objects.
- Added some additional const-correctness
+- Added a check in cache_config to prevent configuration that specifies a
+ writeback cache with allocation-on-fill policy. The current implementation
+ of the allocation-on-fill policy assumes a non-writeback cache and never
+ generates any writeback traffic. Even if the writeback traffic is generated,
+ the configuration (writeback cache + allocation-on-fill) will inevitably lead
+ to deadlock.
- Bug Fixes:
- Applied patch from Kito Cheng to update libopencl for checking NULL error
code pointer.
diff --git a/src/gpgpu-sim/gpu-cache.h b/src/gpgpu-sim/gpu-cache.h
index fb59c01..6dce6b4 100644
--- a/src/gpgpu-sim/gpu-cache.h
+++ b/src/gpgpu-sim/gpu-cache.h
@@ -179,6 +179,19 @@ public:
default: exit_parse_error();
}
+ // detect invalid configuration
+ if (m_alloc_policy == ON_FILL and m_write_policy == WRITE_BACK) {
+ // A writeback cache with allocate-on-fill policy will inevitably lead to deadlock:
+ // The deadlock happens when an incoming cache-fill evicts a dirty
+ // line, generating a writeback request. If the memory subsystem
+ // is congested, the interconnection network may not have
+ // sufficient buffer for the writeback request. This stalls the
+ // incoming cache-fill. The stall may propagate through the memory
+ // subsystem back to the output port of the same core, creating a
+ // deadlock where the wrtieback request and the incoming cache-fill
+ // are stalling each other.
+ assert(0 && "Invalid cache configuration: Writeback cache cannot allocate new line on fill. ");
+ }
}
bool disabled() const { return m_disabled;}
unsigned get_line_sz() const