PaCO++  0.05
paco_libgraph_comScheduling.h
Go to the documentation of this file.
00001 #ifndef LIBGRAPH_COMSCHEDULE_IS_DEFINED
00002 #define LIBGRAPH_COMSCHEDULE_IS_DEFINED
00003 
00004 #include <kbps.h>
00005 #include <CommunicationScheduling.h> 
00006 
00007 class paco_comSchedule_libgraph : public paco_comSchedule
00008 {
00009 protected:
00010   kbps_approximation* _kbps;
00011 
00012   unsigned int* _tmp_idx; // helper array for phase,id -> k
00013   inline unsigned int _idx(const unsigned phase, const unsigned id)
00014   {
00015     return _tmp_idx[phase]+id;
00016   }
00017 
00018 public:
00019   paco_comSchedule_libgraph(kbps_approximation* k) : _kbps(k), _tmp_idx(NULL) {}
00020 
00021   kbps_approximation* get_kbps() const { return _kbps; }
00022 
00023   void build_idx()
00024   {
00025     if (_tmp_idx) {
00026       delete[] _tmp_idx;
00027     }
00028     
00029     _tmp_idx = new unsigned int[this->getNbPhases()];
00030     _tmp_idx[0]=0;
00031     for(unsigned i=1;i<getNbPhases(); i++)
00032       _tmp_idx[i]=_tmp_idx[i-1]+getElementPhase(i-1);
00033   }
00034 
00035   unsigned int getNbPhases() {
00036     return _kbps->infophases[0];
00037   }
00038   unsigned int getElementPhase(const unsigned phase)
00039   {
00040     return _kbps->infophases[phase+1];
00041   }
00042   unsigned int getSrc(const unsigned phase, const unsigned id)
00043   {
00044     return _kbps->comms[_idx(phase, id)].src;
00045   }
00046   unsigned int getDst(const unsigned phase, const unsigned id)
00047   {
00048     return _kbps->comms[_idx(phase, id)].dst;
00049   }
00050   unsigned int getSize(const unsigned phase, const unsigned id)
00051   {
00052     return _kbps->comms[_idx(phase, id)].weight;
00053   }
00054 
00055   void* getInfo(const unsigned phase, const unsigned id)
00056   {
00057     return _kbps->comms[_idx(phase, id)].info;    
00058   }
00059 
00060 };
00061 
00062 class paco_comScheduling_libgraph : public paco_comScheduling 
00063 {
00064 public:
00065 
00066   paco_comScheduling_libgraph();
00067   virtual ~paco_comScheduling_libgraph();
00068 
00069   void set_beta(unsigned int beta); // reset all schedule memory  (but no communication memory)
00070   void set_k(unsigned int k); // reset all schedule memory (but no communication memory)
00071   
00072   unsigned int get_beta();
00073   unsigned int get_k();
00074 
00075   paco_comSchedule* computeScheduling(unsigned rank, 
00076                   PaCO::PacoTopology_t* srctopo, PaCO::PacoTopology_t* dsttopo,
00077                   unsigned **com_matrix, void** info_vector[]);
00078   
00079 protected:
00081   virtual void initializeBigraph(PaCO::PacoTopology_t* srctopo, PaCO::PacoTopology_t* dsttopo); 
00082 
00083   unsigned int _beta;
00084   unsigned int _k;
00085 
00086   bigraph * _g; // MUST be configured only by configureLibGraph
00087   node ** _client_nodes;
00088   node ** _server_nodes;
00089 
00090 };
00091 
00092 class paco_libgraph_fabrique : virtual public paco_fabrique_comScheduling
00093 {
00094  public:
00095    paco_comScheduling *create_comScheduling() {
00096     return new paco_comScheduling_libgraph();
00097   }
00098 };
00099 
00100 #endif