ruby: speed up function used for cache walks
authorDavid Hashe <david.hashe@amd.com>
Mon, 20 Jul 2015 14:15:18 +0000 (09:15 -0500)
committerDavid Hashe <david.hashe@amd.com>
Mon, 20 Jul 2015 14:15:18 +0000 (09:15 -0500)
This patch adds a few helpful functions that allow .sm files to directly
invalidate all cache blocks using a trigger queue rather than rely on each
individual cache block to be invalidated via requests from the mandatory
queue.

src/mem/protocol/RubySlicc_Types.sm
src/mem/ruby/structures/CacheMemory.cc
src/mem/ruby/structures/CacheMemory.hh

index 88b9839bb4b426ebc475147639e415380c1ba47b..51f99b60383968f2c926b03674b60a5d4a1673fa 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 1999-2005 Mark D. Hill and David A. Wood
+ * Copyright (c) 2013 Advanced Micro Devices, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -155,6 +156,10 @@ structure (CacheMemory, external = "yes") {
   void recordRequestType(CacheRequestType);
   bool checkResourceAvailable(CacheResourceType, Address);
 
+  int getCacheSize();
+  int getNumBlocks();
+  Address getAddressAtIdx(int);
+
   Scalar demand_misses;
   Scalar demand_hits;
 }
index 047c024c94216b71f65c5ced14f9078a0bf8ed94..486b5ae97a6ef51b8bee0eb0b41ad34391873ad6 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood
+ * Copyright (c) 2013 Advanced Micro Devices, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -134,6 +135,29 @@ CacheMemory::findTagInSetIgnorePermissions(int64 cacheSet,
     return -1; // Not found
 }
 
+// Given an unique cache block identifier (idx): return the valid address
+// stored by the cache block.  If the block is invalid/notpresent, the
+// function returns the 0 address
+Address
+CacheMemory::getAddressAtIdx(int idx) const
+{
+    Address tmp(0);
+
+    int set = idx / m_cache_assoc;
+    assert(set < m_cache_num_sets);
+
+    int way = idx - set * m_cache_assoc;
+    assert (way < m_cache_assoc);
+
+    AbstractCacheEntry* entry = m_cache[set][way];
+    if (entry == NULL ||
+        entry->m_Permission == AccessPermission_Invalid ||
+        entry->m_Permission == AccessPermission_NotPresent) {
+        return tmp;
+    }
+    return entry->m_Address;
+}
+
 bool
 CacheMemory::tryCacheAccess(const Address& address, RubyRequestType type,
                             DataBlock*& data_ptr)
index a777538b2994456703685c14e62d9869a36464fe..82bb65776e40c452dbcb881459c6f8749026829f 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood
+ * Copyright (c) 2013 Advanced Micro Devices, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -131,6 +132,10 @@ class CacheMemory : public SimObject
     Stats::Scalar numTagArrayStalls;
     Stats::Scalar numDataArrayStalls;
 
+    int getCacheSize() const { return m_cache_size; }
+    int getNumBlocks() const { return m_cache_num_sets * m_cache_assoc; }
+    Address getAddressAtIdx(int idx) const;
+
   private:
     // convert a Address to its location in the cache
     int64 addressToCacheSet(const Address& address) const;