00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef _CPU_POWERANDDATA_H
00016 #define _CPU_POWERANDDATA_H
00017
00018 #include <sst/core/eventFunctor.h>
00019 #include <sst/core/component.h>
00020 #include <sst/core/link.h>
00021 #include "../power/power.h"
00022
00023 using namespace SST;
00024
00025 #if DBG_CPU_POWERANDDATA
00026 #define _CPU_POWERANDDATA_DBG( fmt, args...)\
00027 printf( "%d:Cpu_PowerAndData::%s():%d: "fmt, _debug_rank, __FUNCTION__,__LINE__, ## args )
00028 #else
00029 #define _CPU_POWERANDDATA_DBG( fmt, args...)
00030 #endif
00031
00032 class Cpu_PowerAndData : public Component {
00033 typedef enum { WAIT, SEND } state_t;
00034 typedef enum { WHO_NIC, WHO_MEM } who_t;
00035 public:
00036 Cpu_PowerAndData( ComponentId_t id, Params_t& params ) :
00037 Component( id ),
00038 params( params ),
00039 state(SEND),
00040 area(0.0),
00041 who(WHO_MEM),
00042 frequency( "2.2GHz" )
00043 {
00044 _CPU_POWERANDDATA_DBG( "new id=%lu\n", id );
00045
00046 registerExit();
00047
00048 Params_t::iterator it = params.begin();
00049 while( it != params.end() ) {
00050 _CPU_POWERANDDATA_DBG("key=%s value=%s\n",
00051 it->first.c_str(),it->second.c_str());
00052 if ( ! it->first.compare("clock") ) {
00053 frequency = it->second;
00054 }
00055 else if ( ! it->first.compare("push_introspector") ) {
00056 pushIntrospector = it->second;
00057 }
00058
00059 ++it;
00060 }
00061
00062 mem = LinkAdd( "MEM" );
00063 handler = new EventHandler< Cpu_PowerAndData, bool, Cycle_t >
00064 ( this, &Cpu_PowerAndData::clock );
00065 handlerPush = new EventHandler< Cpu_PowerAndData, bool, Cycle_t >
00066 ( this, &Cpu_PowerAndData::pushData );
00067
00068 TimeConverter* tc = registerClock( frequency, handler );
00069 TimeConverter* tcPush = registerClock( frequency, handlerPush );
00070
00071 printf("CPU_POWERANDDATA period: %ld\n",tc->getFactor());
00072 _CPU_POWERANDDATA_DBG("Done registering clock\n");
00073
00074 counts = 0;
00075 num_il1_read = 0;
00076 num_branch_read = 0;
00077 num_branch_write = 0;
00078 num_RAS_read = 0;
00079 num_RAS_write = 0;
00080
00081 registerMonitorInt("il1_read");
00082 registerMonitorInt("core_temperature");
00083 registerMonitorInt("branch_read");
00084 registerMonitorInt("RAS_read");
00085 registerMonitorInt("RAS_write");
00086
00087
00088
00089 }
00090 int Setup() {
00091
00092 power = new Power(Id());
00093 power->setTech(Id(), params, CACHE_IL1);
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 area = power->estimateAreaMcPAT();
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 return 0;
00129 }
00130 int Finish() {
00131 _CPU_POWERANDDATA_DBG("\n");
00132 unregisterExit();
00133 return 0;
00134 }
00135
00136 uint64_t getIntData(int dataID, int index=0)
00137 {
00138 switch(dataID)
00139 {
00140 case 0:
00141
00142 return (mycore_temperature);
00143 break;
00144 case 1:
00145
00146 return (num_branch_read);
00147 break;
00148 case 2:
00149
00150 return (num_branch_write);
00151 break;
00152 case 3:
00153
00154 return (num_RAS_read);
00155 break;
00156 case 4:
00157
00158 return (num_RAS_write);
00159 break;
00160 case 5:
00161
00162 return (num_il1_read);
00163 break;
00164 default:
00165 return (0);
00166 break;
00167 }
00168 }
00169
00170
00171 public:
00172 int counts;
00173 double area;
00174 uint64_t num_il1_read;
00175 uint64_t mycore_temperature;
00176 uint64_t num_branch_read;
00177 uint64_t num_branch_write;
00178 uint64_t num_RAS_read;
00179 uint64_t num_RAS_write;
00180
00181
00182 private:
00183
00184 Cpu_PowerAndData( const Cpu_PowerAndData& c );
00185
00186 bool clock( Cycle_t );
00187 bool pushData( Cycle_t);
00188 ClockHandler_t *handler, *handlerPush;
00189 bool handler1( Time_t time, Event *e );
00190
00191 Params_t params;
00192 Link* mem;
00193 state_t state;
00194 who_t who;
00195 std::string frequency;
00196 std::string pushIntrospector;
00197
00198
00199 Pdissipation_t pdata, pstats;
00200 Power *power;
00201 std::pair<bool, int*> p_int;
00202 std::pair<bool, double*> p_double;
00203 usagecounts_t mycounts;
00204
00205 #if WANT_CHECKPOINT_SUPPORT2
00206 BOOST_SERIALIZE {
00207 printf("Cpu_PowerAndData::serialize()\n");
00208 _AR_DBG( Cpu_PowerAndData, "start\n" );
00209 printf(" doing void cast\n");
00210 BOOST_VOID_CAST_REGISTER( Cpu_PowerAndData*, Component* );
00211 printf(" base serializing: component\n");
00212 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Component );
00213 printf(" serializing: mem\n");
00214 ar & BOOST_SERIALIZATION_NVP( mem );
00215 printf(" serializing: handler\n");
00216 ar & BOOST_SERIALIZATION_NVP( handler );
00217 _AR_DBG( Cpu_PowerAndData, "done\n" );
00218 }
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247 #endif
00248 };
00249
00250 #endif