PaCO++  0.05
BasicBC Class Reference

#include <BasicBC.h>

Inheritance diagram for BasicBC:
Collaboration diagram for BasicBC:

List of all members.

Classes

struct  info_t

Public Member Functions

 BasicBC ()
virtual void clientFree ()
virtual PieceToSendcomputePiecesToSend (unsigned &size)
virtual bool freeComId (long id)
virtual void * getClientData (void *pid, int server_node, long &size, long &length, bool &end)
virtual void * getDescr ()
virtual PaCO::PacoTopology_t getDestTopology ()
virtual long getNodeRank ()
virtual void * getServerData (long &length)
virtual PaCO::PacoTopology_t getSourceTopology ()
virtual bool insertData (void *rcptBuf, unsigned long element_nb)
virtual void serverFree ()
void setBlocSize (unsigned long bsz)
virtual bool setComId (long id)
virtual void setCommunicator (void *group)
virtual void setDataPtr (void *dataPtr)
virtual void setDescr (void *descr)
virtual void setDestTopology (PaCO::PacoTopology_t topo)
void setEltSize (unsigned long size)
virtual void setNodeRank (long Rank)
virtual void setSourceTopology (PaCO::PacoTopology_t topo)
void setTotalNbElt (unsigned long elt_nb)
virtual ~BasicBC ()

Private Types

typedef map< long, info_list_t ** > info_list_map_t
typedef list< info_t * > info_list_t

Private Member Functions

void allocate_new_info_list ()
void clear_info_list ()
void internalFreeComId (info_list_map_t::iterator &it)
void internalSetComId (long id)
void reset_info_list ()

Private Attributes

char * _clientBuffer
BasicBCLib::BasicBCDescr _clientDescr
unsigned _config
long _cur_id
unsigned _dbsz
unsigned _descr_ids_counter
bool _descr_to_be_cleaned
PaCO::PacoTopology_t _dTopo
unsigned _glen
info_list_map_t _info_list_map
info_list_t ** _infolists
unsigned _llen
unsigned _lstart
unsigned _nodeRank
BasicBC_param_t _param
unsigned _sbsz
char * _serverBuffer
BasicBCLib::BasicBCDescr_serverDescr
unsigned long _serverToReceived
PaCO::PacoTopology_t _sTopo

Detailed Description

Definition at line 36 of file BasicBC.h.


Member Typedef Documentation

typedef map<long, info_list_t**> BasicBC::info_list_map_t [private]

Definition at line 71 of file BasicBC.h.

typedef list<info_t*> BasicBC::info_list_t [private]

Definition at line 69 of file BasicBC.h.


Constructor & Destructor Documentation

Definition at line 117 of file BasicBC.cc.

References _clientBuffer, _config, _descr_to_be_cleaned, _dTopo, _nodeRank, _param, _serverBuffer, _serverDescr, _sTopo, BASICBC_BLOC, internalSetComId(), PaCO::PacoTopology_s::total, and BasicBC_param_t::type.

{
  // Common
  _config = 0;

  // By default 1->1 :)
  _sTopo.total=1;
  _dTopo.total=1;
  _param.type = BASICBC_BLOC;
  _nodeRank=0;
  
  // Client side
  _clientBuffer=NULL;
  _descr_to_be_cleaned=true;

  this->internalSetComId(-1); // set anonymous & init iterator, infolists & _cur_id
  
  // Server side
  _serverDescr=NULL;
  _serverBuffer=NULL;
}

Here is the call graph for this function:

BasicBC::~BasicBC ( ) [virtual]

Definition at line 139 of file BasicBC.cc.

References _info_list_map, and internalFreeComId().

{
  for(info_list_map_t::iterator it=_info_list_map.begin(); it!=_info_list_map.end(); ++it)
    this->internalFreeComId(it);
  _info_list_map.clear();
}

Here is the call graph for this function:


Member Function Documentation

void BasicBC::allocate_new_info_list ( ) [private]

Definition at line 754 of file BasicBC.cc.

References _dTopo, _infolists, and PaCO::PacoTopology_s::total.

Referenced by internalSetComId().

{
  _infolists = new info_list_t*[_dTopo.total];
  for(unsigned i=0;i<_dTopo.total;i++)
    _infolists[i]=new info_list_t();
}
void BasicBC::clear_info_list ( ) [private]

