Hi,
After running valgrind i found the leaks. I have fixed them locally and my
applications dont blow up in memory after the fix. Here is the diff, kindly
let me know if it is correct:
diff -r 84bd4089958b src/mem/cache/prefetch/base.cc
--- a/src/mem/cache/prefetch/base.cc Tue May 25 20:15:44 2010 -0700
+++ b/src/mem/cache/prefetch/base.cc Wed Jun 02 13:21:46 2010 -0400
@@ -138,23 +138,25 @@
}
PacketPtr pkt;
- bool keep_trying = false;
+ bool keep_trying = true;
do {
pkt = *pf.begin();
pf.pop_front();
- if (keep_trying) {
+ if ((pkt != (*pf.end())) && inCache(pkt->getAddr())) {
+ keep_trying = true;
DPRINTF(HWPrefetch, "addr 0x%x in cache, skipping\n",
pkt->getAddr());
delete pkt->req;
delete pkt;
}
+ else {
+ keep_trying = false;
+ }
- if (pf.empty()) {
+ if (keep_trying && pf.empty()) {
cache->deassertMemSideBusRequest(BaseCache::Request_PF);
- if (keep_trying) {
- return NULL; // None left, all were in cache
- }
+ return NULL; // None left, all were in cache
}
} while (keep_trying);
diff -r 84bd4089958b src/mem/cache/prefetch/stride.cc
--- a/src/mem/cache/prefetch/stride.cc Tue May 25 20:15:44 2010 -0700
+++ b/src/mem/cache/prefetch/stride.cc Wed Jun 02 13:21:46 2010 -0400
@@ -110,13 +110,16 @@
if (tab.size() >= 256) { //set default table size is 256
std::list<StrideEntry*>::iterator min_pos = tab.begin();
int min_conf = (*min_pos)->confidence;
+ StrideEntry* min_entry = NULL;
for (iter = min_pos, ++iter; iter != tab.end(); ++iter) {
if ((*iter)->confidence < min_conf){
min_pos = iter;
min_conf = (*iter)->confidence;
+ min_entry = *iter;
}
}
DPRINTF(HWPrefetch, " replacing PC %x\n",
(*min_pos)->instAddr);
+ delete min_entry;
tab.erase(min_pos);
}
On Tue, Jun 1, 2010 at 7:46 PM, Korey Sewell <[email protected]> wrote:
> Has anyone come across such an issue or can any one suggest me what is the
> appropriate way of finding out where the problem lies?
> Try using "valgrind" to check where the memory leak is coming from. It's a
> tremendously useful tool.
>
> you'll want to run on a debug binary and for a limited number of cycles as
> well..
>
> a command line such as "valgrind --tool=memcheck --leak-check=yes
> <cmd_line>" usually works for me. (it's a lot of output, be warned).
>
>
>
>> The GHB, prefetching mechanism works fine in all cases.
>>
>> Another problem that i am currently facing is as follow:
>> There are only integers and floating point numbers in the application that
>> i am trying to run.
>
> Check the mailing list archives but I'm not sure Floating Point support is
> all the way there for x86. I'll let someone else chime in.
>
>
>
>> build/X86_SE/cpu/simple/timing.cc:438: Fault TimingSimpleCPU::read(Addr,
>> T&, unsigned int) [with T = uint64_t]: Assertion `split_addr <= addr ||
>> split_addr - addr < block_size' failed.
>>
> That looks like a error in the code trying to determine something with
> split accesses (accesses that span multiple cache blocks)...
>
> It could be something to do with your prefetcher...Or it could be something
> with the memory leak corrupting values.
>
>
>
> --
> - Korey
>
> _______________________________________________
> m5-users mailing list
> [email protected]
> http://m5sim.org/cgi-bin/mailman/listinfo/m5-users
>
--
Ankit
_______________________________________________
m5-users mailing list
[email protected]
http://m5sim.org/cgi-bin/mailman/listinfo/m5-users