ruby: remove sparse memory.
authorNilay Vaish <nilay@cs.wisc.edu>
Thu, 6 Nov 2014 11:42:20 +0000 (05:42 -0600)
committerNilay Vaish <nilay@cs.wisc.edu>
Thu, 6 Nov 2014 11:42:20 +0000 (05:42 -0600)
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.

src/mem/ruby/structures/DirectoryMemory.cc
src/mem/ruby/structures/DirectoryMemory.hh
src/mem/ruby/structures/SConscript
src/mem/ruby/structures/SparseMemory.cc [deleted file]
src/mem/ruby/structures/SparseMemory.hh [deleted file]
src/mem/ruby/system/System.cc
src/mem/ruby/system/System.hh

index 2f972674f4bc2da9e60e048958d0fc9271e70ff4..94775aa7860db381aa01955581f7dc91ed326856 100644 (file)
@@ -47,8 +47,6 @@ DirectoryMemory::DirectoryMemory(const Params *p)
     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 @@ void
 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::init()
 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 @@ DirectoryMemory::lookup(PhysAddress address)
     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,59 +130,20 @@ DirectoryMemory::allocate(const PhysAddress& address, AbstractEntry* entry)
     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",
index db98cc8389a613da4866bf443b86da88f4c26a4e..523f165316e7f0f81fe44fec72b844a72b03b7bd 100644 (file)
@@ -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 @@ class DirectoryMemory : public SimObject
     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 @@ class DirectoryMemory : public SimObject
     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 @@ class DirectoryMemory : public SimObject
     static int m_numa_high_bit;
 
     MemoryVector* m_ram;
-    SparseMemory* m_sparseMemory;
-    bool m_use_map;
-    int m_map_levels;
 };
 
 inline std::ostream&
index a5abbf4491e6ac56d4522466ad4cd1894c21495f..dee5769d3dee38f99e954ff492115b30dbc984aa 100644 (file)
@@ -41,7 +41,6 @@ SimObject('RubyPrefetcher.py')
 SimObject('WireBuffer.py')
 
 Source('DirectoryMemory.cc')
-Source('SparseMemory.cc')
 Source('CacheMemory.cc')
 Source('MemoryControl.cc')
 Source('WireBuffer.cc')
