mem-ruby: Account for misaligned accesses in GPUCoalescer

Previously, we assumed that the maximum number of requests that would be
issued by an instruction was equal to the number of threads that were
active for that instruction.

However, if a thread has an access that crosses a cache line, that
thread has a misaligned access, and needs to request both cache lines.

This patch takes that into account by checking the status vector for
each thread in that instruction to determine the number of requests.

Change-Id: I1994962c46d504b48654dbd22bcd786c9f382fd9
Tested-by: kokoro <>
Reviewed-by: Matt Sinclair <>
Reviewed-by: Matthew Poremba <>
Maintainer: Matt Sinclair <>
diff --git a/src/mem/ruby/system/ b/src/mem/ruby/system/
index c00e7c0..2390ba6 100644
--- a/src/mem/ruby/system/
+++ b/src/mem/ruby/system/
@@ -645,7 +645,10 @@
         // of the exec_mask.
         int num_packets = 1;
         if (!m_usingRubyTester) {
-            num_packets = getDynInst(pkt)->exec_mask.count();
+            num_packets = 0;
+            for (int i = 0; i < TheGpuISA::NumVecElemPerVecReg; i++) {
+                num_packets += getDynInst(pkt)->getLaneStatus(i);
+            }
         // the pkt is temporarily stored in the uncoalesced table until