00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef _CPU_POWER_H
00016 #define _CPU_POWER_H
00017
00018
00019 #include <sst/core/introspectedComponent.h>
00020 #include <sst/core/link.h>
00021 #include <sst/core/timeConverter.h>
00022 #include "../power/power.h"
00023
00024 using namespace SST;
00025
00026 #if DBG_CPU_POWER
00027 #define _CPU_POWER_DBG( fmt, args...)\
00028 printf( "%d:Cpu_power::%s():%d: "fmt, _debug_rank, __FUNCTION__,__LINE__, ## args )
00029 #else
00030 #define _CPU_POWER_DBG( fmt, args...)
00031 #endif
00032
00033 class Cpu_power : public IntrospectedComponent {
00034 typedef enum { WAIT, SEND } state_t;
00035 typedef enum { WHO_NIC, WHO_MEM } who_t;
00036 public:
00037 Cpu_power( ComponentId_t id, Params_t& params ) :
00038 IntrospectedComponent( id ),
00039 params( params ),
00040 state(SEND),
00041 who(WHO_MEM),
00042 frequency( "2.2GHz" )
00043 {
00044 _CPU_POWER_DBG( "new id=%lu\n", id );
00045
00046 registerExit();
00047
00048 Params_t::iterator it = params.begin();
00049 while( it != params.end() ) {
00050 _CPU_POWER_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 ++it;
00056 }
00057
00058 mem = configureLink( "MEM" );
00059
00060
00061
00062 TimeConverter* tc = registerClock( frequency, new Clock::Handler<Cpu_power>(this,&Cpu_power::clock) );
00063
00064 mem->setDefaultTimeBase(tc);
00065 printf("CPU_POWER period: %ld\n",tc->getFactor());
00066 _CPU_POWER_DBG("Done registering clock\n");
00067
00068
00069 }
00070 int Setup() {
00071
00072 power = new Power(getId());
00073 power->setChip(params);
00074 power->setTech(getId(), params, CACHE_IL1, McPAT);
00075 power->setTech(getId(), params, CACHE_DL1, McPAT);
00076 power->setTech(getId(), params, CACHE_ITLB, McPAT);
00077 power->setTech(getId(), params, CACHE_DTLB, McPAT);
00078 power->setTech(getId(), params, RF, McPAT);
00079 power->setTech(getId(), params, IB, McPAT);
00080 power->setTech(getId(), params, PIPELINE, McPAT);
00081 power->setTech(getId(), params, BYPASS, McPAT);
00082
00083
00084 power->setTech(getId(), params, LSQ, McPAT);
00085 power->setTech(getId(), params, BPRED, McPAT);
00086 power->setTech(getId(), params, SCHEDULER_U, McPAT);
00087 power->setTech(getId(), params, RENAME_U, McPAT);
00088
00089 power->setTech(getId(), params, LOAD_Q, McPAT);
00090 power->setTech(getId(), params, CACHE_L1DIR, McPAT);
00091 power->setTech(getId(), params, CACHE_L2DIR, McPAT);
00092 power->setTech(getId(), params, CACHE_L2, McPAT);
00093 power->setTech(getId(), params, CACHE_L3, McPAT);
00094
00095 power->setTech(getId(), params, ROUTER, McPAT);
00096 return 0;
00097 }
00098 int Finish() {
00099 std::pair<bool, Pdissipation_t> res = readPowerStats(this);
00100 if(res.first){
00101 using namespace io_interval; std::cout <<"ID " << getId() <<": current total power = " << res.second.currentPower << " W" << std::endl;
00102 using namespace io_interval; std::cout <<"ID " << getId() <<": leakage power = " << res.second.leakagePower << " W" << std::endl;
00103 using namespace io_interval; std::cout <<"ID " << getId() <<": runtime power = " << res.second.runtimeDynamicPower << " W" << std::endl;
00104 using namespace io_interval; std::cout <<"ID " << getId() <<": TDP = " << res.second.TDP << " W" << std::endl;
00105 using namespace io_interval; std::cout <<"ID " << getId() <<": total energy = " << res.second.totalEnergy << " J" << std::endl;
00106 using namespace io_interval; std::cout <<"ID " << getId() <<": peak power = " << res.second.peak << " W" << std::endl;
00107 using namespace io_interval; std::cout <<"ID " << getId() <<": L2 current total power = " << res.second.itemizedCurrentPower.L2 << " W" << std::endl;
00108 using namespace io_interval; std::cout <<"ID " << getId() <<": L2 leakage power = " << res.second.itemizedLeakagePower.L2 << " W" << std::endl;
00109 using namespace io_interval; std::cout <<"ID " << getId() <<": L2 runtime power = " << res.second.itemizedRuntimeDynamicPower.L2 << " W" << std::endl;
00110 using namespace io_interval; std::cout <<"ID " << getId() <<": L3 current total power = " << res.second.itemizedCurrentPower.L3 << " W" << std::endl;
00111 using namespace io_interval; std::cout <<"ID " << getId() <<": L3 leakage power = " << res.second.itemizedLeakagePower.L3 << " W" << std::endl;
00112 using namespace io_interval; std::cout <<"ID " << getId() <<": L3 runtime power = " << res.second.itemizedRuntimeDynamicPower.L3 << " W" << std::endl;
00113 using namespace io_interval; std::cout <<"ID " << getId() <<": L1dir current total power = " << res.second.itemizedCurrentPower.L1dir << " W" << std::endl;
00114 using namespace io_interval; std::cout <<"ID " << getId() <<": L1dir leakage power = " << res.second.itemizedLeakagePower.L1dir << " W" << std::endl;
00115 using namespace io_interval; std::cout <<"ID " << getId() <<": L1dir runtime power = " << res.second.itemizedRuntimeDynamicPower.L1dir << " W" << std::endl;
00116 using namespace io_interval; std::cout <<"ID " << getId() <<": router current total power = " << res.second.itemizedCurrentPower.router << " W" << std::endl;
00117 using namespace io_interval; std::cout <<"ID " << getId() <<": router leakage power = " << res.second.itemizedLeakagePower.router << " W" << std::endl;
00118 using namespace io_interval; std::cout <<"ID " << getId() <<": router runtime power = " << res.second.itemizedRuntimeDynamicPower.router << " W" << std::endl;
00119 using namespace io_interval; std::cout <<"ID " << getId() <<": current sime time = " << res.second.currentSimTime << " second" << std::endl;
00120 power->printFloorplanAreaInfo();
00121 std::cout << "area return from McPAT = " << power->estimateAreaMcPAT() << " mm^2" << std::endl;
00122 power->printFloorplanPowerInfo();
00123 power->printFloorplanThermalInfo();
00124 }
00125 _CPU_POWER_DBG("\n");
00126
00127 return 0;
00128 }
00129
00130
00131 private:
00132
00133 Cpu_power( const Cpu_power& c );
00134 Cpu_power() : IntrospectedComponent(-1) {}
00135
00136 bool clock( Cycle_t );
00137
00138
00139 Params_t params;
00140 Link* mem;
00141 state_t state;
00142 who_t who;
00143 std::string frequency;
00144
00145
00146 Pdissipation_t pdata, pstats;
00147 Power *power;
00148 usagecounts_t mycounts;
00149
00150
00151 friend class boost::serialization::access;
00152 template<class Archive>
00153 void serialize(Archive & ar, const unsigned int version )
00154 {
00155 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Component);
00156 ar & BOOST_SERIALIZATION_NVP(params);
00157 ar & BOOST_SERIALIZATION_NVP(mem);
00158 ar & BOOST_SERIALIZATION_NVP(state);
00159 ar & BOOST_SERIALIZATION_NVP(who);
00160 ar & BOOST_SERIALIZATION_NVP(frequency);
00161 }
00162 };
00163
00164 #endif