Definition at line 777 of file BasicBC.cc.

References _dTopo, _infolists, and PaCO::PacoTopology_s::total.

Referenced by clientFree().

{
#ifdef DEBUG_INTERNAL
  std::cerr << "-- clear info list\n";
#endif
  // for each destNode
  for(unsigned i=0; i< _dTopo.total; i++) {
    // for each element of the list
    info_list_t *ilp = _infolists[i];
    for(info_list_t::const_iterator ci=ilp->begin(); ci!=ilp->end(); ++ci)
      delete (*ci);
    _infolists[i] -> clear();
  }
}
void BasicBC::clientFree ( ) [virtual]

Implements DistributionLibrary.

Definition at line 558 of file BasicBC.cc.

References _cur_id, clear_info_list(), and reset_info_list().

{

#ifdef DEBUG_INTERNAL
  std::cerr << "-- clientFree\n";
#endif
  if (_cur_id == -1) {
    this->clear_info_list();
  } else {
    this->reset_info_list();
  }
}

Here is the call graph for this function:

PieceToSend * BasicBC::computePiecesToSend ( unsigned &  size) [virtual]

Implements DistributionLibrary.

Definition at line 265 of file BasicBC.cc.

References _dTopo, _glen, _infolists, _llen, _lstart, _nodeRank, _param, _sbsz, _sTopo, BASICBC_BLOC, BlocNumberOfElementProc(), blocSize(), computeBlocBounds(), PieceToSend::destNode, getProcRangeInf(), getProcRangeSup(), BasicBC::info_t::gstart, PieceToSend::id, BasicBC::info_t::lstart, BasicBC::info_t::msg_size, NumberOfBlocProc(), OwnerBloc(), BasicBC::info_t::sent_size, PieceToSend::size, PieceToSend::sourceNode, PaCO::PacoTopology_s::total, TotalNumberOfElementProc(), BasicBC_param_t::type, and BasicBC_param_t::unitsize.