diff --git a/src/mem/ruby/structures/SparseMemory.cc b/src/mem/ruby/structures/SparseMemory.cc
deleted file mode 100644 (file)
index a637905..0000000
+++ /dev/null
@@ -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;
-    assert(address == line_address(address));
-    DPRINTF(RubyCache, "address: %s\n", address);
-
-    for (int level = 0; level < m_number_of_levels; level++) {
-        // Create the appropriate sub address for this level
-        // Note: that set Address is inclusive of the specified range,
-        // thus the high bit is one less than the total number of bits
-        // used to create the address.
-        lowBit = highBit - m_number_of_bits_per_level[level];
-        curAddress.setAddress(address.bitSelect(lowBit, highBit - 1));
-
-        DPRINTF(RubyCache, "level: %d, lowBit: %d, highBit - 1: %d, "
-                "curAddress: %s\n",
-                level, lowBit, highBit - 1, curAddress);
-
-        // Adjust the highBit value for the next level
-        highBit -= m_number_of_bits_per_level[level];
-
-        // If the address is found, move on to the next level.
-        // Otherwise, return not found
-        if (curTable->count(curAddress) != 0) {
-            curTable = (SparseMapType*)((*curTable)[curAddress]);
-        } else {
-            DPRINTF(RubyCache, "Not found\n");
-            return false;
-        }
-    }
-
-    DPRINTF(RubyCache, "Entry found\n");
-    return true;
-}
-
-// add an address to memory
-void
-SparseMemory::add(const Address& address, AbstractEntry* entry)
-{
-    assert(address == line_address(address));
-    assert(!exist(address));
-
-    m_total_adds++;
-
-    Address curAddress;
-    SparseMapType* curTable = m_map_head;
-
-    // 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;
-    void* newEntry = NULL;
-
-    for (int level = 0; level < m_number_of_levels; level++) {
-        // create the appropriate address for this level
-        // Note: that set Address is inclusive of the specified range,
-        // thus the high bit is one less than the total number of bits
-        // used to create the address.
-        lowBit = highBit - m_number_of_bits_per_level[level];
-        curAddress.setAddress(address.bitSelect(lowBit, highBit - 1));
-
-        // Adjust the highBit value for the next level
-        highBit -= m_number_of_bits_per_level[level];
-
-        // if the address exists in the cur table, move on.  Otherwise
-        // create a new table.
-        if (curTable->count(curAddress) != 0) {
-            curTable = (SparseMapType*)((*curTable)[curAddress]);
-        } else {
-            m_adds_per_level[level]++;
-
-            // if the last level, add a directory entry.  Otherwise add a map.
-            if (level == (m_number_of_levels - 1)) {
-                entry->getDataBlk().clear();
-                newEntry = (void*)entry;
-            } else {
-                SparseMapType* tempMap = new SparseMapType;
-                newEntry = (void*)(tempMap);
-            }
-
-            // Create the pointer container SparseMemEntry and add it
-            // to the table.
-            (*curTable)[curAddress] = newEntry;
-
-            // Move to the next level of the heirarchy
-            curTable = (SparseMapType*)newEntry;
-        }
-    }
-
-    assert(exist(address));
-    return;
-}
-
-// recursively search table hierarchy for the lowest level table.
-// remove the lowest entry and any empty tables above it.
-int
-SparseMemory::recursivelyRemoveLevels(const Address& address,
-                                      CurNextInfo& curInfo)
-{
-    Address curAddress;
-    CurNextInfo nextInfo;
-    SparseMemEntry entry;
-
-    // create the appropriate address for this level
-    // Note: that set Address is inclusive of the specified range,
-    // thus the high bit is one less than the total number of bits
-    // used to create the address.
-    curAddress.setAddress(address.bitSelect(curInfo.lowBit,
-                                            curInfo.highBit - 1));
-
-    DPRINTF(RubyCache, "address: %s, curInfo.level: %d, curInfo.lowBit: %d, "
-            "curInfo.highBit - 1: %d, curAddress: %s\n",
-            address, curInfo.level, curInfo.lowBit,
-            curInfo.highBit - 1, curAddress);
-
-    assert(curInfo.curTable->count(curAddress) != 0);
-
-    entry = (*(curInfo.curTable))[curAddress];
-
-    if (curInfo.level < (m_number_of_levels - 1)) {
-        // set up next level's info
-        nextInfo.curTable = (SparseMapType*)(entry);
-        nextInfo.level = curInfo.level + 1;
-
-        nextInfo.highBit = curInfo.highBit -
-            m_number_of_bits_per_level[curInfo.level];
-
-        nextInfo.lowBit = curInfo.lowBit -
-            m_number_of_bits_per_level[curInfo.level + 1];
-
-        // recursively search the table hierarchy
-        int tableSize = recursivelyRemoveLevels(address, nextInfo);
-
-        // If this table below is now empty, we must delete it and
-        // erase it from our table.
-        if (tableSize == 0) {
-            m_removes_per_level[curInfo.level]++;
-            delete nextInfo.curTable;
-            entry = NULL;
-            curInfo.curTable->erase(curAddress);
-        }
-    } else {
-        // if this is the last level, we have reached the Directory
-        // Entry and thus we should delete it including the
-        // SparseMemEntry container struct.
-        delete (AbstractEntry*)(entry);
-        entry = NULL;
-        curInfo.curTable->erase(curAddress);
-        m_removes_per_level[curInfo.level]++;
-    }
-    return curInfo.curTable->size();
-}
-
-// remove an entry from the table
-void
-SparseMemory::remove(const Address& address)
-{
-    assert(address == line_address(address));
-    assert(exist(address));
-
-    m_total_removes++;
-
-    CurNextInfo nextInfo;
-
-    // Initialize table pointer and level value
-    nextInfo.curTable = m_map_head;
-    nextInfo.level = 0;
-
-    // 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.
-    nextInfo.highBit = m_total_number_of_bits + RubySystem::getBlockSizeBits();
-    nextInfo.lowBit = nextInfo.highBit - m_number_of_bits_per_level[0];;
-
-    // recursively search the table hierarchy for empty tables
-    // starting from the level 0.  Note we do not check the return
-    // value because the head table is never deleted;
-    recursivelyRemoveLevels(address, nextInfo);
-
-    assert(!exist(address));
-    return;
-}
-
-// looks an address up in memory
-AbstractEntry*
-SparseMemory::lookup(const Address& address)
-{
-    assert(address == line_address(address));
-
-    Address curAddress;
-    SparseMapType* curTable = m_map_head;
-    AbstractEntry* entry = NULL;
-
-    // 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;
-
-    for (int level = 0; level < m_number_of_levels; level++) {
-        // create the appropriate address for this level
-        // Note: that set Address is inclusive of the specified range,
-        // thus the high bit is one less than the total number of bits
-        // used to create the address.
-        lowBit = highBit - m_number_of_bits_per_level[level];
-        curAddress.setAddress(address.bitSelect(lowBit, highBit - 1));
-
-        DPRINTF(RubyCache, "level: %d, lowBit: %d, highBit - 1: %d, "
-                "curAddress: %s\n",
-                level, lowBit, highBit - 1, curAddress);
-
-        // Adjust the highBit value for the next level
-        highBit -= m_number_of_bits_per_level[level];
-
-        // If the address is found, move on to the next level.
-        // Otherwise, return not found
-        if (curTable->count(curAddress) != 0) {
-            curTable = (SparseMapType*)((*curTable)[curAddress]);
-        } else {
-            DPRINTF(RubyCache, "Not found\n");
-            return NULL;
-        }
-    }
-
-    // The last entry actually points to the Directory entry not a table
-    entry = (AbstractEntry*)curTable;
-
-    return entry;
-}
-
-void
-SparseMemory::recordBlocks(int cntrl_id, CacheRecorder* tr) const
-{
-    queue<SparseMapType*> unexplored_nodes[2];
-    queue<physical_address_t> address_of_nodes[2];
-
-    unexplored_nodes[0].push(m_map_head);
-    address_of_nodes[0].push(0);
-
-    int parity_of_level = 0;
-    physical_address_t address, temp_address;
-    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;
-
-    for (int cur_level = 0; cur_level < m_number_of_levels; cur_level++) {
-
-        // create the appropriate address for this level
-        // Note: that set Address is inclusive of the specified range,
-        // thus the high bit is one less than the total number of bits
-        // used to create the address.
-        lowBit = highBit - m_number_of_bits_per_level[cur_level];
-
-        while (!unexplored_nodes[parity_of_level].empty()) {
-
-            SparseMapType* node = unexplored_nodes[parity_of_level].front();
-            unexplored_nodes[parity_of_level].pop();
-
-            address = address_of_nodes[parity_of_level].front();
-            address_of_nodes[parity_of_level].pop();
-
-            SparseMapType::iterator iter;
-
-            for (iter = node->begin(); iter != node->end(); iter++) {
-                SparseMemEntry entry = (*iter).second;
-                curAddress = (*iter).first;
-
-                if (cur_level != (m_number_of_levels - 1)) {
-                    // If not at the last level, put this node in the queue
-                    unexplored_nodes[1 - parity_of_level].push(
-                                                     (SparseMapType*)(entry));
-                    address_of_nodes[1 - parity_of_level].push(address |
-                                         (curAddress.getAddress() << lowBit));
-                } else {
-                    // If at the last level, add a trace record
-                    temp_address = address | (curAddress.getAddress()
-                                                                   << lowBit);
-                    DataBlock block = ((AbstractEntry*)entry)->getDataBlk();
-                    tr->addRecord(cntrl_id, temp_address, 0, RubyRequestType_ST, 0,
-                                  block);
-                }
-            }
-        }
-
-        // Adjust the highBit value for the next level
-        highBit -= m_number_of_bits_per_level[cur_level];
-        parity_of_level = 1 - parity_of_level;
-    }
-}
-
-void
-SparseMemory::regStats(const string &name)
-{
-    m_total_adds.name(name + ".total_adds");
-
-    m_adds_per_level
-        .init(m_number_of_levels)
-        .name(name + ".adds_per_level")
-        .flags(Stats::pdf | Stats::total)
-        ;
-
-    m_total_removes.name(name + ".total_removes");
-    m_removes_per_level
-        .init(m_number_of_levels)
-        .name(name + ".removes_per_level")
-        .flags(Stats::pdf | Stats::total)
-        ;
-}
diff --git a/src/mem/ruby/structures/SparseMemory.hh b/src/mem/ruby/structures/SparseMemory.hh
deleted file mode 100644 (file)
index d5bf314..0000000
+++ /dev/null
@@ -1,98 +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.
- */
-
-#ifndef __MEM_RUBY_STRUCTURES_SPARSEMEMORY_HH__
-#define __MEM_RUBY_STRUCTURES_SPARSEMEMORY_HH__
-
-#include <iostream>
-#include <string>
-
-#include "base/hashmap.hh"
-#include "base/statistics.hh"
-#include "mem/ruby/common/Address.hh"
-#include "mem/ruby/slicc_interface/AbstractEntry.hh"
-#include "mem/ruby/system/CacheRecorder.hh"
-
-typedef void* SparseMemEntry;
-typedef m5::hash_map<Address, SparseMemEntry> SparseMapType;
-
-struct CurNextInfo
-{
-    SparseMapType* curTable;
-    int level;
-    int highBit;
-    int lowBit;
-};
-
-class SparseMemory
-{
-  public:
-    SparseMemory(int number_of_levels);
-    ~SparseMemory();
-
-    bool exist(const Address& address) const;
-    void add(const Address& address, AbstractEntry*);
-    void remove(const Address& address);
-
-    /*!
-     * Function for recording the contents of memory. This function walks
-     * through all the levels of the sparse memory in a breadth first
-     * fashion. This might need more memory than a depth first approach.
-     * But breadth first seems easier to me than a depth first approach.
-     */
-    void recordBlocks(int cntrl_id, CacheRecorder *) const;
-
-    AbstractEntry* lookup(const Address& address);
-    void regStats(const std::string &name);
-
-  private:
-    // Private copy constructor and assignment operator
-    SparseMemory(const SparseMemory& obj);
-    SparseMemory& operator=(const SparseMemory& obj);
-
-    // Used by destructor to recursively remove all tables
-    void recursivelyRemoveTables(SparseMapType* currentTable, int level);
-
-    // recursive search for address and remove associated entries
-    int recursivelyRemoveLevels(const Address& address, CurNextInfo& curInfo);
-
-    // Data Members (m_prefix)
-    SparseMapType* m_map_head;
-
-    int m_total_number_of_bits;
-    int m_number_of_levels;
-    int* m_number_of_bits_per_level;
-
-    Stats::Scalar m_total_adds;
-    Stats::Vector m_adds_per_level;
-    Stats::Scalar m_total_removes;
-    Stats::Vector m_removes_per_level;
-};
-
-#endif // __MEM_RUBY_STRUCTURES_SPARSEMEMORY_HH__
index 0675366d1866f4a7074869963a0ed49c76e28350..edc739b85a5383236dc00104458ab7686a05155b 100644 (file)
@@ -108,12 +108,6 @@ RubySystem::registerAbstractController(AbstractController* cntrl)
   g_abs_controls[id.getType()][id.getNum()] = cntrl;
 }
 
