Profiler.cc (7454:3a3e8e8cce1b) Profiler.cc (7455:586f99bf0dc4)
1/*
2 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 36 unchanged lines hidden (view full) ---

45// Allows use of times() library call, which determines virtual runtime
46#include <sys/resource.h>
47#include <sys/times.h>
48
49#include <algorithm>
50
51#include "base/stl_helpers.hh"
52#include "base/str.hh"
1/*
2 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 36 unchanged lines hidden (view full) ---

45// Allows use of times() library call, which determines virtual runtime
46#include <sys/resource.h>
47#include <sys/times.h>
48
49#include <algorithm>
50
51#include "base/stl_helpers.hh"
52#include "base/str.hh"
53#include "mem/gems_common/Map.hh"
54#include "mem/gems_common/PrioHeap.hh"
55#include "mem/protocol/CacheMsg.hh"
56#include "mem/protocol/MachineType.hh"
57#include "mem/protocol/Protocol.hh"
58#include "mem/ruby/common/Debug.hh"
59#include "mem/ruby/network/Network.hh"
60#include "mem/ruby/profiler/AddressProfiler.hh"
61#include "mem/ruby/profiler/Profiler.hh"

--- 6 unchanged lines hidden (view full) ---

68extern ostream* debug_cout_ptr;
69
70static double process_memory_total();
71static double process_memory_resident();
72
73Profiler::Profiler(const Params *p)
74 : SimObject(p)
75{
53#include "mem/gems_common/PrioHeap.hh"
54#include "mem/protocol/CacheMsg.hh"
55#include "mem/protocol/MachineType.hh"
56#include "mem/protocol/Protocol.hh"
57#include "mem/ruby/common/Debug.hh"
58#include "mem/ruby/network/Network.hh"
59#include "mem/ruby/profiler/AddressProfiler.hh"
60#include "mem/ruby/profiler/Profiler.hh"

--- 6 unchanged lines hidden (view full) ---

67extern ostream* debug_cout_ptr;
68
69static double process_memory_total();
70static double process_memory_resident();
71
72Profiler::Profiler(const Params *p)
73 : SimObject(p)
74{
76 m_requestProfileMap_ptr = new Map<string, int>;
77
78 m_inst_profiler_ptr = NULL;
79 m_address_profiler_ptr = NULL;
80
81 m_real_time_start_time = time(NULL); // Not reset in clearStats()
82 m_stats_period = 1000000; // Default
83 m_periodic_output_file_ptr = &cerr;
84
85 m_hot_lines = p->hot_lines;

--- 15 unchanged lines hidden (view full) ---

101 }
102}
103
104Profiler::~Profiler()
105{
106 if (m_periodic_output_file_ptr != &cerr) {
107 delete m_periodic_output_file_ptr;
108 }
75 m_inst_profiler_ptr = NULL;
76 m_address_profiler_ptr = NULL;
77
78 m_real_time_start_time = time(NULL); // Not reset in clearStats()
79 m_stats_period = 1000000; // Default
80 m_periodic_output_file_ptr = &cerr;
81
82 m_hot_lines = p->hot_lines;

--- 15 unchanged lines hidden (view full) ---

98 }
99}
100
101Profiler::~Profiler()
102{
103 if (m_periodic_output_file_ptr != &cerr) {
104 delete m_periodic_output_file_ptr;
105 }
109
110 delete m_requestProfileMap_ptr;
111}
112
113void
114Profiler::wakeup()
115{
116 // FIXME - avoid the repeated code
117
118 vector<integer_t> perProcCycleCount(m_num_of_sequencers);

--- 231 unchanged lines hidden (view full) ---

350 }
351 }
352
353 if (!short_stats) {
354 out << "Request vs. RubySystem State Profile" << endl;
355 out << "--------------------------------" << endl;
356 out << endl;
357
106}
107
108void
109Profiler::wakeup()
110{
111 // FIXME - avoid the repeated code
112
113 vector<integer_t> perProcCycleCount(m_num_of_sequencers);

--- 231 unchanged lines hidden (view full) ---

345 }
346 }
347
348 if (!short_stats) {
349 out << "Request vs. RubySystem State Profile" << endl;
350 out << "--------------------------------" << endl;
351 out << endl;
352
358 vector<string> requestProfileKeys = m_requestProfileMap_ptr->keys();
359 sort(requestProfileKeys.begin(), requestProfileKeys.end());
353 map<string, int>::const_iterator i = m_requestProfileMap.begin();
354 map<string, int>::const_iterator end = m_requestProfileMap.end();
355 for (; i != end; ++i) {
356 const string &key = i->first;
357 int count = i->second;
360
358
361 for (int i = 0; i < requestProfileKeys.size(); i++) {
362 int temp_int =
363 m_requestProfileMap_ptr->lookup(requestProfileKeys[i]);
364 double percent = (100.0 * double(temp_int)) / double(m_requests);
359 double percent = (100.0 * double(count)) / double(m_requests);
365 vector<string> items;
360 vector<string> items;
366 tokenize(items, requestProfileKeys[i], ':');
367 vector<string>::iterator i = items.begin();
361 tokenize(items, key, ':');
362 vector<string>::iterator j = items.begin();
368 vector<string>::iterator end = items.end();
363 vector<string>::iterator end = items.end();
369 for (; i != end; ++i)
370 out << setw(10) << *i;
371 out << setw(11) << temp_int;
364 for (; j != end; ++i)
365 out << setw(10) << *j;
366 out << setw(11) << count;
372 out << setw(14) << percent << endl;
373 }
374 out << endl;
375
376 out << "filter_action: " << m_filter_action_histogram << endl;
377
378 if (!m_all_instructions) {
379 m_address_profiler_ptr->printStats(out);

--- 95 unchanged lines hidden (view full) ---

475 m_sequencer_requests.clear();
476 m_read_sharing_histogram.clear();
477 m_write_sharing_histogram.clear();
478 m_all_sharing_histogram.clear();
479 m_cache_to_cache = 0;
480 m_memory_to_cache = 0;
481
482 // clear HashMaps
367 out << setw(14) << percent << endl;
368 }
369 out << endl;
370
371 out << "filter_action: " << m_filter_action_histogram << endl;
372
373 if (!m_all_instructions) {
374 m_address_profiler_ptr->printStats(out);

--- 95 unchanged lines hidden (view full) ---

470 m_sequencer_requests.clear();
471 m_read_sharing_histogram.clear();
472 m_write_sharing_histogram.clear();
473 m_all_sharing_histogram.clear();
474 m_cache_to_cache = 0;
475 m_memory_to_cache = 0;
476
477 // clear HashMaps
483 m_requestProfileMap_ptr->clear();
478 m_requestProfileMap.clear();
484
485 // count requests profiled
486 m_requests = 0;
487
488 m_outstanding_requests.clear();
489 m_outstanding_persistent_requests.clear();
490
491 // Flush the prefetches through the system - used so that there

--- 58 unchanged lines hidden (view full) ---

550}
551
552// profiles original cache requests including PUTs
553void
554Profiler::profileRequest(const string& requestStr)
555{
556 m_requests++;
557
479
480 // count requests profiled
481 m_requests = 0;
482
483 m_outstanding_requests.clear();
484 m_outstanding_persistent_requests.clear();
485
486 // Flush the prefetches through the system - used so that there

--- 58 unchanged lines hidden (view full) ---

545}
546
547// profiles original cache requests including PUTs
548void
549Profiler::profileRequest(const string& requestStr)
550{
551 m_requests++;
552
558 if (m_requestProfileMap_ptr->exist(requestStr)) {
559 (m_requestProfileMap_ptr->lookup(requestStr))++;
560 } else {
561 m_requestProfileMap_ptr->add(requestStr, 1);
562 }
553 // if it doesn't exist, conveniently, it will be created with the
554 // default value which is 0
555 m_requestProfileMap[requestStr]++;
563}
564
565void
566Profiler::controllerBusy(MachineID machID)
567{
568 m_busyControllerCount[(int)machID.type][(int)machID.num]++;
569}
570

--- 103 unchanged lines hidden (view full) ---

674
675 ostream &out = *debug_cout_ptr;
676
677 out.flags(ios::right);
678 out << setw(TIME_SPACES) << g_eventQueue_ptr->getTime() << " ";
679 out << setw(ID_SPACES) << id << " "
680 << "RUBY WATCH " << watch_address << endl;
681
556}
557
558void
559Profiler::controllerBusy(MachineID machID)
560{
561 m_busyControllerCount[(int)machID.type][(int)machID.num]++;
562}
563

--- 103 unchanged lines hidden (view full) ---

667
668 ostream &out = *debug_cout_ptr;
669
670 out.flags(ios::right);
671 out << setw(TIME_SPACES) << g_eventQueue_ptr->getTime() << " ";
672 out << setw(ID_SPACES) << id << " "
673 << "RUBY WATCH " << watch_address << endl;
674
682 if (!m_watch_address_list_ptr->exist(watch_address)) {
683 m_watch_address_list_ptr->add(watch_address, 1);
684 }
675 // don't care about success or failure
676 m_watch_address_set.insert(watch_address);
685}
686
687bool
688Profiler::watchAddress(Address addr)
689{
677}
678
679bool
680Profiler::watchAddress(Address addr)
681{
690 if (m_watch_address_list_ptr->exist(addr))
691 return true;
692 else
693 return false;
682 return m_watch_address_set.count(addr) > 0;
694}
695
696Profiler *
697RubyProfilerParams::create()
698{
699 return new Profiler(this);
700}
683}
684
685Profiler *
686RubyProfilerParams::create()
687{
688 return new Profiler(this);
689}