{
  /*
   * store src/dst/sz/start
   *
   * where start is a local offset to apply to the vector
   *
   */

  PieceToSend * sched;
  unsigned long golen = _glen*_param.unitsize;

  // We need to compute _lstart and _llen
  _sbsz = blocSize( golen, _sTopo.total, _param);
  _lstart = _nodeRank*_sbsz;
  _lstart = (_lstart < golen ? _lstart:golen);
  _llen   = TotalNumberOfElementProc(golen, _nodeRank, _sTopo.total, _sbsz);

#ifdef DEBUG_INTERNAL
  //  std::cerr << "In computePiecesToSend-------------------- all in octet !\n";

  fprintf(stderr, "-- stopo: %ld\tdtopo: %ld\n", _sTopo.total, _dTopo.total);
  fprintf(stderr, "-- golen: %ld\ttype: %d\tsd.start %d\tllen: %d\n", golen,
     _param.type, _lstart, _llen);
#endif

  if (_sTopo.total == _dTopo.total) {
#ifdef DEBUG_INTERNAL
    fprintf(stderr, "-- easy: n<->n case !\n");
#endif
    size_out = 1;
    sched = new PieceToSend[1];
    sched[0].sourceNode = _nodeRank; // my self :)
    sched[0].destNode   = _nodeRank; // the corresponding node
    sched[0].size       = _llen;     // msg size
    
    info_t* inf = new info_t();
    
    inf->gstart         = _lstart/_param.unitsize; // used start as id -> same at server side
    inf->lstart         = 0;       // do not apply any offset to local ptr
    inf->msg_size       = _llen; 
    inf->sent_size      = 0;

    // add inf to the list
    _infolists[_nodeRank]->push_back(inf);
    // sched points to the list
    sched[0].id         = (void*) _infolists[_nodeRank];

#ifdef DEBUG_INTERNAL
    fprintf(stderr, "--  %2d -> %2d : gstart:%2u lstart:%2u len:%2d\n",
       sched[0].sourceNode, sched[0].destNode, inf->gstart, inf->lstart, inf->msg_size);
#endif

  } else {        
    if (_param.type == BASICBC_BLOC ) {
      // that's a standard bloc redistribution
#ifdef DEBUG_INTERNAL
    fprintf(stderr, "-- medium: n<->m bloc redistribution case !\n");
#endif

      unsigned long slow;
      unsigned long shigh;
      computeBlocBounds(&slow, &shigh, golen, _nodeRank, _sTopo.total, _sbsz, 0);
    
#ifdef DEBUG_INTERNAL
      std::cerr << "--  sbsz: "<<_sbsz<<" sbounds: "<<slow<<" - "<<shigh<<endl;
#endif

      unsigned dbsz = blocSize(golen, _dTopo.total, _param);

#ifdef DEBUG_INTERNAL
      std::cerr << "--  dbsz: "<<dbsz<<endl;
#endif

      unsigned fpid, lpid;
      fpid = getProcRangeInf(slow,  dbsz);
      lpid = getProcRangeSup(shigh, dbsz);
    
#ifdef DEBUG_INTERNAL
      fprintf(stderr, "--  loop from %d to %d width dtotal: %ld\n", fpid, lpid, _dTopo.total);
#endif
    
      // for each dest bloc
      size_out = lpid-fpid+1;
      sched = new PieceToSend[size_out];
      for(unsigned i=fpid; i <= lpid; i++) {
   PieceToSend& s   =  sched[i-fpid];  
   s.sourceNode     = _nodeRank;
   s.destNode       = i;

   info_t* inf      = new info_t();

   unsigned tmp     = i*dbsz;
   unsigned tmp2;
   tmp2 = ( slow >= tmp)?slow:tmp; // max : global offset in octet as ID
   inf->gstart      = tmp2 / _param.unitsize;
   inf->lstart      = tmp2 - _lstart;

   tmp += dbsz;
   unsigned end     = ( shigh <= tmp)?shigh:tmp; // min

   inf->msg_size  =  s.size  = end - tmp2;
   inf->sent_size = 0;

   // add inf to the list
   _infolists[i-fpid]->push_back(inf);
   // sched points to the list
   s.id             = (void*) _infolists[i-fpid];

#ifdef DEBUG_INTERNAL
   fprintf(stderr, "--  %2d -> %2d : gstart:%2u lstart:%2u len:%2d\n",
      s.sourceNode, s.destNode, inf->gstart, inf->lstart, inf->msg_size);
#endif
      }
    } else {
      // it is a bloccyclic distribution
   
#ifdef DEBUG_INTERNAL
    fprintf(stderr, "-- hard: n<->m bloccyclic redistribution case !\n");
#endif

      unsigned stbsz  = _sbsz * _sTopo.total;
      unsigned nbbloc = NumberOfBlocProc(golen, _sTopo.total, _sbsz, _nodeRank);

#ifdef DEBUG_INTERNAL
      std::cerr << "--  sbsz: "<<_sbsz<<" nbbloc: "<<nbbloc<<endl;
#endif

      // for each src bloc, find a dst node
      // But only one struct for each dst -> pre-count

      // should be equal to the number of real dest !
      size_out = 0;
      unsigned *tmp_dnb    = (unsigned*) calloc(_dTopo.total, sizeof(unsigned)); // zeroed array
      PieceToSend **tmp_dor = (PieceToSend**) calloc(_dTopo.total, sizeof(PieceToSend*)); // zeroed array
      for(unsigned b=0; b<nbbloc; b++) {
   unsigned gb            = b * _sTopo.total + _nodeRank; // global bloc id
   unsigned drank         = OwnerBloc(gb, _dTopo.total);
   if (tmp_dnb[drank]++ == 0) // detect if it is the 1st time
     size_out++;
      }
      // Allocating output
      sched = new PieceToSend[size_out];
      unsigned cur=0;
      for(unsigned i=0; i<_dTopo.total; i++) {
   sched[cur].sourceNode = _nodeRank;
   sched[cur].destNode   = i;
   sched[cur].size       = 0;
   sched[cur].id         = (void*) _infolists[i]; 
   tmp_dor[i]            = &sched[cur];   // an index if valid only if tmp_dnb[index]>0 !!!!
   cur+= (tmp_dnb[i]>0?1:0); // increment order only if this dest is not zero
      }
   
#ifdef DEBUG_INTERNAL
      cerr << "-- size_out: "<<size_out<<endl;
#endif

      for(unsigned b=0; b<nbbloc; b++) {
   unsigned gb    = b * _sTopo.total + _nodeRank; // global bloc id
   unsigned drank = OwnerBloc(gb, _dTopo.total);
   
   PieceToSend* s = tmp_dor[drank];

   // Allocate new element
   info_t* inf    = new info_t();

   inf->gstart    = ((stbsz*b) + (_nodeRank*_sbsz))/ _param.unitsize;
   inf->lstart    = b * _sbsz;
   inf->msg_size  = BlocNumberOfElementProc(golen, _nodeRank, _sTopo.total, _sbsz, b);
   inf->sent_size = 0;

   // Accumulate msg length in PieceToSend
   s->size           += inf->msg_size;
   
   // insert it in the list
   info_list_t* ilsp  = (info_list_t*) s->id; // pointer to a list
   ilsp->push_back(inf);

   
#ifdef DEBUG_INTERNAL
   fprintf(stderr, "--  %2d -> %2d : gstart:%2u lstart:%2u len:%2d\n",
      s->sourceNode, s->destNode, inf->gstart, inf->lstart, inf->msg_size);
#endif
      }
    }
  }

#ifdef DEBUG_INTERNAL
  //  std::cerr << "computePiecesToSend-------------------- done\n";
#endif

  return sched;
}

