00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef SST_INTROSPECTED_COMPONENT_H
00014 #define SST_INTROSPECTED_COMPONENT_H
00015
00016 #include <cmath>
00017 #include <iostream>
00018 #include <list>
00019 #include <deque>
00020 #include <map>
00021
00022 #if defined(__x86_64__) && defined(__APPLE__) && !defined(__USE_ISOC99)
00023
00024
00025 #define __USE_ISOC99 1
00026 #include <boost/numeric/interval.hpp>
00027 #undef __USE_ISOC99
00028 #else
00029 #include <boost/numeric/interval.hpp>
00030 #endif
00031 #include <boost/io/ios_state.hpp>
00032
00033 #include <sst/core/component.h>
00034 #include <sst/core/sst_types.h>
00035
00036 #include <sst/core/timeConverter.h>
00037
00038 namespace io_interval {
00039 template<class T, class Policies, class CharType, class CharTraits>
00040 std::basic_ostream<CharType, CharTraits>
00041 &operator<<(std::basic_ostream<CharType, CharTraits> &stream,
00042 const boost::numeric::interval<T, Policies> &value)
00043 {
00044 if (empty(value)) {
00045 return stream << "nothing";
00046 } else if (singleton(value)) {
00047 boost::io::ios_precision_saver state(stream, std::numeric_limits<T>::digits10);
00048 return stream << lower(value);
00049 } else if (zero_in(value)) {
00050 return stream << "0~";
00051 } else {
00052 std::streamsize p = stream.precision();
00053 p = (p > 15) ? 15 : p - 1;
00054 double eps = 1.0; for(; p > 0; --p) { eps /= 10; }
00055 T eps2 = static_cast<T>(eps / 2) * norm(value);
00056 boost::numeric::interval<T, Policies> r = widen(value, eps2);
00057
00058 return stream << median(r) << " ± " << width(r)/2;
00059 }
00060 }
00061 }
00062
00063 namespace SST {
00064
00065 class Introspector;
00066
00067 typedef boost::numeric::interval<double> I;
00068
00069 typedef struct {
00070 I il1, il2, dl1, dl2, itlb, dtlb;
00071 I clock, bpred, rf, io, logic;
00072 I alu, fpu, mult, ib, issueQ, decoder, bypass, exeu;
00073 I pipeline, lsq, rat, rob, btb, L2, mc;
00074 I router, loadQ, renameU, schedulerU, L3, L1dir, L2dir;
00075 } itemized_t;
00076
00077 typedef struct
00078 {
00079
00080
00081 I TDP;
00082 I runtimeDynamicPower;
00083 I leakagePower;
00084 I peak;
00085 I currentPower;
00086 I averagePower;
00087 I totalEnergy;
00088 itemized_t itemizedRuntimeDynamicPower;
00089 itemized_t itemizedLeakagePower;
00090 itemized_t itemizedCurrentPower;
00091 itemized_t itemizedTDP;
00092 itemized_t itemizedPeak;
00093 itemized_t itemizedTotalPower;
00094 Time_t currentSimTime;
00095 }Pdissipation_t;
00096
00097
00098 typedef std::map<ComponentId_t, Pdissipation_t> PowerDatabase;
00099
00100
00101
00102
00103
00104 class IntrospectedComponent : public Component {
00105 public:
00106 typedef std::map<std::string,std::string> Params_t;
00107
00108 typedef std::map<std::string, int> Monitors;
00109
00110
00111
00112
00113
00114 enum stats {
00115 core_temperature,branch_read, branch_write, RAS_read, RAS_write,
00116 il1_read, il1_readmiss, IB_read, IB_write, BTB_read, BTB_write,
00117 int_win_read, int_win_write, fp_win_read, fp_win_write, ROB_read, ROB_write,
00118 iFRAT_read, iFRAT_write, iFRAT_search, fFRAT_read, fFRAT_write, fFRAT_search, iRRAT_write, fRRAT_write,
00119 ifreeL_read, ifreeL_write, ffreeL_read, ffreeL_write, idcl_read, fdcl_read,
00120 dl1_read, dl1_readmiss, dl1_write, dl1_writemiss, LSQ_read, LSQ_write,
00121 itlb_read, itlb_readmiss, dtlb_read, dtlb_readmiss,
00122 int_regfile_reads, int_regfile_writes, float_regfile_reads, float_regfile_writes, RFWIN_read, RFWIN_write,
00123 bypass_access, router_access,
00124 L2_read, L2_readmiss, L2_write, L2_writemiss, L3_read, L3_readmiss, L3_write, L3_writemiss,
00125 L1Dir_read, L1Dir_readmiss, L1Dir_write, L1Dir_writemiss, L2Dir_read, L2Dir_readmiss, L2Dir_write, L2Dir_writemiss,
00126 memctrl_read, memctrl_write,
00127
00128 alu_access, fpu_access, mult_access, io_access,
00129
00130 cache_load_lookups, cache_load_misses, cache_store_lookups, cache_store_misses, writeback_lookups,
00131 writeback_misses, prefetch_lookups, prefetch_misses,
00132 prefetch_insertions, prefetch_useful_insertions, MSHR_occupancy ,
00133 MSHR_full_cycles , WBB_insertions , WBB_victim_insertions ,
00134 WBB_combines , WBB_occupancy , WBB_full_cycles ,
00135 WBB_hits, WBB_victim_hits, core_lookups, core_misses, MSHR_combos,
00136
00137 ib_access, issueQ_access, decoder_access, pipeline_access, lsq_access,
00138 rat_access, rob_access, btb_access, l2_access, mc_access,
00139 loadQ_access, rename_access, scheduler_access, l3_access, l1dir_access, l2dir_access,
00140
00141 dram_backgroundEnergy, dram_burstEnergy, dram_actpreEnergy, dram_refreshEnergy,
00142
00143 router_delay, local_message,
00144
00145 current_power, leakage_power, runtime_power, total_power, peak_power };
00146
00147
00148
00149
00150 IntrospectedComponent( ComponentId_t id );
00151 virtual ~IntrospectedComponent() {}
00152
00153
00154 std::list<Introspector*> MyIntroList;
00155
00156
00157
00158
00159
00160 static PowerDatabase PDB;
00161
00162
00163 void regPowerStats(Pdissipation_t pusage);
00164
00165
00166
00167 std::pair<bool, Pdissipation_t> readPowerStats(Component* c);
00168
00169
00170
00171
00172
00173
00174
00175 SimTime_t getFreq() {return defaultTimeBase->getFactor();}
00176
00177
00178
00179 void registerMonitorInt(std::string dataName);
00180
00181
00182
00183
00184 std::pair<bool, int> ifMonitorIntData(std::string dataName);
00185
00186
00187
00188 void registerMonitorDouble(std::string dataName);
00189
00190
00191
00192
00193 std::pair<bool, int> ifMonitorDoubleData(std::string dataName);
00194
00195
00196
00197 void addToIntroList(Introspector *introspector);
00198
00199
00200
00201
00202 bool isTimeToPush(Cycle_t current, const char *type);
00203
00204
00205
00206
00207
00208 virtual uint64_t getIntData(int dataID, int index=0){ return 0;}
00209
00210
00211
00212
00213
00214 virtual double getDoubleData(int dataID, int index=0){ return 0;}
00215
00216
00217
00218 int getDataID(std::string dataName);
00219
00220 protected:
00221
00222
00223
00224 Monitors monitorINT;
00225
00226
00227
00228 Monitors monitorDOUBLE;
00229
00230 private:
00231 IntrospectedComponent();
00232
00233 friend class boost::serialization::access;
00234 template<class Archive>
00235 void serialize(Archive& ar, const unsigned int version);
00236 };
00237
00238 }
00239
00240 BOOST_CLASS_EXPORT_KEY(SST::IntrospectedComponent)
00241
00242 #endif