Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

PsnMultiThreadedScheduler Class Reference

class PsnMultiThreadedScheduler : uses threads to schedule the different simulation objects More...

#include <PsnMultiThreadedScheduler.h>

Inheritance diagram for PsnMultiThreadedScheduler:

Inheritance graph
[legend]
Collaboration diagram for PsnMultiThreadedScheduler:

Collaboration graph
[legend]
List of all members.

Public Methods

 PsnMultiThreadedScheduler (unsigned int numberOfSteps, unsigned int numberOfThreads, bool createThreadAndLocalSchedulers)
 constructor

virtual ~PsnMultiThreadedScheduler ()
 destructor

virtual void addToScheduable (PsnReferenceObjectHandle *ref, unsigned int when)
 redefine so that simulated objects are assigned to threads in a cyclic manner

virtual void addToScheduable (PsnReferenceObjectHandle *ref, unsigned int when, unsigned int whichThread)
 add a simulated object to a specific thread

virtual void removeFromScheduable (PsnReferenceObjectHandle *ref)
 redefine to remove the simulated object from schedulers local to a thread

virtual void schedule (PsnReferenceObjectHandle *ref)
 mark a scheduable object as active

virtual void unschedule (PsnReferenceObjectHandle *ref)
 mark a scheduable object as inactive

virtual void runStep (unsigned int which)
 run a simulation step