Here is the call graph for this function:

bool BasicBC::freeComId ( long  id) [virtual]

Reimplemented from DistributionLibrary.

Definition at line 726 of file BasicBC.cc.

References _cur_id, _info_list_map, and internalFreeComId().

{ 
  if (id == -1) {
#ifdef DEBUG_INTERNAL
    cerr << "freeComId: not allowed to free com id -1 (ignoring)\n";
#endif
    return true;
  }

  if (_cur_id == id) {
#ifdef DEBUG_INTERNAL
    cerr << "freeComId: not allowed to free current com (ignoring)\n";
#endif
    return true;
  }

#ifdef DEBUG_INTERNAL
  cerr << "freeComid: communication id: "<<id<<endl;
#endif

  info_list_map_t::iterator it = _info_list_map.find(id);
  this->internalFreeComId(it);
  _info_list_map.erase(it);

  return true;
}

Here is the call graph for this function:

void * BasicBC::getClientData ( void *  pid,
int  server_node,
long &  size,
long &  length,
bool &  end 
) [virtual]

Implements DistributionLibrary.

Definition at line 469 of file BasicBC.cc.

References _clientBuffer, _clientDescr, _descr_to_be_cleaned, _param, DEBUG_INTERNAL2, BasicBC::info_t::gstart, BasicBCLib::BasicBCDescr::ids, BasicBC::info_t::lstart, BasicBC::info_t::sent_size, and BasicBC_param_t::unitsize.

{
  info_list_t* ilsp  = (info_list_t*) pid;

#ifdef DEBUG_INTERNAL2
  std::cerr << "-- getClientData : _clientBuffer=" << (void*) _clientBuffer << std::endl;
  std::cerr << "-- getClientData : " << dnode << " " << remaining_size_octet << std::endl;
#endif

  if (_descr_to_be_cleaned) {
    _descr_to_be_cleaned = false;
    _clientDescr.ids.length(0);
  }

  // look for 1st one not "empty"
  long rst_data=0;
  info_list_t::const_iterator ci;
  for(ci=ilsp->begin(); ci!=ilsp->end(); ++ci) {
    rst_data = (*ci)->msg_size - (*ci)->sent_size;
    if (rst_data>0)
      break;
  }

  // No more element: return immediatly
  if (ci == ilsp->end())
    {
#ifdef DEBUG_INTERNAL2
      std::cerr << "-- getClientData0 : no more block for this argument\n";
#endif
      returned_length_element = 0;
      end = true;
      return NULL;
    }
  // No more data of this element but there are more
  if (rst_data == 0)
    {
#ifdef DEBUG_INTERNAL2
      std::cerr << "-- getClientData0 : no more data for this bloc\n";
#endif
      returned_length_element = 0;
      end = false;
      return NULL;
    }
  // *ci assumed ok here (else return above !!)
  info_t* info = *ci;

  // More asked data as I can provide -> give all the data of this bloc
  if (remaining_size_octet >= rst_data)
    {
      unsigned descr_len       = _clientDescr.ids.length();
      _clientDescr.ids.length(descr_len+1);
      _clientDescr.ids[descr_len] = info->gstart+(info->sent_size/_param.unitsize);

      unsigned start           = info->lstart+info->sent_size;
      info->sent_size         += rst_data;
      returned_length_element  = rst_data / _param.unitsize; // should divide;
      remaining_size_octet    -= rst_data;
      end                      = (remaining_size_octet == 0);

#ifdef DEBUG_INTERNAL2
      std::cerr << "-- getClientData1 : gstart:"<<_clientDescr.ids[descr_len]<<" #element:"<<returned_length_element<<endl;
#endif

      return (void *)&_clientBuffer[start];
    }
  else
    {
      // I have more data than requested
      unsigned descr_len       = _clientDescr.ids.length();
      _clientDescr.ids.length(descr_len+1);
      _clientDescr.ids[descr_len]    = info->gstart+(info->sent_size/_param.unitsize);

      unsigned start           = info->lstart+info->sent_size;
      returned_length_element  = (remaining_size_octet+_param.unitsize-1)/_param.unitsize; // max
      unsigned mlen            = returned_length_element*_param.unitsize;
      info->sent_size         += mlen;
      remaining_size_octet    -= mlen;
      end                      = true;


#ifdef DEBUG_INTERNAL2
      std::cerr << "-- getClientData1 : gstart:"<<_clientDescr.ids[descr_len]<<" #element:"<<returned_length_element<<endl;
#endif

      return (void *)&_clientBuffer[start];
    }
}
void * BasicBC::getDescr ( ) [virtual]

