From 701f026ba57dda2c7c567ffedd0730bdcff9dceb Mon Sep 17 00:00:00 2001 From: Tony Gutierrez Date: Thu, 14 Jun 2018 15:22:03 -0400 Subject: [PATCH] gpu-compute: Fix LDS out-of-bounds behavior The LDS is capable of handling out-of-bounds accesses, that is, accesses that are outside the bounds of the chunk allocated to a WG. Currently, the simulator asserts on these accesses. This patch changes the behavior of the LDS to return 0 for reads and dropping writes that are out-of-bounds. Change-Id: I5f467d0f52113e8565e1a3029e82fb89cc6f07ea Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/29940 Maintainer: Anthony Gutierrez Tested-by: kokoro Reviewed-by: Matt Sinclair --- src/gpu-compute/lds_state.hh | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/gpu-compute/lds_state.hh b/src/gpu-compute/lds_state.hh index 58171e30c..d793f0f9e 100644 --- a/src/gpu-compute/lds_state.hh +++ b/src/gpu-compute/lds_state.hh @@ -69,9 +69,14 @@ class LdsChunk T read(const uint32_t index) { - fatal_if(!chunk.size(), "cannot read from an LDS chunk of size 0"); - fatal_if(index >= chunk.size(), "out-of-bounds access to an LDS " - "chunk"); + /** + * For reads that are outside the bounds of the LDS + * chunk allocated to this WG we return 0. + */ + if (index >= chunk.size()) { + return (T)0; + } + T *p0 = (T *) (&(chunk.at(index))); return *p0; } @@ -83,9 +88,14 @@ class LdsChunk void write(const uint32_t index, const T value) { - fatal_if(!chunk.size(), "cannot write to an LDS chunk of size 0"); - fatal_if(index >= chunk.size(), "out-of-bounds access to an LDS " - "chunk"); + /** + * Writes that are outside the bounds of the LDS + * chunk allocated to this WG are dropped. + */ + if (index >= chunk.size()) { + return; + } + T *p0 = (T *) (&(chunk.at(index))); *p0 = value; } -- 2.30.2