• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

sst/elements/cpu_power/cpu_power.h

00001 // Copyright 2009-2010 Sandia Corporation. Under the terms
00002 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S.
00003 // Government retains certain rights in this software.
00004 // 
00005 // Copyright (c) 2009-2010, Sandia Corporation
00006 // All rights reserved.
00007 // 
00008 // This file is part of the SST software package. For license
00009 // information, see the LICENSE file in the top level directory of the
00010 // distribution.
00011 
00012 // A cpu component that can report unit power 
00013 // Built for testing the power model.
00014 
00015 #ifndef _CPU_POWER_H
00016 #define _CPU_POWER_H
00017 
00018 //#include <sst/core/eventFunctor.h>
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  //           handler = new SST::EventHandler< Cpu_power, bool, Cycle_t >
00060  //                                               ( this, &Cpu_power::clock );
00061  //           TimeConverter* tc = registerClock( frequency, handler );
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             // report/register power dissipation            
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             //power->setTech(getId(), params, EXEU_ALU, McPAT);
00083             //power->setTech(getId(), params, EXEU_FPU, McPAT);
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             //power->setTech(getId(), params, BTB, McPAT);
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             //power->setTech(getId(), params, MEM_CTRL, McPAT);
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             //unregisterExit();
00127             return 0;
00128         }
00129 
00130 
00131     private:
00132 
00133         Cpu_power( const Cpu_power& c );
00134         Cpu_power() :  IntrospectedComponent(-1) {} // for serialization only
00135 
00136         bool clock( Cycle_t );
00137         //bool handler1( Time_t time, Event *e );
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;  //over-specified struct that holds usage counts of its sub-components
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

Generated on Fri Oct 22 2010 11:02:21 for SST by  doxygen 1.7.1