-void
-RubySystem::registerSparseMemory(SparseMemory* s)
-{
-    m_sparse_memory_vector.push_back(s);
-}
-
 void
 RubySystem::registerMemController(MemoryControl *mc) {
     m_memory_controller_vec.push_back(mc);
@@ -160,17 +154,13 @@ void
 RubySystem::serialize(std::ostream &os)
 {
     m_cooldown_enabled = true;
-
     vector<Sequencer*> sequencer_map;
     Sequencer* sequencer_ptr = NULL;
-    int cntrl_id = -1;
-
 
     for (int cntrl = 0; cntrl < m_abs_cntrl_vec.size(); cntrl++) {
         sequencer_map.push_back(m_abs_cntrl_vec[cntrl]->getSequencer());
         if (sequencer_ptr == NULL) {
             sequencer_ptr = sequencer_map[cntrl];
-            cntrl_id = cntrl;
         }
     }
 
@@ -217,23 +207,15 @@ RubySystem::serialize(std::ostream &os)
     setCurTick(curtick_original);
 
     uint8_t *raw_data = NULL;
+    uint64 memory_trace_size = m_mem_vec->collatePages(raw_data);
 
-    if (m_mem_vec != NULL) {
-        uint64 memory_trace_size = m_mem_vec->collatePages(raw_data);
-
-        string memory_trace_file = name() + ".memory.gz";
-        writeCompressedTrace(raw_data, memory_trace_file,
-                             memory_trace_size);
+    string memory_trace_file = name() + ".memory.gz";
+    writeCompressedTrace(raw_data, memory_trace_file,
+                         memory_trace_size);
 
-        SERIALIZE_SCALAR(memory_trace_file);
-        SERIALIZE_SCALAR(memory_trace_size);
+    SERIALIZE_SCALAR(memory_trace_file);
+    SERIALIZE_SCALAR(memory_trace_size);
 
-    } else {
-        for (int i = 0; i < m_sparse_memory_vector.size(); ++i) {
-            m_sparse_memory_vector[i]->recordBlocks(cntrl_id,
-                                                    m_cache_recorder);
-        }
-    }
 
     // Aggergate the trace entries together into a single array
     raw_data = new uint8_t[4096];
index c909dc61491eb6f1f2c7e18225ccab491e6e4322..8193764dcab336e51d9db5d8b33e3cb5babafa93 100644 (file)
@@ -41,7 +41,6 @@
 #include "mem/ruby/slicc_interface/AbstractController.hh"
 #include "mem/ruby/structures/MemoryControl.hh"
 #include "mem/ruby/structures/MemoryVector.hh"
-#include "mem/ruby/structures/SparseMemory.hh"
 #include "mem/ruby/system/CacheRecorder.hh"
 #include "mem/packet.hh"
 #include "params/RubySystem.hh"
@@ -107,7 +106,6 @@ class RubySystem : public ClockedObject
 
     void registerNetwork(Network*);
     void registerAbstractController(AbstractController*);
-    void registerSparseMemory(SparseMemory*);
     void registerMemController(MemoryControl *mc);
 
     bool eventQueueEmpty() { return eventq->empty(); }
@@ -147,7 +145,6 @@ class RubySystem : public ClockedObject
     bool m_warmup_enabled;
     bool m_cooldown_enabled;
     CacheRecorder* m_cache_recorder;
-    std::vector<SparseMemory*> m_sparse_memory_vector;
 };
 
 class RubyStatsCallback : public Callback