changeset 7740e0d97d48 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=7740e0d97d48
description:
        ruby: remove sparse memory.
        In my opinion, it creates needless complications in rest of the code.
        Also, this structure hinders the move towards common set of code for
        physical memory controllers.

diffstat:

 src/mem/ruby/structures/DirectoryMemory.cc |   87 +----
 src/mem/ruby/structures/DirectoryMemory.hh |    9 -
 src/mem/ruby/structures/SConscript         |    1 -
 src/mem/ruby/structures/SparseMemory.cc    |  417 -----------------------------
 src/mem/ruby/structures/SparseMemory.hh    |   98 ------
 src/mem/ruby/system/System.cc              |   30 +-
 src/mem/ruby/system/System.hh              |    3 -
 7 files changed, 22 insertions(+), 623 deletions(-)

diffs (truncated from 803 to 300 lines):

diff -r 7a3ad4b09ce4 -r 7740e0d97d48 src/mem/ruby/structures/DirectoryMemory.cc
--- a/src/mem/ruby/structures/DirectoryMemory.cc        Thu Nov 06 05:41:44 
2014 -0600
+++ b/src/mem/ruby/structures/DirectoryMemory.cc        Thu Nov 06 05:42:20 
2014 -0600
@@ -47,8 +47,6 @@
     m_size_bytes = p->size;
     m_size_bits = floorLog2(m_size_bytes);
     m_num_entries = 0;
-    m_use_map = p->use_map;
-    m_map_levels = p->map_levels;
     m_numa_high_bit = p->numa_high_bit;
 }
 