Implements DistributionLibrary.

Definition at line 572 of file BasicBC.cc.

References _clientDescr, _descr_to_be_cleaned, BasicBCLib::BasicBCDescr::bsz, BasicBCLib::BasicBCDescr::glen, and BasicBCLib::BasicBCDescr::ids.

{
#ifdef DEBUG_INTERNAL
  std::cerr << "-- descr: glen: "<<_clientDescr.glen<<" #element: "<<_clientDescr.ids.length()<<" bsz: "<<_clientDescr.bsz;
  for(unsigned i=0;i<_clientDescr.ids.length();i++) {
    std::cerr<<" "<<_clientDescr.ids[i];
  }
  std::cerr<<std::endl;
#endif
  _descr_to_be_cleaned = true;
  return &_clientDescr;
}

Implements DistributionLibrary.

Definition at line 190 of file BasicBC.cc.

References _dTopo.

{
  std::cerr << "****** Why is the method " << __FUNCTION__ << "called?\n";
  abort();
  return _dTopo;
}
long BasicBC::getNodeRank ( ) [virtual]

Implements DistributionLibrary.

Definition at line 207 of file BasicBC.cc.

References _nodeRank.

{
  return _nodeRank;
}
void * BasicBC::getServerData ( long &  length) [virtual]

Implements DistributionLibrary.

Definition at line 616 of file BasicBC.cc.

References _llen, _param, _serverBuffer, and BasicBC_param_t::unitsize.

{
  length= _llen / _param.unitsize;
#ifdef DEBUG_INTERNAL
  std::cerr << "-- getServerData: ptr : "<<(void*)_serverBuffer<<" #element:"<<length<<std::endl;
#endif  
  return (void*) _serverBuffer;
}

Implements DistributionLibrary.

Definition at line 157 of file BasicBC.cc.

References _sTopo.

{
  std::cerr << "****** Why is the method " << __FUNCTION__ << "called?\n";
  abort();
  return _sTopo;
}
bool BasicBC::insertData ( void *  rcptBuf,
unsigned long  element_nb 
) [virtual]

Implements DistributionLibrary.

Definition at line 586 of file BasicBC.cc.

References _dbsz, _descr_ids_counter, _dTopo, _param, _serverBuffer, _serverDescr, _serverToReceived, BASICBC_BLOC, BasicBCLib::BasicBCDescr::ids, PaCO::PacoTopology_s::total, BasicBC_param_t::type, and BasicBC_param_t::unitsize.

