summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNilay Vaish <nilay@cs.wisc.edu>2014-11-06 05:42:20 -0600
committerNilay Vaish <nilay@cs.wisc.edu>2014-11-06 05:42:20 -0600
commit85c29973a3cdbbbc2ed77014a730cbc625899b03 (patch)
tree94dc98ea81cea698f2d9715f961f20bee70715e9
parent95a0b184314cf0171a20fb7e71c845891dc56496 (diff)
downloadgem5-85c29973a3cdbbbc2ed77014a730cbc625899b03.tar.xz
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.
-rw-r--r--src/mem/ruby/structures/DirectoryMemory.cc87
-rw-r--r--src/mem/ruby/structures/DirectoryMemory.hh9
-rw-r--r--src/mem/ruby/structures/SConscript1
-rw-r--r--src/mem/ruby/structures/SparseMemory.cc417
-rw-r--r--src/mem/ruby/structures/SparseMemory.hh98
-rw-r--r--src/mem/ruby/system/System.cc30
-rw-r--r--src/mem/ruby/system/System.hh3
7 files changed, 22 insertions, 623 deletions
diff --git a/src/mem/ruby/structures/DirectoryMemory.cc b/src/mem/ruby/structures/DirectoryMemory.cc
index 2f972674f..94775aa78 100644
--- a/src/mem/ruby/structures/DirectoryMemory.cc
+++ b/src/mem/ruby/structures/DirectoryMemory.cc
@@ -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,60 +130,21 @@ 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",
DirectoryRequestType_to_string(requestType));
diff --git a/src/mem/ruby/structures/DirectoryMemory.hh b/src/mem/ruby/structures/DirectoryMemory.hh
index db98cc838..523f16531 100644
--- a/src/mem/ruby/structures/DirectoryMemory.hh
+++ b/src/mem/ruby/structures/DirectoryMemory.hh
@@ -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&
diff --git a/src/mem/ruby/structures/SConscript b/src/mem/ruby/structures/SConscript
index a5abbf449..dee5769d3 100644
--- a/src/mem/ruby/structures/SConscript
+++ b/src/mem/ruby/structures/SConscript
@@ -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
index a63790502..000000000
--- a/src/mem/ruby/structures/SparseMemory.cc
+++ /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
index d5bf31403..000000000
--- a/src/mem/ruby/structures/SparseMemory.hh
+++ /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__
diff --git a/src/mem/ruby/system/System.cc b/src/mem/ruby/system/System.cc
index 0675366d1..edc739b85 100644
--- a/src/mem/ruby/system/System.cc
+++ b/src/mem/ruby/system/System.cc
@@ -109,12 +109,6 @@ RubySystem::registerAbstractController(AbstractController* 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];
diff --git a/src/mem/ruby/system/System.hh b/src/mem/ruby/system/System.hh
index c909dc614..8193764dc 100644
--- a/src/mem/ruby/system/System.hh
+++ b/src/mem/ruby/system/System.hh
@@ -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