@@ -56,16 +54,10 @@
 DirectoryMemory::init()
 {
     m_num_entries = m_size_bytes / RubySystem::getBlockSizeBytes();
-
-    if (m_use_map) {
-        m_sparseMemory = new SparseMemory(m_map_levels);
-        g_system_ptr->registerSparseMemory(m_sparseMemory);
-    } else {
-        m_entries = new AbstractEntry*[m_num_entries];
-        for (int i = 0; i < m_num_entries; i++)
-            m_entries[i] = NULL;
-        m_ram = g_system_ptr->getMemoryVector();
-    }
+    m_entries = new AbstractEntry*[m_num_entries];
+    for (int i = 0; i < m_num_entries; i++)
+        m_entries[i] = NULL;
+    m_ram = g_system_ptr->getMemoryVector();
 
     m_num_directories++;
     m_num_directories_bits = ceilLog2(m_num_directories);
@@ -80,16 +72,12 @@
 DirectoryMemory::~DirectoryMemory()
 {
     // free up all the directory entries
-    if (m_entries != NULL) {
-        for (uint64 i = 0; i < m_num_entries; i++) {
-            if (m_entries[i] != NULL) {
-                delete m_entries[i];
-            }
+    for (uint64 i = 0; i < m_num_entries; i++) {
+        if (m_entries[i] != NULL) {
+            delete m_entries[i];
         }
-        delete [] m_entries;
-    } else if (m_use_map) {
-        delete m_sparseMemory;
     }
+    delete [] m_entries;
 }
 
 uint64
@@ -130,13 +118,9 @@
     assert(isPresent(address));
     DPRINTF(RubyCache, "Looking up address: %s\n", address);
 
-    if (m_use_map) {
-        return m_sparseMemory->lookup(address);
-    } else {
-        uint64_t idx = mapAddressToLocalIdx(address);
-        assert(idx < m_num_entries);
-        return m_entries[idx];
-    }
+    uint64_t idx = mapAddressToLocalIdx(address);
+    assert(idx < m_num_entries);
+    return m_entries[idx];
 }
 
 AbstractEntry*
@@ -146,60 +130,21 @@
     uint64 idx;
     DPRINTF(RubyCache, "Looking up address: %s\n", address);
 
-    if (m_use_map) {
-        m_sparseMemory->add(address, entry);
-        entry->changePermission(AccessPermission_Read_Write);
-    } else {
-        idx = mapAddressToLocalIdx(address);
-        assert(idx < m_num_entries);
-        entry->getDataBlk().assign(m_ram->getBlockPtr(address));
-        entry->changePermission(AccessPermission_Read_Only);
-        m_entries[idx] = entry;
-    }
+    idx = mapAddressToLocalIdx(address);
+    assert(idx < m_num_entries);
+    entry->getDataBlk().assign(m_ram->getBlockPtr(address));
+    entry->changePermission(AccessPermission_Read_Only);
+    m_entries[idx] = entry;
 
     return entry;
 }
 
 void
-DirectoryMemory::invalidateBlock(PhysAddress address)
-{
-    if (m_use_map) {
-        assert(m_sparseMemory->exist(address));
-        m_sparseMemory->remove(address);
-    }
-#if 0
-    else {
-        assert(isPresent(address));
-
-        int64 index = address.memoryModuleIndex();
-
-        if (index < 0 || index > m_size) {
-            ERROR_MSG("Directory Memory Assertion: "
-                      "accessing memory out of range.");
-        }
-
-        if (m_entries[index] != NULL){
-            delete m_entries[index];
-            m_entries[index] = NULL;
-        }
-    }
-#endif
-}
-
-void
 DirectoryMemory::print(ostream& out) const
 {
 }
 
 void
-DirectoryMemory::regStats()
-{
-    if (m_use_map) {
-        m_sparseMemory->regStats(name());
-    }
-}
-
-void
 DirectoryMemory::recordRequestType(DirectoryRequestType requestType) {
     DPRINTF(RubyStats, "Recorded statistic: %s\n",
             DirectoryRequestType_to_string(requestType));
diff -r 7a3ad4b09ce4 -r 7740e0d97d48 src/mem/ruby/structures/DirectoryMemory.hh
--- a/src/mem/ruby/structures/DirectoryMemory.hh        Thu Nov 06 05:41:44 
2014 -0600
+++ b/src/mem/ruby/structures/DirectoryMemory.hh        Thu Nov 06 05:42:20 
2014 -0600
@@ -36,7 +36,6 @@
 #include "mem/ruby/common/Address.hh"
 #include "mem/ruby/slicc_interface/AbstractEntry.hh"
 #include "mem/ruby/structures/MemoryVector.hh"
-#include "mem/ruby/structures/SparseMemory.hh"
 #include "params/RubyDirectoryMemory.hh"
 #include "sim/sim_object.hh"
 
@@ -52,7 +51,6 @@
     uint64 mapAddressToLocalIdx(PhysAddress address);
     static uint64 mapAddressToDirectoryVersion(PhysAddress address);
 
-    bool isSparseImplementation() { return m_use_map; }
     uint64 getSize() { return m_size_bytes; }
 
     bool isPresent(PhysAddress address);
@@ -60,11 +58,7 @@
     AbstractEntry* allocate(const PhysAddress& address,
                             AbstractEntry* new_entry);
 
-    void invalidateBlock(PhysAddress address);
-
     void print(std::ostream& out) const;
-    void regStats();
-
     void recordRequestType(DirectoryRequestType requestType);
 
   private:
@@ -88,9 +82,6 @@
     static int m_numa_high_bit;
 
     MemoryVector* m_ram;
-    SparseMemory* m_sparseMemory;
-    bool m_use_map;
-    int m_map_levels;
 };
 
 inline std::ostream&
diff -r 7a3ad4b09ce4 -r 7740e0d97d48 src/mem/ruby/structures/SConscript
--- a/src/mem/ruby/structures/SConscript        Thu Nov 06 05:41:44 2014 -0600
+++ b/src/mem/ruby/structures/SConscript        Thu Nov 06 05:42:20 2014 -0600
@@ -41,7 +41,6 @@
 SimObject('WireBuffer.py')
 
 Source('DirectoryMemory.cc')
-Source('SparseMemory.cc')
 Source('CacheMemory.cc')
 Source('MemoryControl.cc')
 Source('WireBuffer.cc')
diff -r 7a3ad4b09ce4 -r 7740e0d97d48 src/mem/ruby/structures/SparseMemory.cc
--- a/src/mem/ruby/structures/SparseMemory.cc   Thu Nov 06 05:41:44 2014 -0600
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,417 +0,0 @@
-/*
- * Copyright (c) 2009 Advanced Micro Devices, Inc.
- * Copyright (c) 2012 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <queue>
-
-#include "debug/RubyCache.hh"
-#include "mem/ruby/structures/SparseMemory.hh"
-#include "mem/ruby/system/System.hh"
-
-using namespace std;
-
-SparseMemory::SparseMemory(int number_of_levels)
-{
-    int even_level_bits;
-    int extra;
-    m_total_number_of_bits = RubySystem::getMemorySizeBits()
-        - RubySystem::getBlockSizeBits();;
-
-    m_number_of_levels = number_of_levels;
-
-    //
-    // Create the array that describes the bits per level
-    //
-    m_number_of_bits_per_level = new int[m_number_of_levels];
-    even_level_bits = m_total_number_of_bits / m_number_of_levels;
-    extra = m_total_number_of_bits % m_number_of_levels;
-    for (int level = 0; level < m_number_of_levels; level++) {
-        if (level < extra)
-            m_number_of_bits_per_level[level] = even_level_bits + 1;
-        else
-            m_number_of_bits_per_level[level] = even_level_bits;
-    }
-    m_map_head = new SparseMapType;
-}
-
-SparseMemory::~SparseMemory()
-{
-    recursivelyRemoveTables(m_map_head, 0);
-    delete m_map_head;
-    delete [] m_number_of_bits_per_level;
-}
-
-// Recursively search table hierarchy for the lowest level table.
-// Delete the lowest table first, the tables above
-void
-SparseMemory::recursivelyRemoveTables(SparseMapType* curTable, int curLevel)
-{
-    SparseMapType::iterator iter;
-
-    for (iter = curTable->begin(); iter != curTable->end(); iter++) {
-        SparseMemEntry entry = (*iter).second;
-
-        if (curLevel != (m_number_of_levels - 1)) {
-            // If the not at the last level, analyze those lower level
-            // tables first, then delete those next tables
-            SparseMapType* nextTable = (SparseMapType*)(entry);
-            recursivelyRemoveTables(nextTable, (curLevel + 1));
-            delete nextTable;
-        } else {
-            // If at the last level, delete the directory entry
-            delete (AbstractEntry*)(entry);
-        }
-        entry = NULL;
-    }
-
-    // Once all entries have been deleted, erase the entries
-    curTable->erase(curTable->begin(), curTable->end());
-}
-
-// tests to see if an address is present in the memory
-bool
-SparseMemory::exist(const Address& address) const
-{
-    SparseMapType* curTable = m_map_head;
-    Address curAddress;
-
-    // Initiallize the high bit to be the total number of bits plus
-    // the block offset.  However the highest bit index is one less
-    // than this value.
-    int highBit = m_total_number_of_bits + RubySystem::getBlockSizeBits();
-    int lowBit;
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to