{
  // We are receiving one bloc
  unsigned gstart = _serverDescr->ids[_descr_ids_counter++]; // in octet !!!
  unsigned lstart;
  unsigned llen   = element_nb*_param.unitsize;

  // Need to compute lstart :(
  if (_param.type == BASICBC_BLOC ) {
    lstart = (gstart*_param.unitsize)/ _dbsz; // bloc number
    lstart = (gstart*_param.unitsize) - (lstart*_dbsz);
  } else {
    lstart = (gstart*_param.unitsize)/ _dbsz; // bloc number
    lstart /= _dTopo.total;                   // local number
  }

  char*    rptr   = &_serverBuffer[lstart];
#ifdef DEBUG_INTERNAL
  std::cerr << "  gstart: "<< gstart<<" lstart: "<<lstart<<" #element " << element_nb<<" llen: "<<llen<<std::endl;
#endif
  memcpy(rptr, rcptBuf, llen);

  _serverToReceived -= llen;
#ifdef DEBUG_INTERNAL
  std::cerr << " #missing data"<<_serverToReceived<<std::endl;
#endif
  return (_serverToReceived == 0);
}
void BasicBC::internalFreeComId ( info_list_map_t::iterator &  it) [private]

Definition at line 702 of file BasicBC.cc.

References _dTopo, _info_list_map, and PaCO::PacoTopology_s::total.

Referenced by freeComId(), setDestTopology(), and ~BasicBC().

{
  if (it == _info_list_map.end() ) {
#ifdef DEBUG_INTERNAL
    cerr << "freeComid: communication id  not found (ignoring)\n";
#endif
  } else {
#ifdef DEBUG_INTERNAL
    cerr << "freeComid: freeing communication "<<endl;
#endif
    info_list_t** info = it->second;
    // for each destNode
    for(unsigned i=0; i< _dTopo.total; i++) {
      // for each element of the list
      info_list_t *ilp = info[i];
      for(info_list_t::const_iterator ci=ilp->begin(); ci!=ilp->end(); ++ci)
   delete (*ci);
      info[i] -> clear();
      delete info[i];
    }
  }
}
void BasicBC::internalSetComId ( long  id) [private]

Definition at line 666 of file BasicBC.cc.

References _cur_id, _info_list_map, _infolists, and allocate_new_info_list().

Referenced by BasicBC(), setComId(), and setDestTopology().

{ 
  info_list_map_t::iterator it = _info_list_map.find(id);

  if (it == _info_list_map.end() ) {
#ifdef DEBUG_INTERNAL
    cerr << "setComiI: set 1st time communication id "<<id<<endl;
#endif
    // we must allocate a new one
    this->allocate_new_info_list();
#ifdef DEBUG_INTERNAL
    cerr << "setComId: allocating a new _infolists: "<<_infolists<<endl;      
#endif
    _info_list_map[id] = _infolists;
  } else {
#ifdef DEBUG_INTERNAL
    cerr << "setComId: set (not 1st time) communication id "<<id<<endl;
#endif
    _infolists   = it->second;
  }

  _cur_id = id;
}

Here is the call graph for this function:

void BasicBC::reset_info_list ( ) [private]

Definition at line 762 of file BasicBC.cc.

References _dTopo, _infolists, and PaCO::PacoTopology_s::total.

Referenced by clientFree().

{
#ifdef DEBUG_INTERNAL
  std::cerr << "-- reset info list\n";
#endif
  // for each destNode
  for(unsigned i=0; i< _dTopo.total; i++) {
    // for each element of the list
    info_list_t *ilp = _infolists[i];
    for(info_list_t::const_iterator ci=ilp->begin(); ci!=ilp->end(); ++ci)
      (*ci)->sent_size = 0;
  }
}
void BasicBC::serverFree ( ) [virtual]

Implements DistributionLibrary.

Definition at line 656 of file BasicBC.cc.

References _serverBuffer.

{ 
#ifdef DEBUG_INTERNAL
  std::cerr << "-- serverFree: "<<(void*)_serverBuffer<<endl;
#endif
  free(_serverBuffer);
  _serverBuffer=NULL; // the orb (or the user) need to free the memory!
}
void BasicBC::setBlocSize ( unsigned long  bsz)

Definition at line 213 of file BasicBC.cc.

References _clientDescr, _config, _param, BASICBC_BLOC, BASICBC_BLOCCYCLIC, BASICBC_CYCLIC, BasicBC_param_t::blocsize, BasicBCLib::BasicBCDescr::bsz, DISTRIBUTION_TYPE, and BasicBC_param_t::type.

