00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef _CPU_DATA_H
00016 #define _CPU_DATA_H
00017
00018 #include <sst/core/eventFunctor.h>
00019 #include <sst/core/component.h>
00020 #include <sst/core/link.h>
00021
00022
00023 using namespace SST;
00024
00025 #if DBG_CPU_DATA
00026 #define _CPU_DATA_DBG( fmt, args...)\
00027 printf( "%d:Cpu_data::%s():%d: "fmt, _debug_rank, __FUNCTION__,__LINE__, ## args )
00028 #else
00029 #define _CPU_DATA_DBG( fmt, args...)
00030 #endif
00031
00032 class Cpu_data : public Component {
00033 typedef enum { WAIT, SEND } state_t;
00034 typedef enum { WHO_NIC, WHO_MEM } who_t;
00035 public:
00036 Cpu_data( ComponentId_t id, Params_t& params ) :
00037 Component( id ),
00038 params( params ),
00039 state(SEND),
00040 who(WHO_MEM),
00041 frequency( "2.2GHz" )
00042 {
00043 _CPU_DATA_DBG( "new id=%lu\n", id );
00044
00045 registerExit();
00046
00047 Params_t::iterator it = params.begin();
00048 while( it != params.end() ) {
00049 _CPU_DATA_DBG("key=%s value=%s\n",
00050 it->first.c_str(),it->second.c_str());
00051 if ( ! it->first.compare("clock") ) {
00052 frequency = it->second;
00053 }
00054 else if ( ! it->first.compare("push_introspector") ) {
00055 pushIntrospector = it->second;
00056 }
00057
00058 ++it;
00059 }
00060
00061 mem = LinkAdd( "MEM" );
00062 handler = new EventHandler< Cpu_data, bool, Cycle_t >
00063 ( this, &Cpu_data::clock );
00064 handlerPush = new EventHandler< Cpu_data, bool, Cycle_t >
00065 ( this, &Cpu_data::pushData );
00066
00067 TimeConverter* tc = registerClock( frequency, handler );
00068 TimeConverter* tcPush = registerClock( frequency, handlerPush );
00069
00070 printf("CPU_DATA period: %ld\n",tc->getFactor());
00071 _CPU_DATA_DBG("Done registering clock\n");
00072
00073 counts = 0;
00074 num_il1_read = 0;
00075 num_branch_read = 0;
00076 num_branch_write = 0;
00077 num_RAS_read = 0;
00078 num_RAS_write = 0;
00079
00080 registerMonitorInt("il1_read");
00081 registerMonitorInt("core_temperature");
00082 registerMonitorInt("branch_read");
00083 registerMonitorInt("RAS_read");
00084 registerMonitorInt("RAS_write");
00085
00086
00087 }
00088 int Setup() {
00089 return 0;
00090 }
00091 int Finish() {
00092 _CPU_DATA_DBG("\n");
00093 unregisterExit();
00094 return 0;
00095 }
00096
00097 uint64_t getIntData(int dataID, int index=0)
00098 {
00099 switch(dataID)
00100 {
00101 case 0:
00102
00103 return (mycore_temperature);
00104 break;
00105 case 1:
00106
00107 return (num_branch_read);
00108 break;
00109 case 2:
00110
00111 return (num_branch_write);
00112 break;
00113 case 3:
00114
00115 return (num_RAS_read);
00116 break;
00117 case 4:
00118
00119 return (num_RAS_write);
00120 break;
00121 case 5:
00122
00123 return (num_il1_read);
00124 break;
00125 default:
00126 return (0);
00127 break;
00128 }
00129 }
00130
00131
00132 public:
00133 int counts;
00134 uint64_t num_il1_read;
00135 uint64_t mycore_temperature;
00136 uint64_t num_branch_read;
00137 uint64_t num_branch_write;
00138 uint64_t num_RAS_read;
00139 uint64_t num_RAS_write;
00140
00141 private:
00142
00143 Cpu_data( const Cpu_data& c );
00144 Cpu_data() { }
00145
00146 bool clock( Cycle_t );
00147 bool pushData( Cycle_t);
00148 ClockHandler_t *handler, *handlerPush;
00149 bool handler1( Time_t time, Event *e );
00150
00151 Params_t params;
00152 Link* mem;
00153 state_t state;
00154 who_t who;
00155 std::string frequency;
00156 std::string pushIntrospector;
00157
00158 friend class boost::serialization::access;
00159 template<class Archive>
00160 void serialize(Archive & ar, const unsigned int version )
00161 {
00162 boost::serialization::base_object<Component>(*this);
00163
00164
00165 }
00166 };
00167
00168 #endif