virtual void run (unsigned int whichFrameScheduler)
 run one of the local frame schedulers ( called by the thread container function


Static Protected Methods

void * _threadContainer (void *)
 used to start threads


Protected Attributes

unsigned int _currentStep
 the shared simulation step number

unsigned int _numberOfThreads
 the number of threads

vector< PsnScheduler * > * _localSchedulers
 for each thread, a local frame scheduler is created

PsnScheduler_duplicatedObjectScheduler
 a specific scheduler is created for duplicated objects

PsnBarrier_barrier
 the synchronisation barrier between al lthe threads

unsigned int _nextThreadForScheduling
 cycles through all threads, for cyclic alloaction of simulated objects to threads

map< PsnReferenceObjectHandle *,
unsigned int > 
_whichThread
 remember to wich thread a simulated object was assigned

pthread_t * _threadIds
 store the thread ids

itimerval * _profilingTimer
 store timer used for profiling (with the -pg option of gcc)

vector< pair< PsnScheduler *,
unsigned int > * > * 
_threadData
 store for each created thread, a pointer to the scheduler and thread specific data

long ** _localWaitingTimes
 used to bench waiting times if _BENCHWAITINGTIMES is defined

int _numberOfSamples
 used to bench waiting times if _BENCHWAITINGTIMES is defined


Detailed Description

class PsnMultiThreadedScheduler : uses threads to schedule the different simulation objects

Author:
David Margery
Version:
:

Definition at line 36 of file PsnMultiThreadedScheduler.h.


Constructor & Destructor Documentation

PsnMultiThreadedScheduler::PsnMultiThreadedScheduler unsigned int    numberOfSteps,
unsigned int    numberOfThreads,
bool    createThreadAndLocalSchedulers
 

constructor

Parameters:
numberOfSteps number of simulation steps in a simualtion cycle
numberOfThreads number of threads to create to simulata each step
createThreadAndLocalSchedulers if false, no threads are created (enables redefintion)

Definition at line 31 of file PsnMultiThreadedScheduler.cxx.

References _barrier, _duplicatedObjectScheduler, _localSchedulers, _numberOfThreads, _profilingTimer, _threadContainer(), _threadData, _threadIds, and PsController::error().

00031                                                                                                                                                     :
00032    PsnScheduler(numberOfSteps),
00033    _numberOfThreads(numberOfThreads),
00034    _currentStep ( 0 ),
00035    _nextThreadForScheduling ( 0 )
00036 {
00037 
00038    _barrier = new PsnBarrier ( _numberOfThreads + 1) ;
00039 
00040    _threadIds = new pthread_t [ _numberOfThreads ] ;
00041 
00042    //onlu used when profiling
00043    _profilingTimer = new itimerval  [ _numberOfThreads ] ;
00044 
00045    _threadData = new vector <pair<PsnScheduler *, unsigned int> * > ( _numberOfThreads ) ;
00046 
00047    for (int i = 0 ; i < _numberOfThreads ; i++ ) 
00048       {
00049          (*_threadData)[i] = new pair<PsnScheduler *, unsigned int> (this, i) ;
00050 
00051          // get the data associated to the timer used for profiling
00052          getitimer(ITIMER_PROF, &(_profilingTimer[i] ));
00053       }
00054 
00055 
00056    _localSchedulers = new vector <PsnScheduler *> ( _numberOfThreads ) ;
00057 
00058    int ret;
00059 
00060 #ifdef _SGI
00061    //for better use of the cpus available
00062    pthread_setconcurrency(_numberOfThreads) ;
00063 #endif
00064 
00065    if ( createThreadAndLocalSchedulers )
00066       {
00067          
00068          _duplicatedObjectScheduler = new PsnFrameScheduler( numberOfSteps ) ;
00069          
00070          for (int i = 0 ; i < _numberOfThreads ; i++ ) 
00071             {
00072                (*_localSchedulers)[i] = new PsnFrameScheduler( numberOfSteps ) ;
00073             }
00074             
00075          for (int i = 0 ; i < _numberOfThreads ; i++ ) 
00076             {
00077                ret = pthread_create( & (_threadIds [i]), 
00078                                      0,
00079                                      (void *(*)(void *))_threadContainer,
00080                                      (*_threadData)[i]);
00081                if (ret) 
00082                   {
00083                      PsController::error("Thread creation impossible") ;
00084                   }
00085                
00086             }
00087       }
00088 }

PsnMultiThreadedScheduler::~PsnMultiThreadedScheduler   [virtual]
 

destructor

Definition at line 91 of file PsnMultiThreadedScheduler.cxx.

References _barrier, _duplicatedObjectScheduler, _localSchedulers, _numberOfThreads, _profilingTimer, _threadData, and _threadIds.

00091                                                       {
00092    
00093 
00094    for (int i = 0 ; i < _numberOfThreads ; i++ ) {
00095       
00096       delete (*_localSchedulers)[i] ;
00097       
00098       delete (*_threadData)[i] ;
00099 
00100    }
00101 
00102    delete _profilingTimer ;
00103 
00104    delete _localSchedulers ;
00105 
00106    delete _barrier ;
00107 
00108    delete [] _threadIds ;
00109 
00110    delete _threadData ;
00111 
00112    delete _duplicatedObjectScheduler ;
00113 }


Member Function Documentation

void * PsnMultiThreadedScheduler::_threadContainer void *    [static, protected]
 

used to start threads

Reimplemented in PsnMultiThreadedBenchedScheduler.

Definition at line 231 of file PsnMultiThreadedScheduler.cxx.

References PsnMemoryManager::allocateSizeRemembered(), HeapStackTop::getSystemMemoryManager(), and PsnMemoryManager::init().

Referenced by PsnMultiThreadedScheduler().

00232 {
00233    // install the memory managers
00234    HeapStackTop systemMemoryManager ( HeapStackTop::getSystemMemoryManager() ) ;
00235   
00236    PsnMemoryManager * currentMemoryManager = HeapStackTop::getSystemMemoryManager() ;
00237 
00238    assert ( currentMemoryManager != 0 ) ;
00239 
00240    size_t initialAllocatatedMemory = 1024 * 1024 ;
00241 
00242    void * startMemory = currentMemoryManager->allocateSizeRemembered ( initialAllocatatedMemory ) ;
00243 
00244    PsnDescriptorMemoryManager * descriptorMemoryManager = new PsnDescriptorMemoryManager ( *currentMemoryManager ) ;
00245 
00246    descriptorMemoryManager->init() ;
00247    
00248    PsnThreadMemoryManager * memoryManagerForThisThread ;
00249    
00250    memoryManagerForThisThread = new PsnThreadMemoryManager ( startMemory, 
00251                                                              initialAllocatatedMemory,
00252                                                              *currentMemoryManager,
00253                                                              *descriptorMemoryManager ) ;
00254    memoryManagerForThisThread -> init() ;
00255 
00256    HeapStackTop allocationContextForThisThread ( memoryManagerForThisThread ) ;
00257 
00258 
00259    // get the data specific to this thread
00260    pair<PsnMultiThreadedScheduler *, unsigned int> * threadData = ( pair<PsnMultiThreadedScheduler *, unsigned int> * ) myThreadData ;
00261 
00262    // get the eventual profiler to profile this thread
00263    setitimer(ITIMER_PROF, &(( * threadData ).first->_profilingTimer[( * threadData ).second]), NULL);
00264 
00265    cerr<<"Thread now profiled ?"<<endl;
00266 
00267    ( * threadData ).first->run( ( * threadData ).second ) ;
00268 
00269    return threadData ;
00270 }

void PsnMultiThreadedScheduler::addToScheduable PsnReferenceObjectHandle   ref,
unsigned int    when,
unsigned int    whichThread
[virtual]
 

add a simulated object to a specific thread

Definition at line 146 of file PsnMultiThreadedScheduler.cxx.

References _duplicatedObjectScheduler, addToScheduable(), and PsnScheduler::addToScheduable().

00146                                                                                                                             {
00147    //cerr<<"PsnMultiThreadedScheduler::addToScheduable"<<((PsnReferenceObjectHandle *)ref)->objetSimul()->Nom()<<endl;
00148    if (dynamic_cast<const PsDuplicatedObject *>(&((PsnReferenceObjectHandle *)ref)->getSimulatedObject())) {
00149       _duplicatedObjectScheduler->addToScheduable ( ref , when ) ;
00150    }
00151    else {
00152       (*_localSchedulers)[ whichThread ] -> addToScheduable( ref , when ) ;
00153    }
00154 
00155 }

void PsnMultiThreadedScheduler::addToScheduable PsnReferenceObjectHandle   ref,
unsigned int    when
[virtual]
 

redefine so that simulated objects are assigned to threads in a cyclic manner

Implements PsnScheduler.

Reimplemented in PsnMultiThreadedAsynchronousScheduler.

Definition at line 159 of file PsnMultiThreadedScheduler.cxx.

References _duplicatedObjectScheduler, _nextThreadForScheduling, _numberOfThreads, _whichThread, PsnScheduler::addToScheduable(), map< PsnReferenceObjectHandle *, unsigned int >::end(), map< PsnReferenceObjectHandle *, unsigned int >::find(), PsSimulatedObject::getFather(), PsObjectDescriptor::getName(), PsSimulatedObject::getObjectDescriptor(), PsSimulatedObject::getObjectHandle(), and PsnObjectHandle::getSimulatedObject().

Referenced by addToScheduable(), and PsnMultiThreadedAsynchronousScheduler::addToScheduable().

00159                                                                                                   {
00160    //cerr<<"PsnMultiThreadedScheduler::addToScheduable "<<((PsnReferenceObjectHandle *)ref)->objetSimul()->Nom()<<endl;
00161 
00162    if (dynamic_cast<const PsDuplicatedObject *>(&((PsnReferenceObjectHandle *)ref)->getSimulatedObject())) {
00163       _duplicatedObjectScheduler->addToScheduable ( ref , when ) ;
00164    }
00165    else {
00166       assert ( ref != NULL ) ;
00167       assert ( ref->getSimulatedObject().getFather () != NULL );
00168       map<PsnReferenceObjectHandle *, unsigned int>::iterator i = _whichThread.find((PsnReferenceObjectHandle *)ref->getSimulatedObject().getFather()->getObjectHandle() ) ;
00169       if ( i==_whichThread.end() ){
00170          
00171          (*_localSchedulers)[ _nextThreadForScheduling ] -> addToScheduable( ref , when ) ;
00172 #ifdef _DEBUGSCHEDULER
00173          cout<<ref->getSimulatedObject().getObjectDescriptor().getName()<< " goes to thread "<<_nextThreadForScheduling<<endl;
00174 #endif
00175          _whichThread [ ref ] = _nextThreadForScheduling ;
00176 
00177          _nextThreadForScheduling = ( _nextThreadForScheduling + 1 ) % _numberOfThreads ;
00178          
00179       }
00180       else {//schedule on the same thread as ref's father
00181          
00182          (*_localSchedulers)[ (*i).second ] -> addToScheduable( ref , when ) ;
00183 #ifdef _DEBUGSCHEDULER
00184          cout<<ref->getSimulatedObject().getObjectDescriptor().getName()<< " goes to thread "<<(*i).second<<endl;
00185 #endif
00186          
00187          _whichThread [ ref ] = (*i).second ;
00188          
00189       }
00190    }
00191 }

void PsnMultiThreadedScheduler::removeFromScheduable PsnReferenceObjectHandle   ref [virtual]
 

redefine to remove the simulated object from schedulers local to a thread

Implements PsnScheduler.

Reimplemented in PsnMultiThreadedAsynchronousScheduler.

Definition at line 195 of file PsnMultiThreadedScheduler.cxx.

References _duplicatedObjectScheduler, _whichThread, and PsnScheduler::removeFromScheduable().

Referenced by PsnMultiThreadedAsynchronousScheduler::removeFromScheduable().

00195                                                                                     {
00196 
00197    if (dynamic_cast<const PsDuplicatedObject *>(&((PsnReferenceObjectHandle *)ref)->getSimulatedObject())) {
00198       _duplicatedObjectScheduler->removeFromScheduable ( ref ) ;
00199    }
00200    else {
00201       (*_localSchedulers) [ _whichThread [ ref ] ] ->removeFromScheduable (ref ) ;
00202    }
00203 }

void PsnMultiThreadedScheduler::run unsigned int    whichFrameScheduler [virtual]
 

run one of the local frame schedulers ( called by the thread container function

Reimplemented in PsnMultiThreadedBenchedScheduler.

Definition at line 273 of file PsnMultiThreadedScheduler.cxx.

References _barrier, _currentStep, and PsnBarrier::Sync().

00274 {
00275 
00276    while ( true ) {
00277       
00278       _barrier->Sync() ;
00279       
00280 
00281       (*_localSchedulers)[ whichFrameScheduler ]->runStep ( _currentStep ) ;
00282 
00283 
00284       _barrier->Sync() ;
00285 
00286 
00287    }
00288 }

void PsnMultiThreadedScheduler::runStep unsigned int    which [virtual]
 

run a simulation step

Implements PsnScheduler.

Reimplemented in PsnMultiThreadedAsynchronousScheduler, and PsnMultiThreadedBenchedScheduler.

Definition at line 117 of file PsnMultiThreadedScheduler.cxx.

References _barrier, _currentStep, _duplicatedObjectScheduler, _numberOfThreads, PsnThreadMemoryManager::freeLeakedMemoryBlocks(), PsnScheduler::runStep(), and PsnBarrier::Sync().

Referenced by PsnMultiThreadedBenchedScheduler::runStep(), and PsnMultiThreadedAsynchronousScheduler::runStep().

00118 {
00119 
00120    _currentStep = which ;
00121 
00122    _duplicatedObjectScheduler->runStep (which) ;
00123 
00124 #if defined (_DEBUGSCHEDULER)   
00125    cerr<<"Execution par block pour debug "<<endl;
00126    for ( int i = 0 ; i < _numberOfThreads ; i++ ) {
00127       cerr<<"Lot "<<i<<" ***********************************"<<endl;
00128       (*_localSchedulers)[ i ]->runStep (which) ;
00129    }
00130 #else
00131    // let the thread do their work
00132    _barrier->Sync() ;
00133 
00134 
00135    // wait for the threads to finish their work
00136    _barrier->Sync() ;
00137    //let the controller do it's work
00138 
00139    //purge the memory manager from memory that couldn't be freed efficiently
00140    PsnThreadMemoryManager::freeLeakedMemoryBlocks() ;
00141 #endif
00142 }

void PsnMultiThreadedScheduler::schedule PsnReferenceObjectHandle   ref [virtual]
 

mark a scheduable object as active

Implements PsnScheduler.

Reimplemented in PsnMultiThreadedAsynchronousScheduler.

Definition at line 207 of file PsnMultiThreadedScheduler.cxx.

References _duplicatedObjectScheduler, _whichThread, and PsnScheduler::schedule().

Referenced by PsnMultiThreadedAsynchronousScheduler::schedule().

00207                                                                        {
00208 
00209    if (dynamic_cast<const PsDuplicatedObject *>(&((PsnReferenceObjectHandle *)ref)->getSimulatedObject())) {
00210       _duplicatedObjectScheduler->schedule ( ref ) ;
00211    }
00212    else {
00213       (*_localSchedulers) [ _whichThread [ ref ] ] -> schedule (ref) ;
00214    }
00215 }

void PsnMultiThreadedScheduler::unschedule PsnReferenceObjectHandle   ref [virtual]
 

mark a scheduable object as inactive

Implements PsnScheduler.

Reimplemented in PsnMultiThreadedAsynchronousScheduler.

Definition at line 219 of file PsnMultiThreadedScheduler.cxx.

References _duplicatedObjectScheduler, _whichThread, and PsnScheduler::unschedule().

Referenced by PsnMultiThreadedAsynchronousScheduler::unschedule().

00219                                                                          {
00220 
00221    if (dynamic_cast<const PsDuplicatedObject *>(&((PsnReferenceObjectHandle *)ref)->getSimulatedObject())) {
00222       _duplicatedObjectScheduler->unschedule ( ref ) ;
00223    }
00224    else {
00225       (*_localSchedulers) [ _whichThread [ ref ] ] -> unschedule (ref) ;
00226    }
00227 }


Member Data Documentation

PsnBarrier* PsnMultiThreadedScheduler::_barrier [protected]
 

the synchronisation barrier between al lthe threads

Definition at line 88 of file PsnMultiThreadedScheduler.h.

Referenced by PsnMultiThreadedScheduler(), run(), PsnMultiThreadedBenchedScheduler::run(), runStep(), and ~PsnMultiThreadedScheduler().

unsigned int PsnMultiThreadedScheduler::_currentStep [protected]
 

the shared simulation step number

Definition at line 76 of file PsnMultiThreadedScheduler.h.

Referenced by run(), PsnMultiThreadedBenchedScheduler::run(), and runStep().

PsnScheduler* PsnMultiThreadedScheduler::_duplicatedObjectScheduler [protected]
 

a specific scheduler is created for duplicated objects

Definition at line 85 of file PsnMultiThreadedScheduler.h.

Referenced by addToScheduable(), PsnMultiThreadedBenchedScheduler::PsnMultiThreadedBenchedScheduler(), PsnMultiThreadedScheduler(), removeFromScheduable(), runStep(), schedule(), unschedule(), and ~PsnMultiThreadedScheduler().

vector<PsnScheduler * >* PsnMultiThreadedScheduler::_localSchedulers [protected]
 

for each thread, a local frame scheduler is created

Definition at line 82 of file PsnMultiThreadedScheduler.h.

Referenced by PsnMultiThreadedScheduler(), and ~PsnMultiThreadedScheduler().

long* * PsnMultiThreadedScheduler::_localWaitingTimes [protected]
 

used to bench waiting times if _BENCHWAITINGTIMES is defined

Reimplemented in PsnMultiThreadedBenchedScheduler.

Definition at line 106 of file PsnMultiThreadedScheduler.h.

unsigned int PsnMultiThreadedScheduler::_nextThreadForScheduling [protected]
 

cycles through all threads, for cyclic alloaction of simulated objects to threads

Definition at line 91 of file PsnMultiThreadedScheduler.h.

Referenced by addToScheduable().

int PsnMultiThreadedScheduler::_numberOfSamples [protected]
 

used to bench waiting times if _BENCHWAITINGTIMES is defined

Reimplemented in PsnMultiThreadedBenchedScheduler.

Definition at line 109 of file PsnMultiThreadedScheduler.h.

unsigned int PsnMultiThreadedScheduler::_numberOfThreads [protected]
 

the number of threads

Definition at line 79 of file PsnMultiThreadedScheduler.h.

Referenced by addToScheduable(), PsnMultiThreadedBenchedScheduler::PsnMultiThreadedBenchedScheduler(), PsnMultiThreadedScheduler(), runStep(), PsnMultiThreadedBenchedScheduler::~PsnMultiThreadedBenchedScheduler(), and ~PsnMultiThreadedScheduler().

itimerval* PsnMultiThreadedScheduler::_profilingTimer [protected]
 

store timer used for profiling (with the -pg option of gcc)

Definition at line 100 of file PsnMultiThreadedScheduler.h.

Referenced by PsnMultiThreadedScheduler(), and ~PsnMultiThreadedScheduler().

vector<pair<PsnScheduler *, unsigned int> * >* PsnMultiThreadedScheduler::_threadData [protected]
 

store for each created thread, a pointer to the scheduler and thread specific data

Definition at line 103 of file PsnMultiThreadedScheduler.h.

Referenced by PsnMultiThreadedBenchedScheduler::PsnMultiThreadedBenchedScheduler(), PsnMultiThreadedScheduler(), and ~PsnMultiThreadedScheduler().

pthread_t* PsnMultiThreadedScheduler::_threadIds [protected]
 

store the thread ids

Definition at line 97 of file PsnMultiThreadedScheduler.h.

Referenced by PsnMultiThreadedBenchedScheduler::PsnMultiThreadedBenchedScheduler(), PsnMultiThreadedScheduler(), and ~PsnMultiThreadedScheduler().

map<PsnReferenceObjectHandle *, unsigned int> PsnMultiThreadedScheduler::_whichThread [protected]
 

remember to wich thread a simulated object was assigned

Definition at line 94 of file PsnMultiThreadedScheduler.h.

Referenced by addToScheduable(), removeFromScheduable(), schedule(), and unschedule().


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

Documentation generated on Mon Nov 25 15:26:14 2002

Generated with doxygen 1.2.12 by Dimitri van Heesch ,   1997-2001