[gem5-dev] Change in gem5/gem5[develop]: mem-ruby: MESI_Three_level prefetcher support

2020-05-02 Thread Pouya Fotouhi (Gerrit) via gem5-dev
Pouya Fotouhi has submitted this change. (  
https://gem5-review.googlesource.com/c/public/gem5/+/27715 )


Change subject: mem-ruby: MESI_Three_level prefetcher support
..

mem-ruby: MESI_Three_level prefetcher support

Add support for the Ruby stride prefetcher to MESI_Three_Level.

Change-Id: Id68935e2a7d3ccd0e22a59f43a15f167410632a2
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/27715
Reviewed-by: Bradford Beckmann 
Maintainer: Bradford Beckmann 
Tested-by: kokoro 
---
M configs/ruby/MESI_Three_Level.py
M src/mem/ruby/protocol/MESI_Three_Level-L0cache.sm
M src/mem/ruby/protocol/MESI_Three_Level-L1cache.sm
M src/mem/ruby/protocol/MESI_Three_Level-msg.sm
M src/mem/ruby/protocol/MESI_Two_Level-L2cache.sm
M src/mem/ruby/protocol/RubySlicc_Types.sm
M src/mem/ruby/structures/CacheMemory.hh
M src/mem/ruby/structures/TBETable.hh
8 files changed, 386 insertions(+), 3 deletions(-)

Approvals:
  Bradford Beckmann: Looks good to me, approved; Looks good to me, approved
  kokoro: Regressions pass



diff --git a/configs/ruby/MESI_Three_Level.py  
b/configs/ruby/MESI_Three_Level.py

index fdebea4..0e9ef09 100644
--- a/configs/ruby/MESI_Three_Level.py
+++ b/configs/ruby/MESI_Three_Level.py
@@ -53,6 +53,8 @@
 parser.add_option("--l0_transitions_per_cycle", type="int", default=32)
 parser.add_option("--l1_transitions_per_cycle", type="int", default=32)
 parser.add_option("--l2_transitions_per_cycle", type="int", default=4)
+parser.add_option("--enable-prefetch", action="store_true",  
default=False,\

+help="Enable Ruby hardware prefetcher")
 return

 def create_system(options, full_system, system, dma_ports, bootmem,
@@ -118,10 +120,22 @@
 else:
 clk_domain = system.cpu[i].clk_domain

+# Ruby prefetcher
+prefetcher = RubyPrefetcher.Prefetcher(
+num_streams=16,
+unit_filter = 256,
+nonunit_filter = 256,
+train_misses = 5,
+num_startup_pfs = 4,
+cross_page = False
+)
+
 l0_cntrl = L0Cache_Controller(
version = i * num_cpus_per_cluster + j,
Icache = l0i_cache, Dcache = l0d_cache,
transitions_per_cycle =  
options.l0_transitions_per_cycle,

+   prefetcher = prefetcher,
+   enable_prefetch = options.enable_prefetch,
send_evictions = send_evicts(options),
clk_domain = clk_domain,
ruby_system = ruby_system)
@@ -159,6 +173,7 @@
 l1_cntrl_nodes.append(l1_cntrl)

 # Connect the L0 and L1 controllers
+l0_cntrl.prefetchQueue = MessageBuffer()
 l0_cntrl.mandatoryQueue = MessageBuffer()
 l0_cntrl.bufferToL1 = MessageBuffer(ordered = True)
 l1_cntrl.bufferFromL0 = l0_cntrl.bufferToL1
diff --git a/src/mem/ruby/protocol/MESI_Three_Level-L0cache.sm  
b/src/mem/ruby/protocol/MESI_Three_Level-L0cache.sm

index 14fb07a..da89bf5 100644
--- a/src/mem/ruby/protocol/MESI_Three_Level-L0cache.sm
+++ b/src/mem/ruby/protocol/MESI_Three_Level-L0cache.sm
@@ -46,6 +46,9 @@
Cycles response_latency := 2;
bool send_evictions;

+   Prefetcher * prefetcher;
+   bool enable_prefetch := "False";
+
// From this node's L0 cache to the network
MessageBuffer * bufferToL1, network="To";

@@ -54,6 +57,9 @@

// Message queue between this controller and the processor
MessageBuffer * mandatoryQueue;
+
+   // Request Buffer for prefetches
+   MessageBuffer * prefetchQueue;
 {
   // STATES
   state_declaration(State, desc="Cache states", default="L0Cache_State_I")  
{

@@ -92,6 +98,11 @@
 // processor needs to write to it. So, the controller has requested for
 // write permission.
 SM, AccessPermission:Read_Only, desc="Issued GETX, have not seen  
response yet";

+
+// Transient states in which block is being prefetched
+PF_Inst_IS, AccessPermission:Busy, desc="Issued GETS, have not seen  
response yet";
+PF_IS, AccessPermission:Busy, desc="Issued GETS, have not seen  
response yet";
+PF_IE, AccessPermission:Busy, desc="Issued GETX, have not seen  
response yet";

   }

   // EVENTS
@@ -123,6 +134,12 @@
 WB_Ack,desc="Ack for replacement";

 Failed_SC,desc="Store conditional request that will fail";
+
+// Prefetch events (generated by prefetcher)
+PF_L0_Replacement, desc="L0 Replacement caused by pretcher",  
format="!pr";

+PF_Load, desc="Load request from prefetcher";
+PF_Ifetch,   desc="Instruction fetch request from prefetcher";
+PF_Store,desc="Exclusive load request from prefetcher";
   }

   // TYPES
@@ -132,6 +149,7 @@
 State CacheState,desc="cache state";
 DataBlock DataBlk,   desc="data for the block";
 

[gem5-dev] Change in gem5/gem5[develop]: mem-ruby: MESI_Three_level prefetcher support

2020-04-14 Thread Giacomo Travaglini (Gerrit)

Hello Timothy Hayes,

I'd like you to do a code review. Please visit

https://gem5-review.googlesource.com/c/public/gem5/+/27715

to review the following change.


Change subject: mem-ruby: MESI_Three_level prefetcher support
..

mem-ruby: MESI_Three_level prefetcher support

Add support for the Ruby stride prefetcher to MESI_Three_Level. This patch
also allows safely crossing page boundaries by determining an address is
bad and cannot be mapped to a memory controller.

Change-Id: Id68935e2a7d3ccd0e22a59f43a15f167410632a2
---
M configs/ruby/MESI_Three_Level.py
M src/mem/ruby/protocol/MESI_Three_Level-L0cache.sm
M src/mem/ruby/protocol/MESI_Three_Level-L1cache.sm
M src/mem/ruby/protocol/MESI_Three_Level-msg.sm
M src/mem/ruby/protocol/MESI_Two_Level-L2cache.sm
M src/mem/ruby/protocol/RubySlicc_Types.sm
M src/mem/ruby/structures/CacheMemory.hh
M src/mem/ruby/structures/TBETable.hh
8 files changed, 408 insertions(+), 3 deletions(-)



diff --git a/configs/ruby/MESI_Three_Level.py  
b/configs/ruby/MESI_Three_Level.py

index c05dca3..c6ca85f 100644
--- a/configs/ruby/MESI_Three_Level.py
+++ b/configs/ruby/MESI_Three_Level.py
@@ -53,6 +53,8 @@
 parser.add_option("--l0_transitions_per_cycle", type="int", default=32)
 parser.add_option("--l1_transitions_per_cycle", type="int", default=32)
 parser.add_option("--l2_transitions_per_cycle", type="int", default=4)
+parser.add_option("--disable-prefetch", action="store_true",\
+  help="Disable Ruby hardware prefetcher")
 return

 def create_system(options, full_system, system, dma_ports, bootmem,
@@ -118,10 +120,22 @@
 else:
 clk_domain = system.cpu[i].clk_domain

+# Ruby prefetcher
+prefetcher = RubyPrefetcher.Prefetcher(
+num_streams=16,
+unit_filter = 256,
+nonunit_filter = 256,
+train_misses = 5,
+num_startup_pfs = 4,
+cross_page = True
+)
+
 l0_cntrl = L0Cache_Controller(
version = i * num_cpus_per_cluster + j,
Icache = l0i_cache, Dcache = l0d_cache,
transitions_per_cycle =  
options.l0_transitions_per_cycle,

+   prefetcher = prefetcher,
+   enable_prefetch = not options.disable_prefetch,
send_evictions = send_evicts(options),
clk_domain = clk_domain,
ruby_system = ruby_system)
@@ -159,6 +173,7 @@
 l1_cntrl_nodes.append(l1_cntrl)

 # Connect the L0 and L1 controllers
+l0_cntrl.prefetchQueue = MessageBuffer()
 l0_cntrl.mandatoryQueue = MessageBuffer()
 l0_cntrl.bufferToL1 = MessageBuffer(ordered = True)
 l1_cntrl.bufferFromL0 = l0_cntrl.bufferToL1
diff --git a/src/mem/ruby/protocol/MESI_Three_Level-L0cache.sm  
b/src/mem/ruby/protocol/MESI_Three_Level-L0cache.sm

index 9844fec..12fa578 100644
--- a/src/mem/ruby/protocol/MESI_Three_Level-L0cache.sm
+++ b/src/mem/ruby/protocol/MESI_Three_Level-L0cache.sm
@@ -46,6 +46,9 @@
Cycles response_latency := 2;
bool send_evictions;

+   Prefetcher * prefetcher;
+   bool enable_prefetch := "True";
+
// From this node's L0 cache to the network
MessageBuffer * bufferToL1, network="To";

@@ -54,6 +57,9 @@

// Message queue between this controller and the processor
MessageBuffer * mandatoryQueue;
+
+   // Request Buffer for prefetches
+   MessageBuffer * prefetchQueue;
 {
   // STATES
   state_declaration(State, desc="Cache states", default="L0Cache_State_I")  
{

@@ -92,6 +98,11 @@
 // processor needs to write to it. So, the controller has requested for
 // write permission.
 SM, AccessPermission:Read_Only, desc="Issued GETX, have not seen  
response yet";

+
+// Transient states in which block is being prefetched
+PF_Inst_IS, AccessPermission:Busy, desc="Issued GETS, have not seen  
response yet";
+PF_IS, AccessPermission:Busy, desc="Issued GETS, have not seen  
response yet";
+PF_IE, AccessPermission:Busy, desc="Issued GETX, have not seen  
response yet";

   }

   // EVENTS
@@ -123,6 +134,13 @@
 WB_Ack,desc="Ack for replacement";

 Failed_SC,desc="Store conditional request that will fail";
+
+// Prefetch events (generated by prefetcher)
+PF_L0_Replacement, desc="L0 Replacement caused by pretcher",  
format="!pr";

+PF_Load, desc="Load request from prefetcher";
+PF_Ifetch,   desc="Instruction fetch request from prefetcher";
+PF_Store,desc="Exclusive load request from prefetcher";
+PF_Bad_Addr, desc="Throw away prefetch request due to bad address  
generation";

   }

   // TYPES
@@ -132,6 +150,7 @@
 State CacheState,desc="cache state";
 DataBlock DataBlk,   desc="data for the block";