00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <pch.h>
00033
00034 #include "Sim/Dumper/CountDumper.h"
00035 #include "Sim/Dumper/DumpFileName.h"
00036
00037 using namespace std;
00038 using namespace boost;
00039 using namespace Onikiri;
00040
00041 CountDumper::CountDumper()
00042 {
00043 m_curInsnCount = 0;
00044 m_curCycleCount = 0;
00045 m_insnIntervalOrigin = 0;
00046 m_cycleIntervalOrigin = 0;
00047 m_nextUpdateInsnCount = 0;
00048 }
00049
00050 CountDumper::~CountDumper()
00051 {
00052 }
00053
00054 void CountDumper::Initialize( const String& suffix )
00055 {
00056 LoadParam();
00057
00058 String fileName = g_env.GetHostWorkPath() + MakeDumpFileName( m_fileName, suffix, m_gzipEnabled );
00059
00060 if( m_enabled && (!m_stream.is_complete()) ){
00061 if(m_gzipEnabled){
00062 m_stream.push(
00063 iostreams::gzip_compressor(
00064 iostreams::gzip_params(m_gzipLevel) ) );
00065 }
00066 m_stream.push(
00067 iostreams::file_sink(
00068 fileName, ios::binary) );
00069 }
00070
00071 m_nextUpdateInsnCount = m_interval;
00072 }
00073
00074 void CountDumper::Finalize()
00075 {
00076 ReleaseParam();
00077
00078 if(m_stream.is_complete()) {
00079 m_stream.reset();
00080 }
00081 }
00082
00083 void CountDumper::SetCurrentInsnCount(s64 count)
00084 {
00085 m_curInsnCount = count;
00086 }
00087
00088 void CountDumper::SetCurrentCycle(s64 count)
00089 {
00090 m_curCycleCount = count;
00091 Update();
00092 }
00093
00094 bool CountDumper::Enabled()
00095 {
00096 return m_enabled;
00097 }
00098
00099 void CountDumper::Update()
00100 {
00101 if(m_curInsnCount < m_nextUpdateInsnCount)
00102 return;
00103
00104 s64 insnCountDelta = m_curInsnCount - m_insnIntervalOrigin;
00105 s64 cycleCountDelta = m_curCycleCount - m_cycleIntervalOrigin;
00106 double localIPC = (double)insnCountDelta / (double)cycleCountDelta;
00107 double globalIPC = (double)m_curInsnCount / (double)m_curCycleCount;
00108
00109 m_stream
00110 << "insns ," << insnCountDelta << ","
00111 << "cycles ," << cycleCountDelta << ","
00112 << "ipc ," << localIPC << ","
00113 << "total insns ," << m_curInsnCount << ","
00114 << "total cycles ," << m_curCycleCount << ","
00115 << "total ipc ," << globalIPC << ","
00116 << "\n";
00117
00118 m_nextUpdateInsnCount += m_interval;
00119 m_insnIntervalOrigin = m_curInsnCount;
00120 m_cycleIntervalOrigin = m_curCycleCount;
00121 }