Referenced by setDescr().

{
#ifdef DEBUG_INTERNAL
  std::cerr << "-- setBlocSize: " << size << std::endl;
#endif
  _config |= DISTRIBUTION_TYPE;
  switch(size) {
  case 0:
#ifdef DEBUG_INTERNAL
    cout << "Selecting a BLOC distribution\n";
#endif
    _param.type = BASICBC_BLOC;
    _clientDescr.bsz  = 0;
    break;
  case 1:
#ifdef DEBUG_INTERNAL
    cout << "Selecting a CYCLIC distribution\n";
#endif
    _param.type = BASICBC_CYCLIC;
    _clientDescr.bsz  = 1;
    break;
  default:
#ifdef DEBUG_INTERNAL
    cout << "Selecting a BLOCCYCLIC with bsz= " << size << " \n";
#endif
    _param.type = BASICBC_BLOCCYCLIC;
    _clientDescr.bsz  =  _param.blocsize = size;
  }
}
bool BasicBC::setComId ( long  id) [virtual]

Reimplemented from DistributionLibrary.

Definition at line 691 of file BasicBC.cc.

References _cur_id, and internalSetComId().

{ 
  if (_cur_id == id) return true; // already initialized

  this->internalSetComId(id);

  return true;
}

Here is the call graph for this function:

virtual void BasicBC::setCommunicator ( void *  group) [inline, virtual]

Implements DistributionLibrary.

Definition at line 103 of file BasicBC.h.

{}
void BasicBC::setDataPtr ( void *  dataPtr) [virtual]

Implements DistributionLibrary.

Definition at line 460 of file BasicBC.cc.

References _clientBuffer.

{
  _clientBuffer = (char *) dataPtr;
#ifdef DEBUG_INTERNAL
  cerr << "-- _clientBuffer set to "<<dataPtr<<endl;
#endif
}
void BasicBC::setDescr ( void *  descr) [virtual]

Implements DistributionLibrary.

Definition at line 626 of file BasicBC.cc.

References _dbsz, _descr_ids_counter, _dTopo, _llen, _nodeRank, _param, _serverBuffer, _serverDescr, _serverToReceived, _sTopo, blocSize(), BasicBCLib::BasicBCDescr::bsz, BasicBCLib::BasicBCDescr::glen, setBlocSize(), setTotalNbElt(), PaCO::PacoTopology_s::total, TotalNumberOfElementProc(), and BasicBC_param_t::unitsize.

{
  _serverDescr = (BasicBCLib::BasicBCDescr*) descr;
  _descr_ids_counter=0;

  // Descr already received

  if ( _serverBuffer == NULL)
    {
      // 1st time -> allocate memory & init
      //this->setEltSize(_descr->usz); BUG: usz can be different in client and server (32bit vs 64bit)
      unsigned long golen = _serverDescr->glen*_param.unitsize;
      this->setTotalNbElt(_serverDescr->glen);
      this->setBlocSize(_serverDescr->bsz);
      _dbsz = blocSize( golen, _dTopo.total, _param);
      _llen  = TotalNumberOfElementProc(golen, _nodeRank, _dTopo.total, _dbsz);
      
#ifdef DEBUG_INTERNAL
      fprintf(stderr, "-- setDescr: stopo: %ld\tdtopo: %ld\n",_sTopo.total, _dTopo.total);
      fprintf(stderr, "   setDescr: golen: %ld\tllen %d\tbsz:%ld\n", _serverDescr->glen, _llen, _serverDescr->bsz);
#endif  
      _serverBuffer = (char*) malloc(_llen);
#ifdef DEBUG_INTERNAL
      std::cerr << "-- serverMalloc: "<<(void*)_serverBuffer<<" - "<<_llen<<endl;
#endif
      _serverToReceived = _llen;
    }
}

Here is the call graph for this function:

Implements DistributionLibrary.

Definition at line 165 of file BasicBC.cc.

References _config, _cur_id, _dTopo, _info_list_map, DST_TOPOLOGY, internalFreeComId(), internalSetComId(), and PaCO::PacoTopology_s::total.

