#include <PsnMultiThreadedScheduler.h>
Inheritance diagram for PsnMultiThreadedScheduler:


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 | |
Definition at line 36 of file PsnMultiThreadedScheduler.h.
|
||||||||||||||||
|
constructor
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 } |
|
|
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 }
|
|
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
the synchronisation barrier between al lthe threads
Definition at line 88 of file PsnMultiThreadedScheduler.h. Referenced by PsnMultiThreadedScheduler(), run(), PsnMultiThreadedBenchedScheduler::run(), runStep(), and ~PsnMultiThreadedScheduler(). |
|
|
the shared simulation step number
Definition at line 76 of file PsnMultiThreadedScheduler.h. Referenced by run(), PsnMultiThreadedBenchedScheduler::run(), and runStep(). |
|
|
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(). |
|
|
for each thread, a local frame scheduler is created
Definition at line 82 of file PsnMultiThreadedScheduler.h. Referenced by PsnMultiThreadedScheduler(), and ~PsnMultiThreadedScheduler(). |
|
|
used to bench waiting times if _BENCHWAITINGTIMES is defined
Reimplemented in PsnMultiThreadedBenchedScheduler. Definition at line 106 of file PsnMultiThreadedScheduler.h. |
|
|
cycles through all threads, for cyclic alloaction of simulated objects to threads
Definition at line 91 of file PsnMultiThreadedScheduler.h. Referenced by addToScheduable(). |
|
|
used to bench waiting times if _BENCHWAITINGTIMES is defined
Reimplemented in PsnMultiThreadedBenchedScheduler. Definition at line 109 of file PsnMultiThreadedScheduler.h. |
|
|
the number of threads
Definition at line 79 of file PsnMultiThreadedScheduler.h. Referenced by addToScheduable(), PsnMultiThreadedBenchedScheduler::PsnMultiThreadedBenchedScheduler(), PsnMultiThreadedScheduler(), runStep(), PsnMultiThreadedBenchedScheduler::~PsnMultiThreadedBenchedScheduler(), and ~PsnMultiThreadedScheduler(). |
|
|
store timer used for profiling (with the -pg option of gcc)
Definition at line 100 of file PsnMultiThreadedScheduler.h. Referenced by PsnMultiThreadedScheduler(), and ~PsnMultiThreadedScheduler(). |
|
|
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(). |
|
|
store the thread ids
Definition at line 97 of file PsnMultiThreadedScheduler.h. Referenced by PsnMultiThreadedBenchedScheduler::PsnMultiThreadedBenchedScheduler(), PsnMultiThreadedScheduler(), and ~PsnMultiThreadedScheduler(). |
|
|
remember to wich thread a simulated object was assigned
Definition at line 94 of file PsnMultiThreadedScheduler.h. Referenced by addToScheduable(), removeFromScheduable(), schedule(), and unschedule(). |
| Documentation generated on Mon Nov 25 15:26:14 2002 |
Generated with doxygen 1.2.12 by Dimitri van Heesch , 1997-2001 |