{
#ifdef DEBUG_INTERNAL
  std::cerr << "-- setDestTopology: " << topo.total << std::endl;
#endif
  _config |= DST_TOPOLOGY;

  if ( _dTopo.total == topo.total ) return ; // Nothing change !!!!

  // Delete old entries wrt to old state
  info_list_map_t::iterator it = _info_list_map.find(_cur_id);
  this->internalFreeComId(it);
  _info_list_map.erase(it);

  // Change the state of the object
  _dTopo = topo;

  // Set new entries
  this->internalSetComId(_cur_id);

  // BUG: MUST ALSO DELETE ALL ENTRIES IN _info_list_map 

}

Here is the call graph for this function:

void BasicBC::setEltSize ( unsigned long  size)

Definition at line 244 of file BasicBC.cc.

References _config, _param, ELEMENT_SIZE, and BasicBC_param_t::unitsize.

{
#ifdef DEBUG_INTERNAL
  std::cerr << "-- setEltSize: " << size << std::endl;
#endif
  _config |= ELEMENT_SIZE;
  _param.unitsize = size;
}
void BasicBC::setNodeRank ( long  Rank) [virtual]

Implements DistributionLibrary.

Definition at line 198 of file BasicBC.cc.

References _nodeRank.

{
#ifdef DEBUG_INTERNAL
  std::cerr << "-- setNodeRank: " << Rank << std::endl;
#endif
  _nodeRank = Rank;
}

Implements DistributionLibrary.

Definition at line 147 of file BasicBC.cc.

References _config, _sTopo, SRC_TOPOLOGY, and PaCO::PacoTopology_s::total.

{
#ifdef DEBUG_INTERNAL
  std::cerr << "-- setSourceTopology: " << topo.total << std::endl;
#endif
  _config |= SRC_TOPOLOGY;
  _sTopo = topo;
}
void BasicBC::setTotalNbElt ( unsigned long  elt_nb)

Definition at line 254 of file BasicBC.cc.

References _clientDescr, _config, _glen, BasicBCLib::BasicBCDescr::glen, and TOTAL_SIZE.

Referenced by setDescr().

{
#ifdef DEBUG_INTERNAL
  std::cerr << "-- setTotalNbElt: " << elt_nb << std::endl;
#endif
  _config |= TOTAL_SIZE;
  _clientDescr.glen = _glen = elt_nb;
}

Member Data Documentation

char* BasicBC::_clientBuffer [private]

Definition at line 78 of file BasicBC.h.

Referenced by BasicBC(), getClientData(), and setDataPtr().

unsigned BasicBC::_config [private]
long BasicBC::_cur_id [private]

Definition at line 74 of file BasicBC.h.

Referenced by clientFree(), freeComId(), internalSetComId(), setComId(), and setDestTopology().

unsigned BasicBC::_dbsz [private]

Definition at line 55 of file BasicBC.h.

Referenced by insertData(), and setDescr().

unsigned BasicBC::_descr_ids_counter [private]

Definition at line 84 of file BasicBC.h.

Referenced by insertData(), and setDescr().

Definition at line 77 of file BasicBC.h.

Referenced by BasicBC(), getClientData(), and getDescr().

unsigned BasicBC::_glen [private]

Definition at line 50 of file BasicBC.h.

Referenced by computePiecesToSend(), and setTotalNbElt().

unsigned BasicBC::_llen [private]

Definition at line 51 of file BasicBC.h.

Referenced by computePiecesToSend(), getServerData(), and setDescr().

unsigned BasicBC::_lstart [private]

Definition at line 53 of file BasicBC.h.

Referenced by computePiecesToSend().

unsigned BasicBC::_nodeRank [private]

Definition at line 48 of file BasicBC.h.

Referenced by BasicBC(), computePiecesToSend(), getNodeRank(), setDescr(), and setNodeRank().

unsigned BasicBC::_sbsz [private]

Definition at line 54 of file BasicBC.h.

Referenced by computePiecesToSend().

char* BasicBC::_serverBuffer [private]

Definition at line 85 of file BasicBC.h.

Referenced by BasicBC(), getServerData(), insertData(), serverFree(), and setDescr().

Definition at line 87 of file BasicBC.h.

Referenced by BasicBC(), insertData(), and setDescr().

unsigned long BasicBC::_serverToReceived [private]

Definition at line 83 of file BasicBC.h.

Referenced by insertData(), and setDescr().


The documentation for this class was generated from the following files: